From 85d8f673f90803d1694bb6d386a38530696fb8d8 Mon Sep 17 00:00:00 2001 From: FastTrackML CI Date: Fri, 23 Aug 2024 19:59:46 +0000 Subject: [PATCH] Import Aim UI v3.19.3 --- src/.editorconfig | 2 + src/.eslintrc | 142 + src/.gitignore | 27 + src/.prettierrc | 13 + src/.storybook/main.js | 10 + src/.storybook/preview-body.html | 10 + src/.storybook/preview-head.html | 34 + src/.storybook/preview.js | 9 + src/aim_ui/VERSION | 1 + src/aim_ui/__init__.py | 0 src/aim_ui/build | 1 + src/config-overrides.js | 56 + src/package-lock.json | 66363 ++++++++++++++++ src/package.json | 183 + src/public/assets/icomoon/fonts/icomoon.eot | Bin 0 -> 41164 bytes src/public/assets/icomoon/fonts/icomoon.svg | 150 + src/public/assets/icomoon/fonts/icomoon.ttf | Bin 0 -> 41000 bytes src/public/assets/icomoon/fonts/icomoon.woff | Bin 0 -> 41076 bytes src/public/assets/icomoon/icomoonIcons.css | 447 + src/public/assets/icomoon/selection.json | 1 + .../assets/inconsolata/fonts/Inconsolata.ttf | Bin 0 -> 338540 bytes src/public/assets/inconsolata/inconsolata.css | 6 + src/public/assets/inter/fonts/Inter.ttf | Bin 0 -> 803384 bytes src/public/assets/inter/inter.css | 6 + src/public/favicon.ico | Bin 0 -> 4286 bytes src/public/index.html | 235 + src/public/manifest.json | 15 + src/public/robots.txt | 3 + src/setup.py | 35 + src/src/App.scss | 27 + src/src/App.test.tsx | 13 + src/src/App.tsx | 90 + src/src/assets/experiments.svg | 15 + src/src/assets/icons/arrow-up.svg | 38 + src/src/assets/icons/debug.svg | 18 + src/src/assets/icons/discord.svg | 3 + src/src/assets/icons/github.svg | 3 + src/src/assets/icons/notifications/error.svg | 3 + src/src/assets/icons/notifications/info.svg | 3 + .../assets/icons/notifications/success.svg | 3 + .../assets/icons/notifications/warning.svg | 3 + src/src/assets/icons/slack.svg | 10 + .../assets/illustrations/emptyBookmarks.svg | 65 + src/src/assets/illustrations/emptySearch.svg | 36 + src/src/assets/illustrations/exploreData.svg | 89 + src/src/assets/illustrations/wrongSearch.svg | 38 + src/src/assets/logo.svg | 29 + src/src/assets/polka-dots.svg | 21 + src/src/assets/runs.svg | 15 + .../AggregationPopover.scss | 13 + .../AggregationPopover/AggregationPopover.tsx | 148 + src/src/components/AppBar/AppBar.scss | 28 + src/src/components/AppBar/AppBar.tsx | 45 + .../AttachedTagsList/AttachedTagsList.scss | 115 + .../AttachedTagsList/AttachedTagsList.tsx | 160 + .../AutocompleteInput/AutocompleteInput.d.ts | 24 + .../AutocompleteInput/AutocompleteInput.scss | 110 + .../AutocompleteInput/AutocompleteInput.tsx | 284 + src/src/components/AutocompleteInput/index.ts | 5 + .../AxesPropsPopover/AxesPropsPopover.d.ts | 27 + .../AxesPropsPopover/AxesPropsPopover.scss | 49 + .../AxesPropsPopover/AxesPropsPopover.tsx | 310 + src/src/components/AxesPropsPopover/config.ts | 27 + src/src/components/AxesPropsPopover/index.ts | 7 + .../AxesScalePopover/AxesScalePopover.scss | 17 + .../AxesScalePopover/AxesScalePopover.tsx | 66 + .../components/BookmarkForm/BookmarkForm.tsx | 105 + .../BusyLoaderWrapper/BusyLoaderWrapper.scss | 5 + .../BusyLoaderWrapper/BusyLoaderWrapper.tsx | 50 + .../components/ChartLoader/ChartLoader.scss | 34 + .../components/ChartLoader/ChartLoader.tsx | 37 + .../ChartPanel/ChartGrid/ChartGrid.d.ts | 19 + .../ChartPanel/ChartGrid/ChartGrid.scss | 7 + .../ChartPanel/ChartGrid/ChartGrid.tsx | 63 + .../components/ChartPanel/ChartGrid/index.ts | 5 + .../ChartPanel/ChartLegends/ChartLegends.d.ts | 9 + .../ChartPanel/ChartLegends/ChartLegends.scss | 25 + .../ChartPanel/ChartLegends/ChartLegends.tsx | 40 + .../ChartPanel/ChartLegends/index.ts | 5 + src/src/components/ChartPanel/ChartPanel.scss | 30 + src/src/components/ChartPanel/ChartPanel.tsx | 235 + .../ChartPanel/ChartPopover/ChartPopover.scss | 35 + .../ChartPanel/ChartPopover/ChartPopover.tsx | 179 + .../ChartPanel/ChartPopover/index.ts | 3 + .../PopoverContent/PopoverContent.scss | 170 + .../PopoverContent/PopoverContent.tsx | 431 + src/src/components/ChartPanel/config.ts | 11 + .../Charts/ScatterPlot/Axis/Axis.tsx | 45 + .../Charts/ScatterPlot/Circles/Circles.tsx | 44 + .../Charts/ScatterPlot/ScatterPlot.tsx | 122 + .../components/Charts/ScatterPlot/config.ts | 5 + .../components/Charts/ScatterPlot/styles.scss | 4 + .../components/Charts/ScatterPlot/types.d.ts | 37 + src/src/components/Charts/ScatterPlot/util.ts | 16 + .../Charts/ScatterPlot/withResize.tsx | 47 + src/src/components/CodeBlock/CodeBlock.scss | 30 + src/src/components/CodeBlock/CodeBlock.tsx | 40 + .../CommunityPopup/CommunityPopup.d.ts | 5 + .../CommunityPopup/CommunityPopup.scss | 60 + .../CommunityPopup/CommunityPopup.tsx | 109 + src/src/components/CommunityPopup/index.tsx | 5 + .../components/ConfirmModal/ConfirmModal.scss | 90 + .../components/ConfirmModal/ConfirmModal.tsx | 106 + .../ContributionsFeed/ContributionsFeed.d.ts | 8 + .../ContributionsFeed/ContributionsFeed.scss | 16 + .../ContributionsFeed/ContributionsFeed.tsx | 63 + .../ContributionsFeed/FeedItem/FeedItem.d.ts | 49 + .../ContributionsFeed/FeedItem/FeedItem.scss | 92 + .../ContributionsFeed/FeedItem/FeedItem.tsx | 78 + .../ContributionsFeed/FeedItem/index.ts | 4 + src/src/components/ContributionsFeed/index.ts | 5 + .../ControlPopover/ControlPopover.scss | 55 + .../ControlPopover/ControlPopover.tsx | 90 + src/src/components/ControlPopover/index.ts | 3 + .../CopyToClipBoard/CopyToClipBoard.tsx | 47 + src/src/components/CustomTable/Table.scss | 625 + src/src/components/CustomTable/Table.tsx | 603 + src/src/components/CustomTable/TableCell.tsx | 97 + .../components/CustomTable/TableColumn.tsx | 1057 + .../components/CustomTable/TablePopover.tsx | 160 + .../DepthDropdown/DepthDropdown.d.ts | 6 + .../DepthDropdown/DepthDropdown.scss | 36 + .../DepthDropdown/DepthDropdown.tsx | 116 + src/src/components/DepthDropdown/index.tsx | 5 + .../components/DepthSlider/DepthSlider.d.ts | 12 + .../components/DepthSlider/DepthSlider.scss | 24 + .../components/DepthSlider/DepthSlider.tsx | 83 + src/src/components/DepthSlider/index.tsx | 5 + .../ErrorBoundary/ErrorBoundary.tsx | 40 + src/src/components/ErrorBoundary/index.ts | 3 + .../ExperimentNameBox/ExperimentNameBox.d.ts | 5 + .../ExperimentNameBox/ExperimentNameBox.scss | 11 + .../ExperimentNameBox/ExperimentNameBox.tsx | 37 + src/src/components/ExperimentNameBox/index.ts | 5 + .../ExportPreview/ExportPreview.d.ts | 21 + .../ExportPreview/ExportPreview.scss | 126 + .../ExportPreview/ExportPreview.tsx | 429 + src/src/components/ExportPreview/config.ts | 25 + src/src/components/ExportPreview/index.tsx | 5 + .../GroupConfigPopover.scss | 15 + .../GroupConfigPopover/GroupConfigPopover.tsx | 52 + src/src/components/Grouping/Grouping.scss | 21 + src/src/components/Grouping/Grouping.tsx | 83 + .../components/GroupingItem/GroupingItem.scss | 57 + .../components/GroupingItem/GroupingItem.tsx | 79 + .../GroupingPopover/GroupingPopover.scss | 94 + .../GroupingPopover/GroupingPopover.tsx | 227 + src/src/components/HeatMap/HeatMap.tsx | 235 + src/src/components/HeatMap/HeatMapStyle.scss | 103 + src/src/components/HighPlot/HighPlot.scss | 148 + src/src/components/HighPlot/HighPlot.tsx | 275 + .../HighlightModePopover.scss | 5 + .../HighlightModesPopover.tsx | 53 + .../components/Illustration/Illustration.d.ts | 16 + .../components/Illustration/Illustration.scss | 65 + .../components/Illustration/Illustration.tsx | 64 + src/src/components/Illustration/config.tsx | 65 + src/src/components/Illustration/index.ts | 6 + .../IllustrationBlock/IllustrationBlock.scss | 105 + .../IllustrationBlock/IllustrationBlock.tsx | 74 + .../ImageFullViewPopover.tsx | 72 + .../components/ImageFullViewPopover/index.ts | 6 + .../ImageFullViewPopover/styles.scss | 64 + .../ImageFullViewPopover/types.d.ts | 11 + .../ImagePropertiesPopover.d.ts | 8 + .../ImagePropertiesPopover.scss | 55 + .../ImagePropertiesPopover.tsx | 134 + .../ImagePropertiesPopover/index.ts | 5 + src/src/components/LineChart/LineChart.scss | 160 + src/src/components/LineChart/LineChart.tsx | 330 + .../LiveUpdateSettings.scss | 10 + .../LiveUpdateSettings/LiveUpdateSettings.tsx | 36 + src/src/components/MediaList/ImageBox.tsx | 183 + src/src/components/MediaList/MediaList.d.ts | 38 + src/src/components/MediaList/MediaList.scss | 0 src/src/components/MediaList/MediaList.tsx | 132 + src/src/components/MediaList/index.ts | 4 + src/src/components/MediaPanel/MediaPanel.d.ts | 45 + src/src/components/MediaPanel/MediaPanel.scss | 51 + src/src/components/MediaPanel/MediaPanel.tsx | 360 + src/src/components/MediaPanel/config.ts | 6 + src/src/components/MediaPanel/index.ts | 4 + src/src/components/MediaSet/MediaSet.d.ts | 30 + src/src/components/MediaSet/MediaSet.scss | 152 + src/src/components/MediaSet/MediaSet.tsx | 437 + .../NameAndDescriptionCard.d.ts | 6 + .../NameAndDescriptionCard.scss | 106 + .../NameAndDescriptionCard.tsx | 96 + .../NameAndDescriptionCard/index.ts | 5 + .../NotificationContainer.d.ts | 23 + .../NotificationContainer.scss | 47 + .../NotificationContainer.tsx | 66 + .../NotificationContainerStore.ts | 28 + .../components/NotificationContainer/index.ts | 7 + .../useNotificationContainer.tsx | 19 + .../components/ProgressBar/ProgressBar.d.ts | 8 + .../components/ProgressBar/ProgressBar.scss | 101 + .../components/ProgressBar/ProgressBar.tsx | 88 + .../ProjectWrapper/ProjectWrapper.tsx | 21 + src/src/components/RangePanel/RangePanel.d.ts | 33 + src/src/components/RangePanel/RangePanel.scss | 50 + src/src/components/RangePanel/RangePanel.tsx | 110 + src/src/components/RangePanel/index.tsx | 5 + .../ReleaseNoteItem/ReleaseNoteItem.d.ts | 20 + .../ReleaseNoteItem/ReleaseNoteItem.scss | 45 + .../ReleaseNoteItem/ReleaseNoteItem.tsx | 23 + .../ResizeElement/ResizableElement.d.ts | 8 + .../ResizeElement/ResizableElement.tsx | 40 + .../ResizeElement/ResizeElement.d.ts | 31 + .../ResizeElement/ResizeElement.scss | 49 + .../ResizeElement/ResizeElement.tsx | 234 + src/src/components/ResizeElement/context.ts | 7 + src/src/components/ResizeElement/index.ts | 16 + .../ResizeModeActions/ResizeModeActions.scss | 23 + .../ResizeModeActions/ResizeModeActions.tsx | 56 + .../components/ResizePanel/ResizePanel.scss | 28 + .../components/ResizePanel/ResizePanel.tsx | 42 + .../ResizingFallback/ResizingFallback.scss | 16 + .../ResizingFallback/ResizingFallback.tsx | 17 + src/src/components/ResizingFallback/index.ts | 3 + .../RouteLeavingGuard/RouteLeavingGuard.d.ts | 5 + .../RouteLeavingGuard/RouteLeavingGuard.tsx | 84 + src/src/components/RouteLeavingGuard/index.ts | 5 + .../components/ScatterPlot/ScatterPlot.tsx | 274 + src/src/components/ScatterPlot/index.ts | 6 + src/src/components/ScatterPlot/styles.scss | 98 + src/src/components/ScatterPlot/types.d.ts | 33 + src/src/components/SelectTag/SelectTag.scss | 87 + src/src/components/SelectTag/SelectTag.tsx | 245 + src/src/components/SideBar/SideBar.tsx | 120 + src/src/components/SideBar/Sidebar.scss | 105 + .../SliderWithInput/SliderWithInput.scss | 86 + .../SliderWithInput/SliderWithInput.tsx | 118 + src/src/components/SliderWithInput/index.ts | 5 + src/src/components/SliderWithInput/types.d.ts | 17 + .../SmoothingPopover/SmoothingPopover.scss | 21 + .../SmoothingPopover/SmoothingPopover.tsx | 159 + src/src/components/SplitPane/SplitPane.d.ts | 6 + src/src/components/SplitPane/SplitPane.scss | 42 + src/src/components/SplitPane/SplitPane.tsx | 93 + .../components/SplitPane/SplitPaneItem.d.ts | 7 + .../components/SplitPane/SplitPaneItem.tsx | 40 + src/src/components/SplitPane/context.ts | 7 + src/src/components/SplitPane/index.ts | 10 + .../StatisticsBar/StatisticsBar.d.ts | 20 + .../StatisticsBar/StatisticsBar.scss | 27 + .../StatisticsBar/StatisticsBar.tsx | 61 + src/src/components/StatisticsBar/index.ts | 5 + .../StatisticsCard/StatisticsCard.d.ts | 18 + .../StatisticsCard/StatisticsCard.scss | 55 + .../StatisticsCard/StatisticsCard.tsx | 96 + src/src/components/StatisticsCard/index.ts | 5 + .../components/StatusLabel/StatusLabel.tsx | 46 + src/src/components/StatusLabel/index.ts | 6 + src/src/components/StatusLabel/styles.scss | 48 + src/src/components/StatusLabel/types.d.ts | 6 + .../StepsDensityPopover.tsx | 35 + src/src/components/TabPanel/TabPanel.tsx | 30 + src/src/components/Table/ArchiveModal.tsx | 276 + src/src/components/Table/AutoResizer.tsx | 46 + src/src/components/Table/BaseTable.scss | 329 + src/src/components/Table/BaseTable.tsx | 1277 + src/src/components/Table/Column.tsx | 27 + src/src/components/Table/ColumnManager.ts | 206 + src/src/components/Table/ColumnResizer.tsx | 230 + src/src/components/Table/DeleteModal.tsx | 273 + src/src/components/Table/ExpandIcon.tsx | 62 + src/src/components/Table/GridTable.tsx | 213 + .../components/Table/GroupedColumnHeader.tsx | 47 + src/src/components/Table/RunNameColumn.tsx | 49 + src/src/components/Table/SortIndicator.tsx | 37 + src/src/components/Table/SortOrder.ts | 15 + src/src/components/Table/Table.scss | 176 + src/src/components/Table/Table.tsx | 1162 + src/src/components/Table/TableCell.tsx | 28 + src/src/components/Table/TableHeader.tsx | 74 + src/src/components/Table/TableHeaderCell.tsx | 17 + src/src/components/Table/TableHeaderRow.tsx | 47 + src/src/components/Table/TableRow.tsx | 206 + src/src/components/Table/TableSortIcons.tsx | 33 + src/src/components/Table/utils.ts | 239 + .../components/TableLoader/TableLoader.scss | 14 + .../components/TableLoader/TableLoader.tsx | 60 + src/src/components/TagForm/TagForm.scss | 85 + src/src/components/TagForm/TagForm.tsx | 238 + src/src/components/Theme/Theme.tsx | 93 + .../TooltipContentPopover.scss | 40 + .../TooltipContentPopover.tsx | 208 + .../TrendlineOptionsPopover.d.ts | 6 + .../TrendlineOptionsPopover.scss | 47 + .../TrendlineOptionsPopover.tsx | 100 + .../TrendlineOptionsPopover/index.ts | 3 + .../VisualizationLegends.d.ts | 19 + .../VisualizationLegends.scss | 25 + .../VisualizationLegends.tsx | 40 + .../components/VisualizationLegends/index.ts | 5 + .../VisualizationTooltip.d.ts | 21 + .../VisualizationTooltip.scss | 35 + .../VisualizationTooltip.tsx | 161 + .../components/VisualizationTooltip/index.ts | 5 + .../ZoomInPopover/ZoomInPopover.scss | 4 + .../ZoomInPopover/ZoomInPopover.tsx | 45 + .../ZoomOutPopover/ZoomOutPopover.scss | 4 + .../ZoomOutPopover/ZoomOutPopover.tsx | 49 + .../components/kit/ActionCard/ActionCard.d.ts | 12 + .../components/kit/ActionCard/ActionCard.scss | 20 + .../components/kit/ActionCard/ActionCard.tsx | 48 + src/src/components/kit/ActionCard/index.tsx | 4 + .../kit/AlertBanner/AlertBanner.d.ts | 15 + .../kit/AlertBanner/AlertBanner.scss | 71 + .../kit/AlertBanner/AlertBanner.tsx | 67 + src/src/components/kit/AlertBanner/config.ts | 30 + src/src/components/kit/AlertBanner/index.ts | 5 + src/src/components/kit/AudioBox/AudioBox.d.ts | 5 + src/src/components/kit/AudioBox/AudioBox.scss | 205 + src/src/components/kit/AudioBox/AudioBox.tsx | 235 + src/src/components/kit/AudioBox/index.ts | 5 + .../kit/AutoSuggestions/AutoSuggestions.d.ts | 10 + .../kit/AutoSuggestions/AutoSuggestions.scss | 35 + .../kit/AutoSuggestions/AutoSuggestions.tsx | 80 + .../components/kit/AutoSuggestions/index.ts | 4 + src/src/components/kit/Badge/Badge.d.ts | 21 + src/src/components/kit/Badge/Badge.scss | 148 + src/src/components/kit/Badge/Badge.tsx | 108 + src/src/components/kit/Badge/index.ts | 4 + src/src/components/kit/Button/Button.d.ts | 6 + src/src/components/kit/Button/Button.scss | 34 + src/src/components/kit/Button/Button.tsx | 92 + src/src/components/kit/Button/index.ts | 4 + src/src/components/kit/Card/Card.d.ts | 19 + src/src/components/kit/Card/Card.scss | 23 + src/src/components/kit/Card/Card.tsx | 65 + src/src/components/kit/Card/index.tsx | 5 + src/src/components/kit/DataList/DataList.d.ts | 18 + src/src/components/kit/DataList/DataList.scss | 93 + src/src/components/kit/DataList/DataList.tsx | 129 + .../kit/DataList/SearchBar/SearchBar.scss | 40 + .../kit/DataList/SearchBar/SearchBar.tsx | 135 + .../SearchBar/SearchInput/EndAdornment.tsx | 38 + .../SearchBar/SearchInput/SearchInput.scss | 52 + .../DataList/SearchBar/SearchInput/index.tsx | 58 + .../kit/DataList/SearchBar/index.ts | 3 + .../kit/DataList/SearchBar/types.d.ts | 44 + .../kit/DataList/SearchBar/useTextSearch.ts | 165 + src/src/components/kit/DataList/index.tsx | 5 + .../kit/DictVisualizer/DictVisualizer.d.ts | 29 + .../kit/DictVisualizer/DictVisualizer.scss | 60 + .../kit/DictVisualizer/DictVisualizer.tsx | 329 + .../components/kit/DictVisualizer/index.ts | 5 + src/src/components/kit/Dropdown/Dropdown.d.ts | 23 + src/src/components/kit/Dropdown/Dropdown.scss | 50 + src/src/components/kit/Dropdown/Dropdown.tsx | 275 + .../kit/Dropdown/DropdownCustomOption.tsx | 40 + src/src/components/kit/Dropdown/config.ts | 19 + src/src/components/kit/Dropdown/index.ts | 4 + src/src/components/kit/Icon/Icon.d.ts | 163 + src/src/components/kit/Icon/Icon.scss | 11 + src/src/components/kit/Icon/Icon.tsx | 38 + src/src/components/kit/Icon/index.ts | 4 + src/src/components/kit/Input/Input.d.ts | 54 + src/src/components/kit/Input/Input.scss | 110 + src/src/components/kit/Input/Input.test.tsx | 100 + src/src/components/kit/Input/Input.tsx | 249 + .../Input/__snapshots__/Input.test.tsx.snap | 64 + src/src/components/kit/Input/config.ts | 43 + src/src/components/kit/Input/index.tsx | 5 + .../kit/JsonViewPopover/JsonViewPopover.tsx | 34 + .../components/kit/JsonViewPopover/index.ts | 6 + .../kit/JsonViewPopover/styles.scss | 8 + .../components/kit/JsonViewPopover/types.d.ts | 7 + src/src/components/kit/ListItem/Index.ts | 5 + src/src/components/kit/ListItem/ListItem.d.ts | 11 + src/src/components/kit/ListItem/ListItem.tsx | 54 + src/src/components/kit/Menu/Menu.scss | 106 + src/src/components/kit/Menu/Menu.tsx | 69 + src/src/components/kit/Menu/MenuItem.tsx | 139 + src/src/components/kit/Menu/index.ts | 8 + src/src/components/kit/Menu/types.d.ts | 20 + src/src/components/kit/Modal/Modal.d.ts | 28 + src/src/components/kit/Modal/Modal.scss | 96 + src/src/components/kit/Modal/Modal.tsx | 107 + src/src/components/kit/Modal/index.tsx | 5 + .../kit/SelectDropdown/SelectDropdown.d.ts | 18 + .../kit/SelectDropdown/SelectDropdown.scss | 31 + .../kit/SelectDropdown/SelectDropdown.tsx | 141 + .../components/kit/SelectDropdown/index.tsx | 5 + src/src/components/kit/Slider/Slider.d.ts | 12 + src/src/components/kit/Slider/Slider.scss | 84 + src/src/components/kit/Slider/Slider.tsx | 33 + src/src/components/kit/Slider/index.ts | 5 + src/src/components/kit/Spinner/Spinner.d.ts | 7 + src/src/components/kit/Spinner/Spinner.scss | 30 + src/src/components/kit/Spinner/Spinner.tsx | 42 + src/src/components/kit/Spinner/index.tsx | 5 + src/src/components/kit/Switcher/Switcher.d.ts | 18 + src/src/components/kit/Switcher/Switcher.scss | 189 + .../components/kit/Switcher/Switcher.test.tsx | 52 + src/src/components/kit/Switcher/Switcher.tsx | 58 + .../__snapshots__/Switcher.test.tsx.snap | 25 + src/src/components/kit/Switcher/index.ts | 4 + src/src/components/kit/Test/Test.test.tsx | 27 + src/src/components/kit/Test/Test.tsx | 24 + .../kit/Test/__snapshots__/Test.test.tsx.snap | 15 + src/src/components/kit/Test/index.ts | 6 + src/src/components/kit/Test/styles.scss | 8 + src/src/components/kit/Test/types.d.ts | 3 + src/src/components/kit/Text/Text.d.ts | 41 + src/src/components/kit/Text/Text.scss | 193 + src/src/components/kit/Text/Text.tsx | 81 + src/src/components/kit/Text/index.ts | 3 + .../kit/ToggleButton/ToggleButton.d.ts | 12 + .../kit/ToggleButton/ToggleButton.scss | 25 + .../kit/ToggleButton/ToggleButton.tsx | 65 + src/src/components/kit/ToggleButton/index.ts | 4 + src/src/components/kit/index.ts | 40 + src/src/components/kit_v2/Badge/Badge.d.ts | 40 + .../components/kit_v2/Badge/Badge.style.ts | 106 + src/src/components/kit_v2/Badge/Badge.tsx | 66 + src/src/components/kit_v2/Badge/index.ts | 4 + src/src/components/kit_v2/Box/Box.d.ts | 166 + src/src/components/kit_v2/Box/Box.tsx | 84 + src/src/components/kit_v2/Box/index.ts | 4 + src/src/components/kit_v2/Button/Button.d.ts | 63 + .../components/kit_v2/Button/Button.style.ts | 74 + .../components/kit_v2/Button/Button.test.tsx | 24 + src/src/components/kit_v2/Button/Button.tsx | 76 + .../components/kit_v2/Button/buttonConfig.ts | 23 + src/src/components/kit_v2/Button/index.ts | 4 + .../kit_v2/ButtonGroup/ButtonGroup.d.ts | 3 + .../kit_v2/ButtonGroup/ButtonGroup.style.ts | 44 + .../kit_v2/ButtonGroup/ButtonGroup.tsx | 39 + .../components/kit_v2/ButtonGroup/index.ts | 4 + .../components/kit_v2/Checkbox/Checkbox.d.ts | 39 + .../kit_v2/Checkbox/Checkbox.style.ts | 95 + .../components/kit_v2/Checkbox/Checkbox.tsx | 79 + src/src/components/kit_v2/Checkbox/index.ts | 4 + .../kit_v2/ControlsButton/ControlsButton.d.ts | 45 + .../ControlsButton/ControlsButton.style.ts | 178 + .../kit_v2/ControlsButton/ControlsButton.tsx | 83 + .../components/kit_v2/ControlsButton/index.ts | 4 + src/src/components/kit_v2/Dialog/Dialog.d.ts | 50 + .../components/kit_v2/Dialog/Dialog.style.ts | 68 + .../components/kit_v2/Dialog/Dialog.test.tsx | 36 + src/src/components/kit_v2/Dialog/Dialog.tsx | 114 + src/src/components/kit_v2/Dialog/index.ts | 4 + src/src/components/kit_v2/Icon/Icon.d.ts | 49 + src/src/components/kit_v2/Icon/Icon.style.ts | 36 + src/src/components/kit_v2/Icon/Icon.test.tsx | 30 + src/src/components/kit_v2/Icon/Icon.tsx | 40 + .../Icon/__snapshots__/Icon.test.tsx.snap | 48 + src/src/components/kit_v2/Icon/index.ts | 4 + .../kit_v2/IconButton/IconButton.d.ts | 47 + .../kit_v2/IconButton/IconButton.style.ts | 43 + .../kit_v2/IconButton/IconButton.test.tsx | 22 + .../kit_v2/IconButton/IconButton.tsx | 54 + .../__snapshots__/IconButton.test.tsx.snap | 14 + src/src/components/kit_v2/IconButton/index.ts | 4 + src/src/components/kit_v2/Input/Input.d.ts | 45 + .../components/kit_v2/Input/Input.style.ts | 197 + src/src/components/kit_v2/Input/Input.tsx | 132 + src/src/components/kit_v2/Input/index.ts | 4 + .../components/kit_v2/ListItem/ListItem.d.ts | 56 + .../kit_v2/ListItem/ListItem.style.ts | 39 + .../components/kit_v2/ListItem/ListItem.tsx | 49 + src/src/components/kit_v2/ListItem/index.ts | 4 + .../components/kit_v2/Popover/Popover.d.ts | 33 + .../kit_v2/Popover/Popover.style.ts | 50 + src/src/components/kit_v2/Popover/Popover.tsx | 56 + src/src/components/kit_v2/Popover/index.ts | 3 + .../kit_v2/QueryBadge/QueryBadge.d.ts | 29 + .../kit_v2/QueryBadge/QueryBadge.style.ts | 9 + .../kit_v2/QueryBadge/QueryBadge.tsx | 73 + src/src/components/kit_v2/QueryBadge/index.ts | 4 + src/src/components/kit_v2/Radio/Radio.d.ts | 19 + .../components/kit_v2/Radio/Radio.style.ts | 85 + src/src/components/kit_v2/Radio/Radio.tsx | 53 + src/src/components/kit_v2/Radio/index.ts | 4 + src/src/components/kit_v2/Select/Select.d.ts | 123 + .../components/kit_v2/Select/Select.test.tsx | 36 + src/src/components/kit_v2/Select/Select.tsx | 200 + .../components/kit_v2/Select/SelectItem.tsx | 67 + src/src/components/kit_v2/Select/index.ts | 4 + .../kit_v2/Separator/Separator.d.ts | 26 + .../kit_v2/Separator/Separator.style.ts | 8 + .../kit_v2/Separator/Separator.test.tsx | 40 + .../components/kit_v2/Separator/Separator.tsx | 42 + .../__snapshots__/Separator.test.tsx.snap | 12 + src/src/components/kit_v2/Separator/index.ts | 4 + src/src/components/kit_v2/Slider/Slider.d.ts | 10 + .../components/kit_v2/Slider/Slider.style.ts | 118 + .../components/kit_v2/Slider/Slider.test.tsx | 60 + src/src/components/kit_v2/Slider/Slider.tsx | 111 + .../Slider/__snapshots__/Slider.test.tsx.snap | 533 + src/src/components/kit_v2/Slider/index.ts | 4 + src/src/components/kit_v2/Switch/Switch.d.ts | 32 + .../components/kit_v2/Switch/Switch.style.ts | 98 + src/src/components/kit_v2/Switch/Switch.tsx | 62 + src/src/components/kit_v2/Switch/index.ts | 4 + src/src/components/kit_v2/Text/Text.d.ts | 38 + src/src/components/kit_v2/Text/Text.style.ts | 9 + src/src/components/kit_v2/Text/Text.tsx | 53 + src/src/components/kit_v2/Text/index.ts | 4 + src/src/components/kit_v2/Toast/Toast.d.ts | 87 + .../components/kit_v2/Toast/Toast.style.ts | 124 + .../components/kit_v2/Toast/Toast.test.tsx | 48 + src/src/components/kit_v2/Toast/Toast.tsx | 105 + .../components/kit_v2/Toast/ToastProvider.tsx | 48 + src/src/components/kit_v2/Toast/index.ts | 5 + .../kit_v2/ToggleButton/ToggleButton.d.ts | 58 + .../kit_v2/ToggleButton/ToggleButton.style.ts | 9 + .../kit_v2/ToggleButton/ToggleButton.tsx | 73 + .../components/kit_v2/ToggleButton/index.ts | 4 + .../components/kit_v2/Tooltip/Tooltip.d.ts | 32 + .../kit_v2/Tooltip/Tooltip.style.ts | 49 + .../kit_v2/Tooltip/Tooltip.test.tsx | 11 + src/src/components/kit_v2/Tooltip/Tooltip.tsx | 62 + .../__snapshots__/Tooltip.test.tsx.snap | 3 + src/src/components/kit_v2/Tooltip/index.ts | 3 + src/src/components/kit_v2/Tree/Tree.d.ts | 20 + src/src/components/kit_v2/Tree/Tree.style.ts | 94 + src/src/components/kit_v2/Tree/Tree.tsx | 122 + src/src/components/kit_v2/Tree/index.ts | 4 + src/src/components/kit_v2/index.ts | 50 + .../kit_v2/utils/getButtonStyles.ts | 56 + .../kit_v2/utils/getHiglightedText.tsx | 21 + src/src/config/analytics/analyticsKeysMap.ts | 367 + src/src/config/charts/index.ts | 21 + src/src/config/colors/colors.ts | 80 + src/src/config/config.ts | 67 + .../config/controls/controlsDefaultConfig.ts | 105 + src/src/config/dash-arrays/dashArrays.ts | 13 + src/src/config/dates/dates.ts | 11 + src/src/config/enums/densityEnum.ts | 5 + src/src/config/enums/imageEnums.ts | 12 + src/src/config/enums/requestStatusEnum.ts | 6 + src/src/config/enums/routesEnum.ts | 23 + src/src/config/enums/tableEnums.ts | 36 + src/src/config/grouping/GroupingPopovers.ts | 35 + .../illustrationConfig/illustrationConfig.tsx | 279 + src/src/config/mediaConfigs/mediaConfigs.ts | 132 + src/src/config/monacoConfig/monacoConfig.ts | 96 + .../notificationMessages.ts | 16 + src/src/config/pageTitles/pageTitles.ts | 19 + src/src/config/references/index.ts | 164 + src/src/config/stitches/animations.ts | 33 + src/src/config/stitches/global.ts | 10 + src/src/config/stitches/index.ts | 26 + src/src/config/stitches/media.ts | 12 + src/src/config/stitches/theme.ts | 241 + src/src/config/stitches/types.ts | 20 + src/src/config/stitches/utils.ts | 151 + src/src/config/systemMetrics/systemMetrics.ts | 12 + src/src/config/table/tableConfigs.ts | 200 + src/src/hooks/index.ts | 8 + src/src/hooks/useCodeHighlighter.ts | 34 + src/src/hooks/useCopy.ts | 21 + src/src/hooks/useFontSize.ts | 21 + src/src/hooks/useModel.ts | 32 + src/src/hooks/usePanelResize.ts | 122 + src/src/hooks/useParamsSuggestions.ts | 37 + src/src/hooks/window/index.ts | 5 + src/src/hooks/window/useAnimationFrame.ts | 12 + src/src/hooks/window/useResizeObserver.ts | 27 + src/src/hooks/window/useWindowResize.ts | 13 + src/src/index.tsx | 19 + src/src/modules/BaseExplorer/README.md | 0 .../components/AudioBox/AudioBox.d.ts | 10 + .../components/AudioBox/AudioBox.scss | 204 + .../components/AudioBox/AudioBox.tsx | 264 + .../components/AudioBox/AudioBoxProgress.tsx | 100 + .../components/AudioBox/AudioBoxVolume.tsx | 60 + .../components/AudioBox/index.tsx | 5 + .../BoxFullViewPopover.d.ts | 13 + .../BoxFullViewPopover.scss | 82 + .../BoxFullViewPopover/BoxFullViewPopover.tsx | 232 + .../components/BoxFullViewPopover/index.ts | 5 + .../BoxVirtualizer/BoxVirtualizer.d.ts | 29 + .../BoxVirtualizer/BoxVirtualizer.scss | 53 + .../BoxVirtualizer/BoxVirtualizer.tsx | 174 + .../components/BoxVirtualizer/index.ts | 5 + .../components/BoxWrapper/Box.tsx | 39 + .../components/BoxWrapper/BoxWithStacking.tsx | 157 + .../components/BoxWrapper/BoxWrapper.d.ts | 34 + .../components/BoxWrapper/BoxWrapper.scss | 71 + .../components/BoxWrapper/BoxWrapper.tsx | 53 + .../components/BoxWrapper/index.ts | 5 + .../components/CaptionBox/CaptionBox.d.ts | 9 + .../components/CaptionBox/CaptionBox.scss | 11 + .../components/CaptionBox/CaptionBox.tsx | 98 + .../components/CaptionBox/index.ts | 5 + .../Controls/Aggregation/Aggregation.d.ts | 51 + .../Controls/Aggregation/Aggregation.tsx | 93 + .../Popover/AggregationPopover.d.ts | 5 + .../Popover/AggregationPopover.scss | 12 + .../Popover/AggregationPopover.tsx | 162 + .../Controls/Aggregation/Popover/index.ts | 5 + .../components/Controls/Aggregation/index.ts | 5 + .../Controls/BoxProperties/BoxProperties.d.ts | 12 + .../Controls/BoxProperties/BoxProperties.tsx | 60 + .../Popover/BoxPropertiesPopover.d.ts | 17 + .../Popover/BoxPropertiesPopover.scss | 51 + .../Popover/BoxPropertiesPopover.tsx | 144 + .../Controls/BoxProperties/Popover/index.tsx | 5 + .../Controls/BoxProperties/index.tsx | 5 + .../CaptionProperties/CaptionProperties.d.ts | 17 + .../CaptionProperties/CaptionProperties.tsx | 66 + .../CaptionPropertiesPopover.d.ts | 8 + .../CaptionPropertiesPopover.scss | 37 + .../CaptionPropertiesPopover.tsx | 216 + .../CaptionPropertiesPopover/index.ts | 5 + .../Controls/CaptionProperties/index.ts | 5 + .../Controls/ConfigureAxes/ConfigureAxes.d.ts | 28 + .../Controls/ConfigureAxes/ConfigureAxes.tsx | 64 + .../ConfigureAxes/Popover/Alignment.tsx | 220 + .../ConfigureAxes/Popover/AxesRange.tsx | 237 + .../ConfigureAxes/Popover/AxesType.tsx | 67 + .../Popover/ConfigureAxesPopover.d.ts | 26 + .../Popover/ConfigureAxesPopover.scss | 67 + .../Popover/ConfigureAxesPopover.tsx | 52 + .../Controls/ConfigureAxes/Popover/index.ts | 9 + .../Controls/ConfigureAxes/index.ts | 5 + .../ConfigureTooltip/ConfigureTooltip.d.ts | 18 + .../ConfigureTooltip/ConfigureTooltip.tsx | 66 + .../Popover/ConfigureTooltipPopover.d.ts | 5 + .../Popover/ConfigureTooltipPopover.scss | 40 + .../Popover/ConfigureTooltipPopover.tsx | 211 + .../ConfigureTooltip/Popover/index.ts | 5 + .../Controls/ConfigureTooltip/index.ts | 5 + .../components/Controls/Controls.scss | 133 + .../components/Controls/Controls.tsx | 46 + .../Controls/Highlighting/Highlighting.d.ts | 12 + .../Controls/Highlighting/Highlighting.tsx | 69 + .../Popover/HighlightingPopover.d.ts | 5 + .../Popover/HighlightingPopover.scss | 6 + .../Popover/HighlightingPopover.tsx | 71 + .../Controls/Highlighting/Popover/index.ts | 5 + .../components/Controls/Highlighting/index.ts | 5 + .../IgnoreOutliers/IgnoreOutliers.d.ts | 5 + .../IgnoreOutliers/IgnoreOutliers.tsx | 56 + .../Controls/IgnoreOutliers/index.ts | 5 + .../components/Controls/Legends/Legends.d.ts | 5 + .../components/Controls/Legends/Legends.tsx | 60 + .../components/Controls/Legends/index.ts | 5 + .../Smoothing/Popover/SmoothingPopover.d.ts | 5 + .../Smoothing/Popover/SmoothingPopover.scss | 19 + .../Smoothing/Popover/SmoothingPopover.tsx | 158 + .../Controls/Smoothing/Popover/index.ts | 5 + .../Controls/Smoothing/Smoothing.d.ts | 15 + .../Controls/Smoothing/Smoothing.tsx | 75 + .../components/Controls/Smoothing/index.ts | 5 + .../Popover/TextRendererModePopover.d.ts | 8 + .../Popover/TextRendererModePopover.scss | 15 + .../Popover/TextRendererModePopover.tsx | 45 + .../TextRendererMode/Popover/index.tsx | 5 + .../TextRendererMode/TextRendererMode.d.ts | 9 + .../TextRendererMode/TextRendererMode.tsx | 61 + .../Controls/TextRendererMode/index.tsx | 5 + .../Popover/ZoomInPopover/ZoomInPopover.d.ts | 5 + .../Popover/ZoomInPopover/ZoomInPopover.scss | 6 + .../Popover/ZoomInPopover/ZoomInPopover.tsx | 58 + .../Zoom/Popover/ZoomInPopover/index.ts | 5 + .../ZoomOutPopover/ZoomOutPopover.d.ts | 5 + .../ZoomOutPopover/ZoomOutPopover.scss | 6 + .../Popover/ZoomOutPopover/ZoomOutPopover.tsx | 63 + .../Zoom/Popover/ZoomOutPopover/index.ts | 5 + .../components/Controls/Zoom/Popover/index.ts | 7 + .../components/Controls/Zoom/Zoom.d.ts | 18 + .../components/Controls/Zoom/Zoom.tsx | 125 + .../components/Controls/Zoom/index.ts | 5 + .../components/Controls/index.tsx | 8 + .../components/Explorer/Explorer.tsx | 47 + .../BaseExplorer/components/Explorer/index.ts | 3 + .../components/Explorer/styles.scss | 10 + .../components/ExplorerBar/ExplorerBar.scss | 23 + .../components/ExplorerBar/ExplorerBar.tsx | 86 + .../components/ExplorerBar/index.ts | 5 + .../ExplorerNotifications.scss | 44 + .../ExplorerNotifications.tsx | 84 + .../ExplorerNotifications/config.tsx | 17 + .../components/ExplorerNotifications/index.ts | 3 + .../components/Figures/Figures.tsx | 65 + .../BaseExplorer/components/Figures/index.ts | 3 + .../Grouping/Grouping/Grouping.scss | 15 + .../components/Grouping/Grouping/Grouping.tsx | 40 + .../components/Grouping/Grouping/index.ts | 3 + .../Grouping/GroupingItem/GroupingItem.d.ts | 13 + .../Grouping/GroupingItem/GroupingItem.scss | 33 + .../Grouping/GroupingItem/GroupingItem.tsx | 88 + .../components/Grouping/GroupingItem/index.ts | 4 + .../GroupingPopover/GroupingPopover.d.ts | 16 + .../GroupingPopover/GroupingPopover.scss | 124 + .../GroupingPopover/GroupingPopover.tsx | 270 + .../Grouping/GroupingPopover/index.ts | 5 + .../components/Grouping/index.tsx | 4 + .../components/Metrics/Metrics.tsx | 129 + .../components/Metrics/hooks/index.ts | 13 + .../Metrics/hooks/useAggregateChartData.tsx | 265 + .../Metrics/hooks/useAlignMetricsData.tsx | 162 + .../Metrics/hooks/useSetChartData.tsx | 38 + .../Metrics/hooks/useSmoothChartData.tsx | 44 + .../Metrics/hooks/useSyncHoverState.tsx | 131 + .../BaseExplorer/components/Metrics/index.ts | 3 + .../ProgressBar/ProgressBarWrapper.tsx | 32 + .../components/ProgressBar/index.tsx | 3 + .../components/QueryForm/QueryForm.scss | 141 + .../components/QueryForm/QueryForm.tsx | 458 + .../QueryForm/SearchButton/SearchButton.d.ts | 6 + .../QueryForm/SearchButton/SearchButton.tsx | 28 + .../QueryForm/SearchButton/index.ts | 5 + .../components/QueryForm/index.ts | 4 + .../components/RangePanel/RangePanel.d.ts | 34 + .../components/RangePanel/RangePanel.scss | 50 + .../components/RangePanel/RangePanel.tsx | 184 + .../components/RangePanel/RangePanelItem.tsx | 116 + .../components/RangePanel/helpers.ts | 67 + .../components/RangePanel/index.tsx | 5 + .../components/TextBox/TextBox.scss | 17 + .../components/TextBox/TextBox.tsx | 55 + .../Visualizations/Visualizations.scss | 12 + .../Visualizations/Visualizations.tsx | 69 + .../components/Visualizations/index.tsx | 3 + .../components/Visualizer/Visualizer.scss | 17 + .../components/Visualizer/Visualizer.tsx | 246 + .../components/Visualizer/hooks/index.ts | 3 + .../Visualizer/hooks/useDepthMap.ts | 92 + .../components/Visualizer/index.tsx | 3 + .../VisualizerPanel/VisualizerPanel.d.ts | 10 + .../VisualizerPanel/VisualizerPanel.scss | 12 + .../VisualizerPanel/VisualizerPanel.tsx | 26 + .../components/VisualizerPanel/index.tsx | 5 + .../VisualizerLegends/VisualizerLegends.d.ts | 5 + .../VisualizerLegends/VisualizerLegends.scss | 9 + .../VisualizerLegends/VisualizerLegends.tsx | 151 + .../Widgets/VisualizerLegends/index.ts | 5 + .../AppearanceActionButtons.scss | 36 + .../AppearanceActionButtons.tsx | 78 + .../RunAdditionalInfo/RunAdditionalInfo.scss | 22 + .../RunAdditionalInfo/RunAdditionalInfo.tsx | 51 + .../SelectedFields/SelectedFields.scss | 14 + .../SelectedFields/SelectedFields.tsx | 37 + .../SelectedGroupingFields.scss | 18 + .../SelectedGroupingFields.tsx | 63 + .../TooltipContent/TooltipContent.d.ts | 35 + .../TooltipContent/TooltipContent.scss | 36 + .../TooltipContent/TooltipContent.tsx | 104 + .../VisualizerTooltip/TooltipContent/index.ts | 15 + .../VisualizerTooltip/VisualizerTooltip.d.ts | 8 + .../VisualizerTooltip/VisualizerTooltip.tsx | 107 + .../VisualizerTooltip/getTooltipContent.ts | 57 + .../Widgets/VisualizerTooltip/index.ts | 5 + .../BaseExplorer/components/Widgets/index.ts | 4 + .../modules/BaseExplorer/components/index.tsx | 7 + .../BaseExplorer/getDefaultHydration.tsx | 160 + src/src/modules/BaseExplorer/index.tsx | 104 + src/src/modules/BaseExplorer/styles.scss | 0 src/src/modules/BaseExplorer/types.ts | 265 + .../utils/getBaseExplorerStaticContent.tsx | 28 + src/src/modules/core/AimError.ts | 34 + .../modules/core/api/dashboardsApi/index.ts | 77 + .../modules/core/api/dashboardsApi/types.ts | 65 + .../modules/core/api/experimentsApi/index.ts | 211 + .../modules/core/api/experimentsApi/types.ts | 124 + src/src/modules/core/api/projectApi/index.ts | 38 + src/src/modules/core/api/projectApi/types.ts | 139 + .../modules/core/api/releaseNotesApi/index.ts | 68 + .../modules/core/api/releaseNotesApi/types.ts | 135 + src/src/modules/core/api/runsApi/index.ts | 194 + src/src/modules/core/api/runsApi/types.ts | 85 + src/src/modules/core/api/tagsApi/index.ts | 114 + src/src/modules/core/api/tagsApi/types.ts | 132 + src/src/modules/core/cache/index.ts | 4 + src/src/modules/core/cache/inlineCache.ts | 42 + src/src/modules/core/cache/memoize.ts | 26 + .../core/engine/blob-uri-system/index.ts | 160 + .../core/engine/custom-states/index.ts | 160 + .../modules/core/engine/event-system/index.ts | 126 + .../modules/core/engine/event-system/state.ts | 61 + .../core/engine/explorer-engine/index.ts | 422 + .../core/engine/explorer/groupings/index.ts | 185 + .../core/engine/explorer/groupings/state.ts | 209 + src/src/modules/core/engine/explorer/index.ts | 69 + .../core/engine/explorer/query/index.ts | 5 + .../core/engine/explorer/query/state.ts | 108 + .../core/engine/explorer/state/controls.ts | 94 + .../modules/core/engine/instructions/index.ts | 65 + .../modules/core/engine/instructions/state.ts | 137 + .../core/engine/notifications/index.ts | 199 + .../core/engine/notifications/state.ts | 64 + src/src/modules/core/engine/pipeline/index.ts | 388 + src/src/modules/core/engine/pipeline/state.ts | 281 + src/src/modules/core/engine/types.ts | 142 + .../core/engine/visualizations/controls.ts | 104 + .../core/engine/visualizations/index.ts | 319 + .../modules/core/pipeline/PipelineError.ts | 42 + .../core/pipeline/adapter/AdapterError.ts | 25 + .../pipeline/adapter/collectQueryableData.ts | 51 + .../pipeline/adapter/depthInterceptors.ts | 32 + .../modules/core/pipeline/adapter/index.ts | 77 + .../core/pipeline/adapter/processor.ts | 197 + .../modules/core/pipeline/adapter/types.ts | 35 + src/src/modules/core/pipeline/custom/index.ts | 181 + .../core/pipeline/grouping/GroupingError.ts | 25 + .../core/pipeline/grouping/getGroupValues.ts | 75 + .../modules/core/pipeline/grouping/group.ts | 69 + .../modules/core/pipeline/grouping/index.ts | 93 + src/src/modules/core/pipeline/index.ts | 203 + .../modules/core/pipeline/query/QueryError.ts | 46 + src/src/modules/core/pipeline/query/index.ts | 145 + src/src/modules/core/pipeline/query/types.ts | 18 + src/src/modules/core/pipeline/types.ts | 38 + .../modules/core/services/browserHistory.ts | 81 + src/src/modules/core/utils/createResource.ts | 31 + .../modules/core/utils/getQueryFromRanges.ts | 40 + .../core/utils/getQueryParamsFromState.ts | 26 + .../core/utils/getQueryStringFromSelect.ts | 49 + .../core/utils/getSelectFormOptions.ts | 49 + src/src/modules/core/utils/getUpdatedUrl.ts | 17 + .../modules/core/utils/getUrlSearchParam.ts | 7 + src/src/modules/core/utils/hashing.ts | 57 + .../utils/removeExampleTypesFromProjects.ts | 22 + src/src/modules/core/utils/store.ts | 98 + src/src/pages/AudiosExplorer/config.ts | 48 + .../pages/AudiosExplorer/getStaticContent.tsx | 52 + src/src/pages/AudiosExplorer/index.tsx | 35 + src/src/pages/Bookmarks/Bookmarks.scss | 18 + src/src/pages/Bookmarks/Bookmarks.tsx | 63 + .../pages/Bookmarks/BookmarksContainer.tsx | 39 + .../components/BookmarkCard/BookmarkCard.scss | 85 + .../components/BookmarkCard/BookmarkCard.tsx | 152 + src/src/pages/Dashboard/Dashboard.scss | 39 + src/src/pages/Dashboard/Dashboard.tsx | 62 + .../ActiveRunsTable/ActiveRunsStore.ts | 17 + .../ActiveRunsTable/ActiveRunsTable.scss | 33 + .../ActiveRunsTable/ActiveRunsTable.tsx | 86 + .../ActiveRunsTable/useActiveRunsTable.tsx | 264 + .../AimIntegrations/AimIntegrations.scss | 38 + .../AimIntegrations/AimIntegrations.tsx | 202 + .../components/AimIntegrations/index.ts | 3 + .../DashboardContributionsFeed.tsx | 13 + .../DashboardContributionsFeedStore.ts | 25 + .../DashboardContributionsFeed/index.ts | 3 + .../useDashboardContributionsFeed.ts | 125 + .../DashboardRight/DashboardRight.scss | 13 + .../DashboardRight/DashboardRight.tsx | 26 + .../DashboardRight/GuideDocs/GuideDocs.scss | 21 + .../DashboardRight/GuideDocs/GuideDocs.tsx | 91 + .../DashboardRight/GuideDocs/GuidesStore.ts | 20 + .../ReleaseNotes/ReleaseNotes.scss | 114 + .../ReleaseNotes/ReleaseNotes.tsx | 105 + .../ReleaseNotes/ReleasesStore.ts | 11 + .../ReleaseNotes/useReleaseNotes.ts | 161 + .../DashboardBookmarks.scss | 29 + .../DashboardBookmarks/DashboardBookmarks.tsx | 83 + .../DashboardBookmarksStore.ts | 17 + .../useDashboardBookmarks.tsx | 52 + .../ExperimentsCard/ExperimentsCard.d.ts | 7 + .../ExperimentsCard/ExperimentsCard.scss | 15 + .../ExperimentsCard/ExperimentsCard.tsx | 64 + .../ExperimentsCard/ExperimentsStore.ts | 13 + .../ExploreSection/ExperimentsCard/index.ts | 4 + .../ExperimentsCard/useExperimentsCard.tsx | 206 + .../ExploreSection/ExploreSection.scss | 137 + .../ExploreSection/ExploreSection.tsx | 60 + .../ExploreSection/QuickLinks/QuickLinks.scss | 17 + .../ExploreSection/QuickLinks/QuickLinks.tsx | 112 + .../RecentSearches/RecentSearchItem.tsx | 62 + .../RecentSearches/RecentSearches.scss | 21 + .../RecentSearches/RecentSearches.tsx | 46 + .../RecentSearches/useRecentSearches.ts | 5 + .../ExploreSection/TagsCard/TagsCard.d.ts | 0 .../ExploreSection/TagsCard/TagsCard.scss | 19 + .../ExploreSection/TagsCard/TagsCard.tsx | 72 + .../ExploreSection/TagsCard/TagsStore.ts | 11 + .../ExploreSection/TagsCard/useTagsCard.tsx | 177 + .../ProjectContributions.scss | 44 + .../ProjectContributions.tsx | 48 + .../ProjectContributionsStore.ts | 17 + .../useProjectContributions.tsx | 28 + .../ProjectStatistics/ProjectStatistics.d.ts | 12 + .../ProjectStatistics/ProjectStatistics.scss | 20 + .../ProjectStatistics/ProjectStatistics.tsx | 250 + .../ProjectStatisticsStore.ts | 23 + .../components/ProjectStatistics/index.tsx | 7 + .../useProjectStatistics.tsx | 31 + .../components/QuickStart/QuickStart.scss | 14 + .../components/QuickStart/QuickStart.tsx | 74 + .../Dashboard/components/QuickStart/index.ts | 3 + src/src/pages/Experiment/Experiment.scss | 109 + src/src/pages/Experiment/Experiment.tsx | 249 + src/src/pages/Experiment/ExperimentStore.ts | 64 + .../ExperimentHeader/ExperimentHeader.d.ts | 10 + .../ExperimentHeader/ExperimentHeader.scss | 100 + .../ExperimentHeader/ExperimentHeader.tsx | 134 + .../components/ExperimentHeader/index.ts | 4 + .../ExperimentNavigationPopover.d.ts | 8 + .../ExperimentNavigationPopover.scss | 116 + .../ExperimentNavigationPopover.tsx | 92 + .../ExperimentNavigationPopover/index.ts | 4 + .../ExperimentNotesEngine.ts | 68 + .../ExperimentNotesTab.d.ts | 3 + .../ExperimentNotesTab.scss | 136 + .../ExperimentNotesTab/ExperimentNotesTab.tsx | 147 + .../components/ExperimentNotesTab/index.ts | 8 + .../ExperimentNotesTab/useExperimentNotes.tsx | 44 + .../ExperimentContributions.d.ts | 4 + .../ExperimentContributions.scss | 48 + .../ExperimentContributions.tsx | 58 + .../ExperimentContributionsStore.ts | 20 + .../ExperimentContributions/index.ts | 8 + .../useExperimentContributions.tsx | 32 + .../ExperimentContributionsFeed.d.ts | 4 + .../ExperimentContributionsFeed.tsx | 17 + .../ExperimentContributionsFeedStore.ts | 26 + .../ExperimentContributionsFeed/index.ts | 9 + .../useExperimentContributionsFeed.tsx | 125 + .../ExperimentOverviewSidebar.d.ts | 9 + .../ExperimentOverviewSidebar.scss | 88 + .../ExperimentOverviewSidebar.tsx | 101 + .../ExperimentOverviewSidebar/index.ts | 5 + .../ExperimentOverviewTab.d.ts | 5 + .../ExperimentOverviewTab.scss | 33 + .../ExperimentOverviewTab.tsx | 67 + .../ExperimentStatistics.d.ts | 3 + .../ExperimentStatistics.scss | 17 + .../ExperimentStatistics.tsx | 191 + .../ExperimentStatistics/index.ts | 5 + .../components/ExperimentOverviewTab/index.ts | 5 + .../ExperimentRunsTab/ExperimentRunsStore.ts | 25 + .../ExperimentRunsTab/ExperimentRunsTab.d.ts | 4 + .../ExperimentRunsTab/ExperimentRunsTab.scss | 15 + .../ExperimentRunsTab/ExperimentRunsTab.tsx | 29 + .../ExperimentRunsTable.d.ts | 4 + .../ExperimentRunsTable.scss | 48 + .../ExperimentRunsTable.tsx | 117 + .../ExperimentRunsTable/index.ts | 6 + .../useExperimentRunsTable.tsx | 308 + .../components/ExperimentRunsTab/index.ts | 6 + .../ExperimentSettingsTab.d.ts | 5 + .../ExperimentSettingsTab.scss | 8 + .../ExperimentSettingsTab.tsx | 43 + .../components/ExperimentSettingsTab/index.ts | 5 + .../pages/Experiment/useExperimentState.tsx | 36 + src/src/pages/FiguresExplorer/config.ts | 43 + .../FiguresExplorer/getStaticContent.tsx | 52 + src/src/pages/FiguresExplorer/index.tsx | 35 + .../pages/ImagesExplore/ImagesExplore.scss | 65 + src/src/pages/ImagesExplore/ImagesExplore.tsx | 583 + .../components/Controls/Controls.scss | 86 + .../components/Controls/Controls.tsx | 181 + .../ImagesExploreAppBar.scss | 36 + .../ImagesExploreAppBar.tsx | 150 + .../ImagesExploreTableGrid.tsx | 494 + .../components/SelectForm/SelectForm.scss | 124 + .../components/SelectForm/SelectForm.tsx | 384 + src/src/pages/Metrics/Metrics.scss | 93 + src/src/pages/Metrics/Metrics.tsx | 312 + src/src/pages/Metrics/MetricsContainer.tsx | 220 + .../ColorPopoverAdvanced.scss | 61 + .../ColorPopoverAdvanced.tsx | 118 + .../Metrics/components/Controls/Controls.scss | 86 + .../Metrics/components/Controls/Controls.tsx | 486 + .../components/MetricsBar/MetricsBar.scss | 35 + .../components/MetricsBar/MetricsBar.tsx | 155 + .../MetricsTableGrid/MetricsTableGrid.tsx | 589 + .../components/SelectForm/SelectForm.scss | 125 + .../components/SelectForm/SelectForm.tsx | 369 + .../StrokePopover/StrokePopoverAdvanced.scss | 19 + .../StrokePopover/StrokePopoverAdvanced.tsx | 68 + .../CompareSelectedRunsPopover.d.ts | 8 + .../CompareSelectedRunsPopover.scss | 31 + .../CompareSelectedRunsPopover.tsx | 159 + .../Table/CompareSelectedRunsPopover/index.ts | 5 + .../HideRowsPopover/HideRowsPopover.scss | 27 + .../Table/HideRowsPopover/HideRowsPopover.tsx | 79 + .../ColumnItem/ColumnItem.d.ts | 12 + .../ColumnItem/ColumnItem.scss | 72 + .../ColumnItem/ColumnItem.tsx | 126 + .../ManageColumnsPopover/ManageColumns.d.ts | 14 + .../ManageColumnsPopover.scss | 93 + .../ManageColumnsPopover.tsx | 486 + .../MetricsValueKeyPopover.scss | 24 + .../MetricsValueKeyPopover.tsx | 89 + .../Table/MetricsValueKeyPopover/index.ts | 3 + .../RowHeightPopover/RowHeightPopover.scss | 24 + .../RowHeightPopover/RowHeightPopover.tsx | 71 + .../Table/SortPopover/SortPopover.scss | 121 + .../Table/SortPopover/SortPopover.tsx | 176 + .../Table/SortPopover/SortPopoverList.tsx | 73 + .../MetricsExplorer/TooltipContentHeader.tsx | 65 + src/src/pages/MetricsExplorer/config.tsx | 182 + .../MetricsExplorer/getStaticContent.tsx | 52 + src/src/pages/MetricsExplorer/index.ts | 76 + src/src/pages/PageWrapper.tsx | 25 + src/src/pages/Params/Params.scss | 64 + src/src/pages/Params/Params.tsx | 321 + src/src/pages/Params/ParamsContainer.tsx | 199 + .../Params/components/Controls/Controls.scss | 54 + .../Params/components/Controls/Controls.tsx | 107 + .../ParamsTableGrid/ParamsTableGrid.tsx | 526 + .../components/SelectForm/SelectForm.scss | 111 + .../components/SelectForm/SelectForm.tsx | 294 + .../AudiosVisualizer/AudiosVisualizer.scss | 3 + .../AudiosVisualizer/AudiosVisualizer.tsx | 138 + .../pages/RunDetail/AudiosVisualizer/index.ts | 3 + .../DistributionVisualizer.tsx | 37 + .../DistributionsVisualizer.scss | 15 + .../DistributionsVisualizer/index.ts | 3 + .../temp/Heatmap/Heatmap.js | 214 + .../temp/Histogram/Histogram.jsx | 139 + .../DistributionsVisualizer/temp/Wrapper.jsx | 209 + .../ImagesVisualizer/ImagesVisualizer.scss | 5 + .../ImagesVisualizer/ImagesVisualizer.tsx | 146 + .../pages/RunDetail/ImagesVisualizer/index.ts | 3 + src/src/pages/RunDetail/NotesTab/types.d.ts | 9 + .../PlotlyVisualizer/PlotlyVisualizer.scss | 11 + .../PlotlyVisualizer/PlotlyVisualizer.tsx | 43 + .../pages/RunDetail/PlotlyVisualizer/index.ts | 3 + src/src/pages/RunDetail/RunDetail.scss | 536 + src/src/pages/RunDetail/RunDetail.tsx | 500 + .../RunDetailMetricsAndSystemTab.tsx | 276 + .../RunDetailNotesTab/NoteTooltip.tsx | 24 + .../RunDetailNotesTab/RunDetailNotesTab.scss | 136 + .../RunDetailNotesTab/RunDetailNotesTab.tsx | 167 + .../RunDetail/RunDetailNotesTab/index.ts | 3 + .../RunDetail/RunDetailNotesTab/types.d.ts | 3 + .../pages/RunDetail/RunDetailParamsTab.tsx | 48 + .../RunDetailSettingsTab.scss | 45 + .../RunDetailSettingsTab.tsx | 121 + .../RunDetail/RunDetailSettingsTab/index.ts | 3 + .../RunDetail/RunDetailSettingsTab/types.d.ts | 9 + .../LogRecordItem/LogRecordItem.d.ts | 52 + .../LogRecordItem/LogRecordItem.scss | 166 + .../LogRecordItem/LogRecordItem.tsx | 156 + .../RunLogRecords/LogRecordItem/config.ts | 22 + .../RunLogRecords/LogRecordItem/index.ts | 4 + .../RunLogRecords/RunLogRecords.d.ts | 37 + .../RunLogRecords/RunLogRecords.scss | 30 + .../RunDetail/RunLogRecords/RunLogRecords.tsx | 127 + .../RunLogRecords/RunLogRecordsStore.ts | 57 + .../pages/RunDetail/RunLogRecords/index.ts | 5 + .../RunLogRecords/useRunLogRecords.tsx | 226 + src/src/pages/RunDetail/RunLogsTab/LogRow.tsx | 30 + .../RunDetail/RunLogsTab/RunLogsTab.d.ts | 13 + .../RunDetail/RunLogsTab/RunLogsTab.scss | 53 + .../pages/RunDetail/RunLogsTab/RunLogsTab.tsx | 274 + src/src/pages/RunDetail/RunLogsTab/index.tsx | 4 + src/src/pages/RunDetail/RunMetricCard.tsx | 113 + .../RunOverviewTab/RunOverviewTab.d.ts | 4 + .../RunOverviewTab/RunOverviewTab.scss | 40 + .../RunOverviewTab/RunOverviewTab.tsx | 179 + .../RunOverviewTabArtifactsCard.d.ts | 4 + .../RunOverviewTabArtifactsCard.tsx | 97 + .../RunOverviewTabCLIArgumentsCard.d.ts | 4 + .../RunOverviewTabCLIArgumentsCard.scss | 5 + .../RunOverviewTabCLIArgumentsCard.tsx | 38 + .../RunOverviewTabEnvVariablesCard.d.ts | 4 + .../RunOverviewTabEnvVariablesCard.tsx | 87 + .../components/GitInfoCard/GitInfoCard.d.ts | 11 + .../components/GitInfoCard/GitInfoCard.scss | 34 + .../components/GitInfoCard/index.tsx | 111 + .../MetricsCard/RunOverviewTabMetricsCard.tsx | 126 + .../Packages/RunOverviewTabPackagesCard.d.ts | 4 + .../Packages/RunOverviewTabPackagesCard.tsx | 84 + .../ParamsCard/RunOverviewTabParamsCard.tsx | 91 + .../RunOverviewSidebar.d.ts | 13 + .../RunOverviewSidebar.scss | 165 + .../RunOverviewSidebar/RunOverviewSidebar.tsx | 228 + .../pages/RunDetail/RunOverviewTab/index.tsx | 3 + .../RunDetail/RunSelectPopoverContent.tsx | 218 + .../TextsVisualizer/TextsVisualizer.scss | 14 + .../TextsVisualizer/TextsVisualizer.tsx | 63 + .../pages/RunDetail/TextsVisualizer/index.ts | 3 + .../TraceVisualizationContainer.scss | 36 + .../TraceVisualizationContainer.tsx | 166 + .../TraceVisualizationContainer/index.tsx | 3 + .../withEmptyTraceCheck.tsx | 39 + .../RunDetail/hooks/useNotesResizePanel.tsx | 52 + .../RunDetail/hooks/useRunMetricsBatch.tsx | 21 + src/src/pages/RunDetail/types.d.ts | 107 + src/src/pages/Runs/Runs.scss | 171 + src/src/pages/Runs/Runs.tsx | 84 + src/src/pages/Runs/RunsContainer.tsx | 103 + src/src/pages/Runs/RunsTable.tsx | 112 + .../pages/Runs/components/RunsBar/RunsBar.tsx | 63 + .../RunsTableGrid/RunsTableGrid.tsx | 262 + .../Runs/components/SearchBar/SearchBar.scss | 12 + .../Runs/components/SearchBar/SearchBar.tsx | 94 + src/src/pages/Scatters/Scatters.scss | 94 + src/src/pages/Scatters/Scatters.tsx | 253 + src/src/pages/Scatters/ScattersContainer.tsx | 206 + .../components/Controls/Controls.scss | 86 + .../Scatters/components/Controls/Controls.tsx | 154 + .../components/SelectForm/SelectForm.scss | 127 + .../components/SelectForm/SelectForm.tsx | 196 + src/src/pages/Tags/TagDelete.tsx | 106 + src/src/pages/Tags/TagDetail.tsx | 92 + src/src/pages/Tags/TagRunsTable.tsx | 120 + src/src/pages/Tags/TagSoftDelete.tsx | 64 + src/src/pages/Tags/Tags.scss | 374 + src/src/pages/Tags/Tags.tsx | 98 + src/src/pages/Tags/TagsContainer.tsx | 39 + src/src/pages/Tags/TagsList.tsx | 203 + src/src/pages/Tags/TagsTable.tsx | 175 + .../pages/TextExplorer/getStaticContent.tsx | 52 + src/src/pages/TextExplorer/index.tsx | 44 + src/src/pages/TextExplorer/textConfig.tsx | 105 + src/src/react-app-env.d.ts | 1 + src/src/reportWebVitals.ts | 17 + src/src/routes/routes.tsx | 231 + src/src/services/NetworkService/index.ts | 391 + .../interceptors/exceptionDetector.ts | 6 + src/src/services/NetworkService/types.ts | 118 + src/src/services/analytics.ts | 62 + src/src/services/api/api.ts | 379 + src/src/services/api/apps/appsService.ts | 38 + .../api/audiosExplore/audiosExplore.ts | 26 + .../api/dashboard/dashboardService.ts | 49 + src/src/services/api/endpoints.ts | 51 + .../api/experiments/experimentsService.ts | 57 + .../api/imagesExplore/imagesExploreService.ts | 26 + src/src/services/api/metrics/metricsMock.ts | 83 + .../services/api/metrics/metricsService.ts | 50 + src/src/services/api/notes/notesService.ts | 57 + .../services/api/projects/projectsService.ts | 57 + src/src/services/api/runs/paramsMock.ts | 87 + src/src/services/api/runs/runsService.ts | 127 + src/src/services/api/tags/tagsService.ts | 70 + src/src/services/live-update/README.md | 39 + src/src/services/live-update/Worker.ts | 274 + .../examples/LiveUpdateBridge.example.js | 103 + src/src/services/live-update/index.ts | 9 + src/src/services/live-update/types.ts | 31 + src/src/services/live-update/utils.ts | 115 + .../models/bookmarks/bookmarksAppModel.ts | 132 + src/src/services/models/explorer/config.ts | 324 + .../models/explorer/createAppModel.ts | 54 + src/src/services/models/explorer/index.ts | 66 + .../models/explorer/metricsModelMethods.ts | 1798 + .../models/explorer/paramsModelMethods.ts | 1690 + .../models/explorer/runsModelMethods.ts | 1187 + .../models/explorer/scattersModelMethods.ts | 1606 + .../imagesExplore/imagesExploreAppModel.ts | 2380 + .../services/models/media/blobsURIModel.ts | 5 + .../services/models/metrics/metricModel.ts | 7 + .../models/metrics/metricsAppModel.ts | 5 + src/src/services/models/metrics/runModel.ts | 11 + src/src/services/models/model.ts | 47 + src/src/services/models/notes/notesModel.ts | 190 + .../services/models/params/paramsAppModel.ts | 5 + .../services/models/projects/projectsModel.ts | 110 + .../services/models/runs/runDetailAppModel.ts | 403 + .../services/models/runs/runTracesModel.ts | 347 + src/src/services/models/runs/runsAppModel.ts | 5 + src/src/services/models/runs/settings.ts | 187 + src/src/services/models/runs/types.d.ts | 138 + src/src/services/models/runs/util.test.ts | 128 + src/src/services/models/runs/util.ts | 464 + src/src/services/models/scatters/mockData.ts | 17 + .../models/scatters/scattersAppModel.ts | 5 + src/src/services/models/tags/tagsAppModel.ts | 192 + src/src/setupTests.ts | 7 + src/src/stories/Badge.stories.tsx | 30 + src/src/stories/Box.stories.tsx | 26 + src/src/stories/Button.stories.tsx | 48 + src/src/stories/Checkbox.stories.tsx | 22 + src/src/stories/ControlsButton.stories.tsx | 31 + src/src/stories/Dialog.stories.tsx | 56 + src/src/stories/Icon.stories.tsx | 30 + src/src/stories/IconButton.stories.tsx | 46 + src/src/stories/Input.stories.tsx | 69 + src/src/stories/ListItem.stories.tsx | 56 + src/src/stories/QueryBadge.stories.tsx | 26 + src/src/stories/Radio.stories.tsx | 76 + src/src/stories/Select.stories.tsx | 113 + src/src/stories/Separator.stories.tsx | 52 + src/src/stories/Slider.stories.tsx | 31 + src/src/stories/Switch.stories.tsx | 21 + src/src/stories/Text.stories.tsx | 43 + src/src/stories/Toast.stories.tsx | 88 + src/src/stories/ToggleButton.stories.tsx | 23 + src/src/stories/Tooltip.stories.tsx | 22 + src/src/stories/Tree.stories.tsx | 64 + src/src/styles/_global.scss | 44 + src/src/styles/_utils.scss | 125 + src/src/styles/abstracts/_functions.scss | 35 + src/src/styles/abstracts/_index.scss | 3 + src/src/styles/abstracts/_mixins.scss | 21 + src/src/styles/abstracts/_variables.scss | 172 + src/src/styles/base/_reset.scss | 25 + src/src/styles/components/_autocomplete.scss | 29 + src/src/styles/components/_inputs.scss | 189 + src/src/styles/components/_tooltip.scss | 16 + src/src/tests/hooks/model/createModel.test.ts | 60 + src/src/tests/hooks/model/useModel.test.ts | 36 + .../app/getFilteredSystemMetrics.test.ts | 54 + .../app/getSystemMetricsFromColumns.test.ts | 148 + src/src/tests/utils/index.ts | 48 + .../AggregationPopover.d.ts | 6 + src/src/types/components/AppBar/AppBar.d.ts | 8 + .../AttachedTagsList/AttachedTagsList.d.ts | 14 + .../AxesScalePopover/AxesScalePopover.d.ts | 11 + .../components/BookmarkForm/BookmarkForm.d.ts | 11 + .../BusyLoaderWrapper/BusyLoaderWrapper.d.ts | 12 + .../components/ChartLoader/ChartLoader.d.ts | 3 + .../components/ChartPanel/ChartPanel.d.ts | 73 + .../components/ChartPanel/ChartPopover.d.ts | 37 + .../components/ChartPanel/PopoverContent.d.ts | 25 + .../types/components/CodeBlock/CodeBlock.d.ts | 5 + .../ColorPopoverAdvanced.d.ts | 7 + .../components/ConfirmModal/ConfirmModal.d.ts | 15 + .../ControlPopover/ControlPopover.d.ts | 23 + .../CopyToClipBoard/CopyToClipBoard.d.ts | 12 + .../ErrorBoundary/ErrorBoundary.d.ts | 9 + .../GroupConfigPopover.d.ts | 3 + .../GroupingPopover/GroupingPopover.d.ts | 28 + .../types/components/HighPlot/HighPlot.d.ts | 31 + .../HighlightModesPopover.d.ts | 6 + .../IllustrationBlock/IllustrationBlock.d.ts | 23 + .../types/components/LineChart/LineChart.d.ts | 97 + .../components/MultiSelect/MultiSelect.d.ts | 23 + .../NotificationContainer.d.ts | 25 + .../ResizeModeActions/ResizeModeActions.d.ts | 7 + .../components/ResizePanel/ResizePanel.d.ts | 9 + .../types/components/SelectTag/SelectTag.d.ts | 11 + .../SmoothingPopover/SmoothingPopover.d.ts | 6 + .../types/components/TabPanel/TabPanel.d.ts | 6 + src/src/types/components/Table/Table.d.ts | 111 + src/src/types/components/TagForm/TagForm.d.ts | 12 + src/src/types/components/Theme/Theme.d.ts | 10 + .../TooltipContentPopover.d.ts | 14 + .../ZoomInPopover/ZoomInPopover.d.ts | 8 + .../ZoomOutPopover/ZoomOutPopover.d.ts | 6 + .../core/AimObjects/AimFlatObjectBase.d.ts | 35 + src/src/types/core/AimObjects/Audio.d.ts | 5 + .../types/core/AimObjects/CustomObject.d.ts | 29 + .../types/core/AimObjects/Distribution.d.ts | 7 + src/src/types/core/AimObjects/Figure.d.ts | 3 + src/src/types/core/AimObjects/Image.d.ts | 7 + src/src/types/core/AimObjects/Metric.d.ts | 8 + src/src/types/core/AimObjects/Run.d.ts | 52 + src/src/types/core/AimObjects/Sequence.d.ts | 35 + src/src/types/core/AimObjects/index.d.ts | 9 + src/src/types/core/enums/index.ts | 26 + src/src/types/core/shared/index.d.ts | 31 + src/src/types/global.d.ts | 3 + src/src/types/pages/bookmarks/Bookmarks.d.ts | 17 + .../bookmarks/components/BookmarkCard.d.ts | 5 + .../pages/components/Grouping/Grouping.d.ts | 34 + .../components/GroupingItem/GroupingItem.d.ts | 19 + .../components/Controls/Controls.d.ts | 25 + .../components/SelectForm/SelectForm.d.ts | 22 + src/src/types/pages/metrics/Metrics.d.ts | 158 + .../metrics/components/Controls/Controls.d.ts | 55 + .../components/MetricsBar/MetricsBar.d.ts | 15 + .../components/SelectForm/SelectForm.d.ts | 22 + .../components/SortPopover/SortPopover.d.ts | 20 + .../components/TableColumns/TableColumns.d.ts | 10 + src/src/types/pages/params/Params.d.ts | 127 + .../params/components/Controls/Controls.d.ts | 16 + .../components/SelectForm/SelectForm.d.ts | 17 + src/src/types/pages/runs/Runs.d.ts | 48 + src/src/types/pages/scatters/Scatters.d.ts | 121 + .../components/Controls/Controls.d.ts | 21 + .../components/SelectForm/SelectForm.d.ts | 19 + src/src/types/pages/tags/Tags.d.ts | 84 + .../models/bookmarks/bookmarksAppModel.d.ts | 8 + .../models/explorer/createAppModel.d.ts | 176 + .../imagesExplore/imagesExploreAppModel.d.ts | 144 + .../services/models/metrics/metricModel.d.ts | 21 + .../models/metrics/metricsAppModel.d.ts | 275 + .../services/models/metrics/runModel.d.ts | 67 + src/src/types/services/models/model.d.ts | 35 + .../types/services/models/notes/notes.d.ts | 22 + .../models/params/paramsAppModel.d.ts | 65 + .../models/projects/projectsModel.d.ts | 30 + .../services/models/runs/runsAppModel.d.ts | 14 + .../models/scatter/scatterAppModel.d.ts | 64 + src/src/types/services/services.d.ts | 9 + src/src/types/utils/aggregateGroupData.d.ts | 20 + src/src/types/utils/common.d.ts | 1 + src/src/types/utils/d3/clearArea.d.ts | 5 + src/src/types/utils/d3/drawArea.d.ts | 20 + src/src/types/utils/d3/drawAxes.d.ts | 20 + src/src/types/utils/d3/drawBrush.d.ts | 23 + .../types/utils/d3/drawHoverAttributes.d.ts | 98 + src/src/types/utils/d3/drawLines.d.ts | 23 + src/src/types/utils/d3/drawParallelAxes.d.ts | 29 + .../types/utils/d3/drawParallelAxesBrush.d.ts | 37 + .../utils/d3/drawParallelColorIndicator.d.ts | 5 + .../utils/d3/drawParallelHoverAttributes.d.ts | 69 + src/src/types/utils/d3/drawParallelLines.d.ts | 70 + src/src/types/utils/d3/drawPoints.d.ts | 15 + src/src/types/utils/d3/getAxisScale.d.ts | 21 + .../types/utils/d3/processLineChartData.d.ts | 66 + .../types/utils/formatSystemMetricName.d.ts | 10 + src/src/types/utils/getImageBoxSize.d.ts | 7 + .../types/utils/getImageMediaListHeight.d.ts | 10 + src/src/types/utils/getImageMediaSetSize.d.ts | 11 + src/src/utils/JsonToCSV.ts | 27 + src/src/utils/aggregateGroupData.ts | 255 + src/src/utils/alphabeticalSortComparator.ts | 53 + src/src/utils/app/alignMetricData.ts | 226 + src/src/utils/app/exceptionHandler.ts | 60 + src/src/utils/app/filterMetricData.ts | 140 + src/src/utils/app/getAggregatedData.ts | 43 + src/src/utils/app/getAppConfigData.ts | 62 + src/src/utils/app/getChartTitleData.ts | 59 + src/src/utils/app/getCompatibleChartConfig.ts | 50 + .../utils/app/getCompatibleSelectConfig.ts | 56 + .../app/getDataAsMediaSetNestedObject.ts | 84 + .../utils/app/getFilteredGroupingOptions.ts | 36 + src/src/utils/app/getFilteredRow.ts | 36 + src/src/utils/app/getFilteredSystemMetrics.ts | 28 + src/src/utils/app/getGroupConfig.ts | 41 + src/src/utils/app/getGroupingPersistIndex.ts | 29 + src/src/utils/app/getGroupingSelectOptions.ts | 94 + src/src/utils/app/getLegendsData.tsx | 78 + src/src/utils/app/getMetricHash.ts | 21 + src/src/utils/app/getMetricLabel.ts | 18 + src/src/utils/app/getMetricsInitialRowData.ts | 20 + src/src/utils/app/getMetricsSelectOptions.ts | 39 + src/src/utils/app/getParamsSuggestions.ts | 24 + src/src/utils/app/getQueryStringFromSelect.ts | 54 + src/src/utils/app/getRunData.ts | 39 + src/src/utils/app/getSelectOptions.ts | 98 + .../utils/app/getSystemMetricsFromColumns.ts | 78 + src/src/utils/app/isGroupingApplied.ts | 30 + .../utils/app/manageSystemMetricColumns.ts | 29 + .../utils/app/onAggregationConfigChange.ts | 63 + src/src/utils/app/onAlignmentMetricChange.ts | 129 + src/src/utils/app/onAlignmentTypeChange.ts | 46 + src/src/utils/app/onAxesScaleRangeChange.ts | 48 + src/src/utils/app/onAxesScaleTypeChange.ts | 43 + src/src/utils/app/onAxisBrushExtentChange.ts | 55 + src/src/utils/app/onBookmarkCreate.ts | 78 + src/src/utils/app/onBookmarkUpdate.ts | 51 + src/src/utils/app/onChangeTooltip.ts | 82 + src/src/utils/app/onChangeTrendlineOptions.ts | 40 + src/src/utils/app/onColorIndicatorChange.ts | 34 + src/src/utils/app/onColumnsOrderChange.ts | 45 + .../utils/app/onColumnsVisibilityChange.ts | 89 + .../utils/app/onCurveInterpolationChange.ts | 44 + src/src/utils/app/onDensityTypeChange.ts | 45 + src/src/utils/app/onGroupingApplyChange.ts | 36 + src/src/utils/app/onGroupingModeChange.ts | 49 + src/src/utils/app/onGroupingPaletteChange.ts | 41 + .../utils/app/onGroupingPersistenceChange.ts | 47 + src/src/utils/app/onGroupingReset.ts | 39 + src/src/utils/app/onGroupingSelectChange.ts | 39 + src/src/utils/app/onHighlightModeChange.ts | 39 + src/src/utils/app/onIgnoreOutliersChange.ts | 37 + src/src/utils/app/onLegendsChange.ts | 58 + src/src/utils/app/onMetricsValueKeyChange.ts | 46 + .../utils/app/onMetricsVisibilityChange.ts | 57 + src/src/utils/app/onNotificationAdd.ts | 16 + src/src/utils/app/onNotificationDelete.ts | 14 + src/src/utils/app/onParamsVisibilityChange.ts | 52 + src/src/utils/app/onResetConfigData.ts | 24 + src/src/utils/app/onRowHeightChange.ts | 40 + src/src/utils/app/onRowSelect.ts | 100 + src/src/utils/app/onRowVisibilityChange.ts | 43 + src/src/utils/app/onRowsVisibilityChange.ts | 45 + src/src/utils/app/onRunsTagsChange.ts | 34 + src/src/utils/app/onSearchQueryCopy.ts | 21 + .../utils/app/onSelectAdvancedQueryChange.ts | 19 + src/src/utils/app/onSelectOptionsChange.ts | 17 + src/src/utils/app/onSelectRunQueryChange.ts | 19 + src/src/utils/app/onShuffleChange.ts | 27 + src/src/utils/app/onSmoothingChange.ts | 53 + src/src/utils/app/onSortFieldsChange.ts | 42 + src/src/utils/app/onTableDiffShow.ts | 33 + src/src/utils/app/onTableResizeEnd.ts | 28 + src/src/utils/app/onTableResizeModeChange.ts | 36 + src/src/utils/app/onTableRowClick.ts | 24 + src/src/utils/app/onTableRowHover.ts | 17 + src/src/utils/app/onTableSortChange.ts | 51 + .../utils/app/onToggleColumnsColorScales.ts | 45 + src/src/utils/app/onZoomChange.ts | 45 + src/src/utils/app/resetChartZoom.ts | 24 + src/src/utils/app/resetModelOnError.ts | 32 + src/src/utils/app/setAggregationEnabled.ts | 20 + src/src/utils/app/setComponentRefs.ts | 20 + src/src/utils/app/setDefaultAppConfigData.ts | 101 + src/src/utils/app/setRequestProgress.ts | 22 + src/src/utils/app/setRequestStatus.ts | 22 + src/src/utils/app/sortDependingArrays.ts | 34 + src/src/utils/app/toggleSelectAdvancedMode.ts | 41 + src/src/utils/app/updateColumnsWidths.ts | 55 + src/src/utils/app/updateTableSortFields.ts | 49 + src/src/utils/app/updateURL.ts | 28 + src/src/utils/app/updateUrlParam.ts | 41 + src/src/utils/arrayBufferToBase64.ts | 9 + src/src/utils/changeDasharraySize.ts | 13 + src/src/utils/contextToString.ts | 21 + src/src/utils/d3/areaGenerator.ts | 15 + src/src/utils/d3/clearArea.ts | 17 + src/src/utils/d3/drawArea.ts | 171 + src/src/utils/d3/drawAxes.ts | 350 + src/src/utils/d3/drawBrush.ts | 199 + src/src/utils/d3/drawHoverAttributes.ts | 976 + src/src/utils/d3/drawLegends.ts | 441 + src/src/utils/d3/drawLines.ts | 129 + src/src/utils/d3/drawParallelAxes.ts | 137 + src/src/utils/d3/drawParallelAxesBrush.ts | 206 + .../utils/d3/drawParallelColorIndicator.ts | 43 + .../utils/d3/drawParallelHoverAttributes.ts | 559 + src/src/utils/d3/drawParallelLines.ts | 207 + src/src/utils/d3/drawPoints.ts | 51 + src/src/utils/d3/drawScatterTrendline.ts | 67 + src/src/utils/d3/drawUnableToRender.ts | 37 + src/src/utils/d3/getAxisScale.ts | 30 + src/src/utils/d3/getColorFromRange.ts | 18 + src/src/utils/d3/getCoordinates.ts | 21 + src/src/utils/d3/getDimensionValue.ts | 18 + src/src/utils/d3/index.ts | 131 + src/src/utils/d3/lineGenerator.ts | 24 + src/src/utils/d3/processLineChartData.ts | 498 + src/src/utils/d3/symbolGenerator.ts | 10 + src/src/utils/d3/tickFormatting.ts | 208 + src/src/utils/decodeWithBase58Checker.ts | 21 + src/src/utils/document/documentTitle.ts | 19 + src/src/utils/encoder/encoder.ts | 65 + src/src/utils/encoder/format_bytes.ts | 31 + src/src/utils/encoder/streamEncoding.ts | 509 + src/src/utils/filterArrayByIndexes.ts | 8 + src/src/utils/formatAnsiToHtml.ts | 494 + src/src/utils/formatByAlignment.ts | 59 + src/src/utils/formatSystemMetricName.ts | 7 + src/src/utils/formatToPositiveNumber.ts | 9 + src/src/utils/formatValue.ts | 89 + src/src/utils/getAdvancedSuggestions.ts | 17 + src/src/utils/getBiggestImageFromList.ts | 11 + src/src/utils/getCaretPosition.ts | 124 + src/src/utils/getClosestValue.ts | 20 + src/src/utils/getColumnOptions.ts | 42 + src/src/utils/getMinAndMaxBetweenArrays.ts | 19 + src/src/utils/getObjectPaths.ts | 72 + src/src/utils/getPositionBasedOnOverflow.ts | 79 + src/src/utils/getSmoothenedData.ts | 22 + src/src/utils/getSortedFields.ts | 67 + src/src/utils/getStateFromLocalStorage.ts | 9 + src/src/utils/getStateFromUrl.ts | 10 + src/src/utils/getTooltipContent.ts | 81 + src/src/utils/getUrlWithParam.ts | 20 + src/src/utils/getValueByField.ts | 13 + src/src/utils/getValuesMedian.ts | 9 + .../utils/helper/downloadLink/downloadLink.ts | 20 + .../float64FromUint8/float64FromUint8.ts | 13 + .../getPathSegments/getPathSegments.test.ts | 25 + .../helper/getPathSegments/getPathSegments.ts | 28 + .../helper/getSVGString/getSVGString.test.ts | 14 + .../utils/helper/getSVGString/getSVGString.ts | 76 + .../utils/helper/getValue/getValue.test.ts | 37 + src/src/utils/helper/getValue/getValue.ts | 55 + .../helper/imgSource2Image/imgSource2Image.ts | 52 + src/src/utils/helper/inIframe/inIframe.ts | 9 + src/src/utils/helper/index.ts | 21 + .../measureTextWidth/measureTextWidth.test.ts | 15 + .../measureTextWidth/measureTextWidth.ts | 36 + .../toTextEllipsis/toTextEllipsis.test.ts | 16 + .../helper/toTextEllipsis/toTextEllipsis.ts | 52 + src/src/utils/hexToRgbA.ts | 22 + src/src/utils/isMetricHash.ts | 8 + src/src/utils/isSystemMetric.ts | 7 + src/src/utils/jsonParse.ts | 8 + src/src/utils/minMaxOfArray.ts | 16 + src/src/utils/object/getObjectPaths.ts | 38 + src/src/utils/object/traverseTree.ts | 29 + src/src/utils/onCopyToClipBoard.ts | 58 + src/src/utils/processDurationTime.ts | 14 + .../utils/regression/linearRegression.test.ts | 64 + src/src/utils/regression/linearRegression.ts | 98 + src/src/utils/regression/loess.test.ts | 266 + src/src/utils/regression/loess.ts | 187 + src/src/utils/removeOutliers.ts | 23 + src/src/utils/removeSyntaxErrBrackets.ts | 25 + src/src/utils/roundValue.ts | 17 + src/src/utils/saveRecentSearches.ts | 35 + src/src/utils/shortEnglishHumanizer.ts | 23 + src/src/utils/shortenRunPropLabel.ts | 21 + src/src/utils/showAutocompletion.ts | 209 + src/src/utils/smoothingData.ts | 41 + src/src/utils/stopPropagation.ts | 11 + src/src/utils/storage.ts | 25 + src/src/utils/store/createSlice.ts | 33 + src/src/utils/stringToPath.ts | 55 + src/src/utils/toFormatData.ts | 21 + src/src/utils/valueToType/valueToType.test.ts | 27 + src/src/utils/valueToType/valueToType.ts | 39 + src/tasks/bundle-analyzer.js | 27 + src/tasks/cli/README.md | 16 + src/tasks/cli/commands/createComponent.js | 100 + src/tasks/cli/index.js | 9 + src/tasks/cli/src/componentData.js | 53 + src/tasks/index-html-template-generator.js | 14 + src/tsconfig.json | 25 + 1496 files changed, 178626 insertions(+) create mode 100644 src/.editorconfig create mode 100644 src/.eslintrc create mode 100644 src/.gitignore create mode 100644 src/.prettierrc create mode 100644 src/.storybook/main.js create mode 100644 src/.storybook/preview-body.html create mode 100644 src/.storybook/preview-head.html create mode 100644 src/.storybook/preview.js create mode 120000 src/aim_ui/VERSION create mode 100644 src/aim_ui/__init__.py create mode 120000 src/aim_ui/build create mode 100644 src/config-overrides.js create mode 100755 src/package-lock.json create mode 100644 src/package.json create mode 100644 src/public/assets/icomoon/fonts/icomoon.eot create mode 100644 src/public/assets/icomoon/fonts/icomoon.svg create mode 100644 src/public/assets/icomoon/fonts/icomoon.ttf create mode 100644 src/public/assets/icomoon/fonts/icomoon.woff create mode 100644 src/public/assets/icomoon/icomoonIcons.css create mode 100644 src/public/assets/icomoon/selection.json create mode 100644 src/public/assets/inconsolata/fonts/Inconsolata.ttf create mode 100644 src/public/assets/inconsolata/inconsolata.css create mode 100644 src/public/assets/inter/fonts/Inter.ttf create mode 100644 src/public/assets/inter/inter.css create mode 100644 src/public/favicon.ico create mode 100644 src/public/index.html create mode 100644 src/public/manifest.json create mode 100644 src/public/robots.txt create mode 100644 src/setup.py create mode 100644 src/src/App.scss create mode 100644 src/src/App.test.tsx create mode 100644 src/src/App.tsx create mode 100644 src/src/assets/experiments.svg create mode 100644 src/src/assets/icons/arrow-up.svg create mode 100644 src/src/assets/icons/debug.svg create mode 100644 src/src/assets/icons/discord.svg create mode 100644 src/src/assets/icons/github.svg create mode 100644 src/src/assets/icons/notifications/error.svg create mode 100644 src/src/assets/icons/notifications/info.svg create mode 100644 src/src/assets/icons/notifications/success.svg create mode 100644 src/src/assets/icons/notifications/warning.svg create mode 100644 src/src/assets/icons/slack.svg create mode 100644 src/src/assets/illustrations/emptyBookmarks.svg create mode 100644 src/src/assets/illustrations/emptySearch.svg create mode 100644 src/src/assets/illustrations/exploreData.svg create mode 100644 src/src/assets/illustrations/wrongSearch.svg create mode 100644 src/src/assets/logo.svg create mode 100644 src/src/assets/polka-dots.svg create mode 100644 src/src/assets/runs.svg create mode 100644 src/src/components/AggregationPopover/AggregationPopover.scss create mode 100644 src/src/components/AggregationPopover/AggregationPopover.tsx create mode 100644 src/src/components/AppBar/AppBar.scss create mode 100644 src/src/components/AppBar/AppBar.tsx create mode 100644 src/src/components/AttachedTagsList/AttachedTagsList.scss create mode 100644 src/src/components/AttachedTagsList/AttachedTagsList.tsx create mode 100644 src/src/components/AutocompleteInput/AutocompleteInput.d.ts create mode 100644 src/src/components/AutocompleteInput/AutocompleteInput.scss create mode 100644 src/src/components/AutocompleteInput/AutocompleteInput.tsx create mode 100644 src/src/components/AutocompleteInput/index.ts create mode 100644 src/src/components/AxesPropsPopover/AxesPropsPopover.d.ts create mode 100644 src/src/components/AxesPropsPopover/AxesPropsPopover.scss create mode 100644 src/src/components/AxesPropsPopover/AxesPropsPopover.tsx create mode 100644 src/src/components/AxesPropsPopover/config.ts create mode 100644 src/src/components/AxesPropsPopover/index.ts create mode 100644 src/src/components/AxesScalePopover/AxesScalePopover.scss create mode 100644 src/src/components/AxesScalePopover/AxesScalePopover.tsx create mode 100644 src/src/components/BookmarkForm/BookmarkForm.tsx create mode 100644 src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.scss create mode 100644 src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.tsx create mode 100644 src/src/components/ChartLoader/ChartLoader.scss create mode 100644 src/src/components/ChartLoader/ChartLoader.tsx create mode 100644 src/src/components/ChartPanel/ChartGrid/ChartGrid.d.ts create mode 100644 src/src/components/ChartPanel/ChartGrid/ChartGrid.scss create mode 100644 src/src/components/ChartPanel/ChartGrid/ChartGrid.tsx create mode 100644 src/src/components/ChartPanel/ChartGrid/index.ts create mode 100644 src/src/components/ChartPanel/ChartLegends/ChartLegends.d.ts create mode 100644 src/src/components/ChartPanel/ChartLegends/ChartLegends.scss create mode 100644 src/src/components/ChartPanel/ChartLegends/ChartLegends.tsx create mode 100644 src/src/components/ChartPanel/ChartLegends/index.ts create mode 100644 src/src/components/ChartPanel/ChartPanel.scss create mode 100644 src/src/components/ChartPanel/ChartPanel.tsx create mode 100644 src/src/components/ChartPanel/ChartPopover/ChartPopover.scss create mode 100644 src/src/components/ChartPanel/ChartPopover/ChartPopover.tsx create mode 100644 src/src/components/ChartPanel/ChartPopover/index.ts create mode 100644 src/src/components/ChartPanel/PopoverContent/PopoverContent.scss create mode 100644 src/src/components/ChartPanel/PopoverContent/PopoverContent.tsx create mode 100644 src/src/components/ChartPanel/config.ts create mode 100644 src/src/components/Charts/ScatterPlot/Axis/Axis.tsx create mode 100644 src/src/components/Charts/ScatterPlot/Circles/Circles.tsx create mode 100644 src/src/components/Charts/ScatterPlot/ScatterPlot.tsx create mode 100644 src/src/components/Charts/ScatterPlot/config.ts create mode 100644 src/src/components/Charts/ScatterPlot/styles.scss create mode 100644 src/src/components/Charts/ScatterPlot/types.d.ts create mode 100644 src/src/components/Charts/ScatterPlot/util.ts create mode 100644 src/src/components/Charts/ScatterPlot/withResize.tsx create mode 100644 src/src/components/CodeBlock/CodeBlock.scss create mode 100644 src/src/components/CodeBlock/CodeBlock.tsx create mode 100644 src/src/components/CommunityPopup/CommunityPopup.d.ts create mode 100644 src/src/components/CommunityPopup/CommunityPopup.scss create mode 100644 src/src/components/CommunityPopup/CommunityPopup.tsx create mode 100644 src/src/components/CommunityPopup/index.tsx create mode 100644 src/src/components/ConfirmModal/ConfirmModal.scss create mode 100644 src/src/components/ConfirmModal/ConfirmModal.tsx create mode 100644 src/src/components/ContributionsFeed/ContributionsFeed.d.ts create mode 100644 src/src/components/ContributionsFeed/ContributionsFeed.scss create mode 100644 src/src/components/ContributionsFeed/ContributionsFeed.tsx create mode 100644 src/src/components/ContributionsFeed/FeedItem/FeedItem.d.ts create mode 100644 src/src/components/ContributionsFeed/FeedItem/FeedItem.scss create mode 100644 src/src/components/ContributionsFeed/FeedItem/FeedItem.tsx create mode 100644 src/src/components/ContributionsFeed/FeedItem/index.ts create mode 100644 src/src/components/ContributionsFeed/index.ts create mode 100644 src/src/components/ControlPopover/ControlPopover.scss create mode 100644 src/src/components/ControlPopover/ControlPopover.tsx create mode 100644 src/src/components/ControlPopover/index.ts create mode 100644 src/src/components/CopyToClipBoard/CopyToClipBoard.tsx create mode 100644 src/src/components/CustomTable/Table.scss create mode 100644 src/src/components/CustomTable/Table.tsx create mode 100644 src/src/components/CustomTable/TableCell.tsx create mode 100644 src/src/components/CustomTable/TableColumn.tsx create mode 100644 src/src/components/CustomTable/TablePopover.tsx create mode 100644 src/src/components/DepthDropdown/DepthDropdown.d.ts create mode 100644 src/src/components/DepthDropdown/DepthDropdown.scss create mode 100644 src/src/components/DepthDropdown/DepthDropdown.tsx create mode 100644 src/src/components/DepthDropdown/index.tsx create mode 100644 src/src/components/DepthSlider/DepthSlider.d.ts create mode 100644 src/src/components/DepthSlider/DepthSlider.scss create mode 100644 src/src/components/DepthSlider/DepthSlider.tsx create mode 100644 src/src/components/DepthSlider/index.tsx create mode 100644 src/src/components/ErrorBoundary/ErrorBoundary.tsx create mode 100644 src/src/components/ErrorBoundary/index.ts create mode 100644 src/src/components/ExperimentNameBox/ExperimentNameBox.d.ts create mode 100644 src/src/components/ExperimentNameBox/ExperimentNameBox.scss create mode 100644 src/src/components/ExperimentNameBox/ExperimentNameBox.tsx create mode 100644 src/src/components/ExperimentNameBox/index.ts create mode 100644 src/src/components/ExportPreview/ExportPreview.d.ts create mode 100644 src/src/components/ExportPreview/ExportPreview.scss create mode 100644 src/src/components/ExportPreview/ExportPreview.tsx create mode 100644 src/src/components/ExportPreview/config.ts create mode 100644 src/src/components/ExportPreview/index.tsx create mode 100644 src/src/components/GroupConfigPopover/GroupConfigPopover.scss create mode 100644 src/src/components/GroupConfigPopover/GroupConfigPopover.tsx create mode 100644 src/src/components/Grouping/Grouping.scss create mode 100644 src/src/components/Grouping/Grouping.tsx create mode 100644 src/src/components/GroupingItem/GroupingItem.scss create mode 100644 src/src/components/GroupingItem/GroupingItem.tsx create mode 100644 src/src/components/GroupingPopover/GroupingPopover.scss create mode 100644 src/src/components/GroupingPopover/GroupingPopover.tsx create mode 100644 src/src/components/HeatMap/HeatMap.tsx create mode 100644 src/src/components/HeatMap/HeatMapStyle.scss create mode 100644 src/src/components/HighPlot/HighPlot.scss create mode 100644 src/src/components/HighPlot/HighPlot.tsx create mode 100644 src/src/components/HighlightModesPopover/HighlightModePopover.scss create mode 100644 src/src/components/HighlightModesPopover/HighlightModesPopover.tsx create mode 100644 src/src/components/Illustration/Illustration.d.ts create mode 100644 src/src/components/Illustration/Illustration.scss create mode 100644 src/src/components/Illustration/Illustration.tsx create mode 100644 src/src/components/Illustration/config.tsx create mode 100644 src/src/components/Illustration/index.ts create mode 100644 src/src/components/IllustrationBlock/IllustrationBlock.scss create mode 100644 src/src/components/IllustrationBlock/IllustrationBlock.tsx create mode 100644 src/src/components/ImageFullViewPopover/ImageFullViewPopover.tsx create mode 100644 src/src/components/ImageFullViewPopover/index.ts create mode 100644 src/src/components/ImageFullViewPopover/styles.scss create mode 100644 src/src/components/ImageFullViewPopover/types.d.ts create mode 100644 src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.d.ts create mode 100644 src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.scss create mode 100644 src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.tsx create mode 100644 src/src/components/ImagePropertiesPopover/index.ts create mode 100644 src/src/components/LineChart/LineChart.scss create mode 100644 src/src/components/LineChart/LineChart.tsx create mode 100644 src/src/components/LiveUpdateSettings/LiveUpdateSettings.scss create mode 100644 src/src/components/LiveUpdateSettings/LiveUpdateSettings.tsx create mode 100644 src/src/components/MediaList/ImageBox.tsx create mode 100644 src/src/components/MediaList/MediaList.d.ts create mode 100644 src/src/components/MediaList/MediaList.scss create mode 100644 src/src/components/MediaList/MediaList.tsx create mode 100644 src/src/components/MediaList/index.ts create mode 100644 src/src/components/MediaPanel/MediaPanel.d.ts create mode 100644 src/src/components/MediaPanel/MediaPanel.scss create mode 100644 src/src/components/MediaPanel/MediaPanel.tsx create mode 100644 src/src/components/MediaPanel/config.ts create mode 100644 src/src/components/MediaPanel/index.ts create mode 100644 src/src/components/MediaSet/MediaSet.d.ts create mode 100644 src/src/components/MediaSet/MediaSet.scss create mode 100644 src/src/components/MediaSet/MediaSet.tsx create mode 100644 src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.d.ts create mode 100644 src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.scss create mode 100644 src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.tsx create mode 100644 src/src/components/NameAndDescriptionCard/index.ts create mode 100644 src/src/components/NotificationContainer/NotificationContainer.d.ts create mode 100644 src/src/components/NotificationContainer/NotificationContainer.scss create mode 100644 src/src/components/NotificationContainer/NotificationContainer.tsx create mode 100644 src/src/components/NotificationContainer/NotificationContainerStore.ts create mode 100644 src/src/components/NotificationContainer/index.ts create mode 100644 src/src/components/NotificationContainer/useNotificationContainer.tsx create mode 100644 src/src/components/ProgressBar/ProgressBar.d.ts create mode 100644 src/src/components/ProgressBar/ProgressBar.scss create mode 100644 src/src/components/ProgressBar/ProgressBar.tsx create mode 100644 src/src/components/ProjectWrapper/ProjectWrapper.tsx create mode 100644 src/src/components/RangePanel/RangePanel.d.ts create mode 100644 src/src/components/RangePanel/RangePanel.scss create mode 100644 src/src/components/RangePanel/RangePanel.tsx create mode 100644 src/src/components/RangePanel/index.tsx create mode 100644 src/src/components/ReleaseNoteItem/ReleaseNoteItem.d.ts create mode 100644 src/src/components/ReleaseNoteItem/ReleaseNoteItem.scss create mode 100644 src/src/components/ReleaseNoteItem/ReleaseNoteItem.tsx create mode 100644 src/src/components/ResizeElement/ResizableElement.d.ts create mode 100644 src/src/components/ResizeElement/ResizableElement.tsx create mode 100644 src/src/components/ResizeElement/ResizeElement.d.ts create mode 100644 src/src/components/ResizeElement/ResizeElement.scss create mode 100644 src/src/components/ResizeElement/ResizeElement.tsx create mode 100644 src/src/components/ResizeElement/context.ts create mode 100644 src/src/components/ResizeElement/index.ts create mode 100644 src/src/components/ResizeModeActions/ResizeModeActions.scss create mode 100644 src/src/components/ResizeModeActions/ResizeModeActions.tsx create mode 100644 src/src/components/ResizePanel/ResizePanel.scss create mode 100644 src/src/components/ResizePanel/ResizePanel.tsx create mode 100644 src/src/components/ResizingFallback/ResizingFallback.scss create mode 100644 src/src/components/ResizingFallback/ResizingFallback.tsx create mode 100644 src/src/components/ResizingFallback/index.ts create mode 100644 src/src/components/RouteLeavingGuard/RouteLeavingGuard.d.ts create mode 100644 src/src/components/RouteLeavingGuard/RouteLeavingGuard.tsx create mode 100644 src/src/components/RouteLeavingGuard/index.ts create mode 100644 src/src/components/ScatterPlot/ScatterPlot.tsx create mode 100644 src/src/components/ScatterPlot/index.ts create mode 100644 src/src/components/ScatterPlot/styles.scss create mode 100644 src/src/components/ScatterPlot/types.d.ts create mode 100644 src/src/components/SelectTag/SelectTag.scss create mode 100644 src/src/components/SelectTag/SelectTag.tsx create mode 100644 src/src/components/SideBar/SideBar.tsx create mode 100644 src/src/components/SideBar/Sidebar.scss create mode 100644 src/src/components/SliderWithInput/SliderWithInput.scss create mode 100644 src/src/components/SliderWithInput/SliderWithInput.tsx create mode 100644 src/src/components/SliderWithInput/index.ts create mode 100644 src/src/components/SliderWithInput/types.d.ts create mode 100644 src/src/components/SmoothingPopover/SmoothingPopover.scss create mode 100644 src/src/components/SmoothingPopover/SmoothingPopover.tsx create mode 100644 src/src/components/SplitPane/SplitPane.d.ts create mode 100644 src/src/components/SplitPane/SplitPane.scss create mode 100644 src/src/components/SplitPane/SplitPane.tsx create mode 100644 src/src/components/SplitPane/SplitPaneItem.d.ts create mode 100644 src/src/components/SplitPane/SplitPaneItem.tsx create mode 100644 src/src/components/SplitPane/context.ts create mode 100644 src/src/components/SplitPane/index.ts create mode 100644 src/src/components/StatisticsBar/StatisticsBar.d.ts create mode 100644 src/src/components/StatisticsBar/StatisticsBar.scss create mode 100644 src/src/components/StatisticsBar/StatisticsBar.tsx create mode 100644 src/src/components/StatisticsBar/index.ts create mode 100644 src/src/components/StatisticsCard/StatisticsCard.d.ts create mode 100644 src/src/components/StatisticsCard/StatisticsCard.scss create mode 100644 src/src/components/StatisticsCard/StatisticsCard.tsx create mode 100644 src/src/components/StatisticsCard/index.ts create mode 100644 src/src/components/StatusLabel/StatusLabel.tsx create mode 100644 src/src/components/StatusLabel/index.ts create mode 100644 src/src/components/StatusLabel/styles.scss create mode 100644 src/src/components/StatusLabel/types.d.ts create mode 100644 src/src/components/StepsDensityPopover/StepsDensityPopover.tsx create mode 100644 src/src/components/TabPanel/TabPanel.tsx create mode 100644 src/src/components/Table/ArchiveModal.tsx create mode 100644 src/src/components/Table/AutoResizer.tsx create mode 100644 src/src/components/Table/BaseTable.scss create mode 100644 src/src/components/Table/BaseTable.tsx create mode 100644 src/src/components/Table/Column.tsx create mode 100644 src/src/components/Table/ColumnManager.ts create mode 100644 src/src/components/Table/ColumnResizer.tsx create mode 100644 src/src/components/Table/DeleteModal.tsx create mode 100644 src/src/components/Table/ExpandIcon.tsx create mode 100644 src/src/components/Table/GridTable.tsx create mode 100644 src/src/components/Table/GroupedColumnHeader.tsx create mode 100644 src/src/components/Table/RunNameColumn.tsx create mode 100644 src/src/components/Table/SortIndicator.tsx create mode 100644 src/src/components/Table/SortOrder.ts create mode 100644 src/src/components/Table/Table.scss create mode 100644 src/src/components/Table/Table.tsx create mode 100644 src/src/components/Table/TableCell.tsx create mode 100644 src/src/components/Table/TableHeader.tsx create mode 100644 src/src/components/Table/TableHeaderCell.tsx create mode 100644 src/src/components/Table/TableHeaderRow.tsx create mode 100644 src/src/components/Table/TableRow.tsx create mode 100644 src/src/components/Table/TableSortIcons.tsx create mode 100644 src/src/components/Table/utils.ts create mode 100644 src/src/components/TableLoader/TableLoader.scss create mode 100644 src/src/components/TableLoader/TableLoader.tsx create mode 100644 src/src/components/TagForm/TagForm.scss create mode 100644 src/src/components/TagForm/TagForm.tsx create mode 100644 src/src/components/Theme/Theme.tsx create mode 100644 src/src/components/TooltipContentPopover/TooltipContentPopover.scss create mode 100644 src/src/components/TooltipContentPopover/TooltipContentPopover.tsx create mode 100644 src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.d.ts create mode 100644 src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.scss create mode 100644 src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.tsx create mode 100644 src/src/components/TrendlineOptionsPopover/index.ts create mode 100644 src/src/components/VisualizationLegends/VisualizationLegends.d.ts create mode 100644 src/src/components/VisualizationLegends/VisualizationLegends.scss create mode 100644 src/src/components/VisualizationLegends/VisualizationLegends.tsx create mode 100644 src/src/components/VisualizationLegends/index.ts create mode 100644 src/src/components/VisualizationTooltip/VisualizationTooltip.d.ts create mode 100644 src/src/components/VisualizationTooltip/VisualizationTooltip.scss create mode 100644 src/src/components/VisualizationTooltip/VisualizationTooltip.tsx create mode 100644 src/src/components/VisualizationTooltip/index.ts create mode 100644 src/src/components/ZoomInPopover/ZoomInPopover.scss create mode 100644 src/src/components/ZoomInPopover/ZoomInPopover.tsx create mode 100644 src/src/components/ZoomOutPopover/ZoomOutPopover.scss create mode 100644 src/src/components/ZoomOutPopover/ZoomOutPopover.tsx create mode 100644 src/src/components/kit/ActionCard/ActionCard.d.ts create mode 100644 src/src/components/kit/ActionCard/ActionCard.scss create mode 100644 src/src/components/kit/ActionCard/ActionCard.tsx create mode 100644 src/src/components/kit/ActionCard/index.tsx create mode 100644 src/src/components/kit/AlertBanner/AlertBanner.d.ts create mode 100644 src/src/components/kit/AlertBanner/AlertBanner.scss create mode 100644 src/src/components/kit/AlertBanner/AlertBanner.tsx create mode 100644 src/src/components/kit/AlertBanner/config.ts create mode 100644 src/src/components/kit/AlertBanner/index.ts create mode 100644 src/src/components/kit/AudioBox/AudioBox.d.ts create mode 100644 src/src/components/kit/AudioBox/AudioBox.scss create mode 100644 src/src/components/kit/AudioBox/AudioBox.tsx create mode 100644 src/src/components/kit/AudioBox/index.ts create mode 100644 src/src/components/kit/AutoSuggestions/AutoSuggestions.d.ts create mode 100644 src/src/components/kit/AutoSuggestions/AutoSuggestions.scss create mode 100644 src/src/components/kit/AutoSuggestions/AutoSuggestions.tsx create mode 100644 src/src/components/kit/AutoSuggestions/index.ts create mode 100644 src/src/components/kit/Badge/Badge.d.ts create mode 100644 src/src/components/kit/Badge/Badge.scss create mode 100644 src/src/components/kit/Badge/Badge.tsx create mode 100644 src/src/components/kit/Badge/index.ts create mode 100644 src/src/components/kit/Button/Button.d.ts create mode 100644 src/src/components/kit/Button/Button.scss create mode 100644 src/src/components/kit/Button/Button.tsx create mode 100644 src/src/components/kit/Button/index.ts create mode 100644 src/src/components/kit/Card/Card.d.ts create mode 100644 src/src/components/kit/Card/Card.scss create mode 100644 src/src/components/kit/Card/Card.tsx create mode 100644 src/src/components/kit/Card/index.tsx create mode 100644 src/src/components/kit/DataList/DataList.d.ts create mode 100644 src/src/components/kit/DataList/DataList.scss create mode 100644 src/src/components/kit/DataList/DataList.tsx create mode 100644 src/src/components/kit/DataList/SearchBar/SearchBar.scss create mode 100644 src/src/components/kit/DataList/SearchBar/SearchBar.tsx create mode 100644 src/src/components/kit/DataList/SearchBar/SearchInput/EndAdornment.tsx create mode 100644 src/src/components/kit/DataList/SearchBar/SearchInput/SearchInput.scss create mode 100644 src/src/components/kit/DataList/SearchBar/SearchInput/index.tsx create mode 100644 src/src/components/kit/DataList/SearchBar/index.ts create mode 100644 src/src/components/kit/DataList/SearchBar/types.d.ts create mode 100644 src/src/components/kit/DataList/SearchBar/useTextSearch.ts create mode 100644 src/src/components/kit/DataList/index.tsx create mode 100644 src/src/components/kit/DictVisualizer/DictVisualizer.d.ts create mode 100644 src/src/components/kit/DictVisualizer/DictVisualizer.scss create mode 100644 src/src/components/kit/DictVisualizer/DictVisualizer.tsx create mode 100644 src/src/components/kit/DictVisualizer/index.ts create mode 100644 src/src/components/kit/Dropdown/Dropdown.d.ts create mode 100644 src/src/components/kit/Dropdown/Dropdown.scss create mode 100644 src/src/components/kit/Dropdown/Dropdown.tsx create mode 100644 src/src/components/kit/Dropdown/DropdownCustomOption.tsx create mode 100644 src/src/components/kit/Dropdown/config.ts create mode 100644 src/src/components/kit/Dropdown/index.ts create mode 100644 src/src/components/kit/Icon/Icon.d.ts create mode 100644 src/src/components/kit/Icon/Icon.scss create mode 100644 src/src/components/kit/Icon/Icon.tsx create mode 100644 src/src/components/kit/Icon/index.ts create mode 100644 src/src/components/kit/Input/Input.d.ts create mode 100644 src/src/components/kit/Input/Input.scss create mode 100644 src/src/components/kit/Input/Input.test.tsx create mode 100644 src/src/components/kit/Input/Input.tsx create mode 100644 src/src/components/kit/Input/__snapshots__/Input.test.tsx.snap create mode 100644 src/src/components/kit/Input/config.ts create mode 100644 src/src/components/kit/Input/index.tsx create mode 100644 src/src/components/kit/JsonViewPopover/JsonViewPopover.tsx create mode 100644 src/src/components/kit/JsonViewPopover/index.ts create mode 100644 src/src/components/kit/JsonViewPopover/styles.scss create mode 100644 src/src/components/kit/JsonViewPopover/types.d.ts create mode 100644 src/src/components/kit/ListItem/Index.ts create mode 100644 src/src/components/kit/ListItem/ListItem.d.ts create mode 100644 src/src/components/kit/ListItem/ListItem.tsx create mode 100644 src/src/components/kit/Menu/Menu.scss create mode 100644 src/src/components/kit/Menu/Menu.tsx create mode 100644 src/src/components/kit/Menu/MenuItem.tsx create mode 100644 src/src/components/kit/Menu/index.ts create mode 100644 src/src/components/kit/Menu/types.d.ts create mode 100644 src/src/components/kit/Modal/Modal.d.ts create mode 100644 src/src/components/kit/Modal/Modal.scss create mode 100644 src/src/components/kit/Modal/Modal.tsx create mode 100644 src/src/components/kit/Modal/index.tsx create mode 100644 src/src/components/kit/SelectDropdown/SelectDropdown.d.ts create mode 100644 src/src/components/kit/SelectDropdown/SelectDropdown.scss create mode 100644 src/src/components/kit/SelectDropdown/SelectDropdown.tsx create mode 100644 src/src/components/kit/SelectDropdown/index.tsx create mode 100644 src/src/components/kit/Slider/Slider.d.ts create mode 100644 src/src/components/kit/Slider/Slider.scss create mode 100644 src/src/components/kit/Slider/Slider.tsx create mode 100644 src/src/components/kit/Slider/index.ts create mode 100644 src/src/components/kit/Spinner/Spinner.d.ts create mode 100644 src/src/components/kit/Spinner/Spinner.scss create mode 100644 src/src/components/kit/Spinner/Spinner.tsx create mode 100644 src/src/components/kit/Spinner/index.tsx create mode 100644 src/src/components/kit/Switcher/Switcher.d.ts create mode 100644 src/src/components/kit/Switcher/Switcher.scss create mode 100644 src/src/components/kit/Switcher/Switcher.test.tsx create mode 100644 src/src/components/kit/Switcher/Switcher.tsx create mode 100644 src/src/components/kit/Switcher/__snapshots__/Switcher.test.tsx.snap create mode 100644 src/src/components/kit/Switcher/index.ts create mode 100644 src/src/components/kit/Test/Test.test.tsx create mode 100644 src/src/components/kit/Test/Test.tsx create mode 100644 src/src/components/kit/Test/__snapshots__/Test.test.tsx.snap create mode 100644 src/src/components/kit/Test/index.ts create mode 100644 src/src/components/kit/Test/styles.scss create mode 100644 src/src/components/kit/Test/types.d.ts create mode 100644 src/src/components/kit/Text/Text.d.ts create mode 100644 src/src/components/kit/Text/Text.scss create mode 100644 src/src/components/kit/Text/Text.tsx create mode 100644 src/src/components/kit/Text/index.ts create mode 100644 src/src/components/kit/ToggleButton/ToggleButton.d.ts create mode 100644 src/src/components/kit/ToggleButton/ToggleButton.scss create mode 100644 src/src/components/kit/ToggleButton/ToggleButton.tsx create mode 100644 src/src/components/kit/ToggleButton/index.ts create mode 100644 src/src/components/kit/index.ts create mode 100644 src/src/components/kit_v2/Badge/Badge.d.ts create mode 100644 src/src/components/kit_v2/Badge/Badge.style.ts create mode 100644 src/src/components/kit_v2/Badge/Badge.tsx create mode 100644 src/src/components/kit_v2/Badge/index.ts create mode 100644 src/src/components/kit_v2/Box/Box.d.ts create mode 100644 src/src/components/kit_v2/Box/Box.tsx create mode 100644 src/src/components/kit_v2/Box/index.ts create mode 100644 src/src/components/kit_v2/Button/Button.d.ts create mode 100644 src/src/components/kit_v2/Button/Button.style.ts create mode 100644 src/src/components/kit_v2/Button/Button.test.tsx create mode 100644 src/src/components/kit_v2/Button/Button.tsx create mode 100644 src/src/components/kit_v2/Button/buttonConfig.ts create mode 100644 src/src/components/kit_v2/Button/index.ts create mode 100644 src/src/components/kit_v2/ButtonGroup/ButtonGroup.d.ts create mode 100644 src/src/components/kit_v2/ButtonGroup/ButtonGroup.style.ts create mode 100644 src/src/components/kit_v2/ButtonGroup/ButtonGroup.tsx create mode 100644 src/src/components/kit_v2/ButtonGroup/index.ts create mode 100644 src/src/components/kit_v2/Checkbox/Checkbox.d.ts create mode 100644 src/src/components/kit_v2/Checkbox/Checkbox.style.ts create mode 100644 src/src/components/kit_v2/Checkbox/Checkbox.tsx create mode 100644 src/src/components/kit_v2/Checkbox/index.ts create mode 100644 src/src/components/kit_v2/ControlsButton/ControlsButton.d.ts create mode 100644 src/src/components/kit_v2/ControlsButton/ControlsButton.style.ts create mode 100644 src/src/components/kit_v2/ControlsButton/ControlsButton.tsx create mode 100644 src/src/components/kit_v2/ControlsButton/index.ts create mode 100644 src/src/components/kit_v2/Dialog/Dialog.d.ts create mode 100644 src/src/components/kit_v2/Dialog/Dialog.style.ts create mode 100644 src/src/components/kit_v2/Dialog/Dialog.test.tsx create mode 100644 src/src/components/kit_v2/Dialog/Dialog.tsx create mode 100644 src/src/components/kit_v2/Dialog/index.ts create mode 100644 src/src/components/kit_v2/Icon/Icon.d.ts create mode 100644 src/src/components/kit_v2/Icon/Icon.style.ts create mode 100644 src/src/components/kit_v2/Icon/Icon.test.tsx create mode 100644 src/src/components/kit_v2/Icon/Icon.tsx create mode 100644 src/src/components/kit_v2/Icon/__snapshots__/Icon.test.tsx.snap create mode 100644 src/src/components/kit_v2/Icon/index.ts create mode 100644 src/src/components/kit_v2/IconButton/IconButton.d.ts create mode 100644 src/src/components/kit_v2/IconButton/IconButton.style.ts create mode 100644 src/src/components/kit_v2/IconButton/IconButton.test.tsx create mode 100644 src/src/components/kit_v2/IconButton/IconButton.tsx create mode 100644 src/src/components/kit_v2/IconButton/__snapshots__/IconButton.test.tsx.snap create mode 100644 src/src/components/kit_v2/IconButton/index.ts create mode 100644 src/src/components/kit_v2/Input/Input.d.ts create mode 100644 src/src/components/kit_v2/Input/Input.style.ts create mode 100644 src/src/components/kit_v2/Input/Input.tsx create mode 100644 src/src/components/kit_v2/Input/index.ts create mode 100644 src/src/components/kit_v2/ListItem/ListItem.d.ts create mode 100644 src/src/components/kit_v2/ListItem/ListItem.style.ts create mode 100644 src/src/components/kit_v2/ListItem/ListItem.tsx create mode 100644 src/src/components/kit_v2/ListItem/index.ts create mode 100644 src/src/components/kit_v2/Popover/Popover.d.ts create mode 100644 src/src/components/kit_v2/Popover/Popover.style.ts create mode 100644 src/src/components/kit_v2/Popover/Popover.tsx create mode 100644 src/src/components/kit_v2/Popover/index.ts create mode 100644 src/src/components/kit_v2/QueryBadge/QueryBadge.d.ts create mode 100644 src/src/components/kit_v2/QueryBadge/QueryBadge.style.ts create mode 100644 src/src/components/kit_v2/QueryBadge/QueryBadge.tsx create mode 100644 src/src/components/kit_v2/QueryBadge/index.ts create mode 100644 src/src/components/kit_v2/Radio/Radio.d.ts create mode 100644 src/src/components/kit_v2/Radio/Radio.style.ts create mode 100644 src/src/components/kit_v2/Radio/Radio.tsx create mode 100644 src/src/components/kit_v2/Radio/index.ts create mode 100644 src/src/components/kit_v2/Select/Select.d.ts create mode 100644 src/src/components/kit_v2/Select/Select.test.tsx create mode 100644 src/src/components/kit_v2/Select/Select.tsx create mode 100644 src/src/components/kit_v2/Select/SelectItem.tsx create mode 100644 src/src/components/kit_v2/Select/index.ts create mode 100644 src/src/components/kit_v2/Separator/Separator.d.ts create mode 100644 src/src/components/kit_v2/Separator/Separator.style.ts create mode 100644 src/src/components/kit_v2/Separator/Separator.test.tsx create mode 100644 src/src/components/kit_v2/Separator/Separator.tsx create mode 100644 src/src/components/kit_v2/Separator/__snapshots__/Separator.test.tsx.snap create mode 100644 src/src/components/kit_v2/Separator/index.ts create mode 100644 src/src/components/kit_v2/Slider/Slider.d.ts create mode 100644 src/src/components/kit_v2/Slider/Slider.style.ts create mode 100644 src/src/components/kit_v2/Slider/Slider.test.tsx create mode 100644 src/src/components/kit_v2/Slider/Slider.tsx create mode 100644 src/src/components/kit_v2/Slider/__snapshots__/Slider.test.tsx.snap create mode 100644 src/src/components/kit_v2/Slider/index.ts create mode 100644 src/src/components/kit_v2/Switch/Switch.d.ts create mode 100644 src/src/components/kit_v2/Switch/Switch.style.ts create mode 100644 src/src/components/kit_v2/Switch/Switch.tsx create mode 100644 src/src/components/kit_v2/Switch/index.ts create mode 100644 src/src/components/kit_v2/Text/Text.d.ts create mode 100644 src/src/components/kit_v2/Text/Text.style.ts create mode 100644 src/src/components/kit_v2/Text/Text.tsx create mode 100644 src/src/components/kit_v2/Text/index.ts create mode 100644 src/src/components/kit_v2/Toast/Toast.d.ts create mode 100644 src/src/components/kit_v2/Toast/Toast.style.ts create mode 100644 src/src/components/kit_v2/Toast/Toast.test.tsx create mode 100644 src/src/components/kit_v2/Toast/Toast.tsx create mode 100644 src/src/components/kit_v2/Toast/ToastProvider.tsx create mode 100644 src/src/components/kit_v2/Toast/index.ts create mode 100644 src/src/components/kit_v2/ToggleButton/ToggleButton.d.ts create mode 100644 src/src/components/kit_v2/ToggleButton/ToggleButton.style.ts create mode 100644 src/src/components/kit_v2/ToggleButton/ToggleButton.tsx create mode 100644 src/src/components/kit_v2/ToggleButton/index.ts create mode 100644 src/src/components/kit_v2/Tooltip/Tooltip.d.ts create mode 100644 src/src/components/kit_v2/Tooltip/Tooltip.style.ts create mode 100644 src/src/components/kit_v2/Tooltip/Tooltip.test.tsx create mode 100644 src/src/components/kit_v2/Tooltip/Tooltip.tsx create mode 100644 src/src/components/kit_v2/Tooltip/__snapshots__/Tooltip.test.tsx.snap create mode 100644 src/src/components/kit_v2/Tooltip/index.ts create mode 100644 src/src/components/kit_v2/Tree/Tree.d.ts create mode 100644 src/src/components/kit_v2/Tree/Tree.style.ts create mode 100644 src/src/components/kit_v2/Tree/Tree.tsx create mode 100644 src/src/components/kit_v2/Tree/index.ts create mode 100644 src/src/components/kit_v2/index.ts create mode 100644 src/src/components/kit_v2/utils/getButtonStyles.ts create mode 100644 src/src/components/kit_v2/utils/getHiglightedText.tsx create mode 100644 src/src/config/analytics/analyticsKeysMap.ts create mode 100644 src/src/config/charts/index.ts create mode 100644 src/src/config/colors/colors.ts create mode 100644 src/src/config/config.ts create mode 100644 src/src/config/controls/controlsDefaultConfig.ts create mode 100644 src/src/config/dash-arrays/dashArrays.ts create mode 100644 src/src/config/dates/dates.ts create mode 100644 src/src/config/enums/densityEnum.ts create mode 100644 src/src/config/enums/imageEnums.ts create mode 100644 src/src/config/enums/requestStatusEnum.ts create mode 100644 src/src/config/enums/routesEnum.ts create mode 100644 src/src/config/enums/tableEnums.ts create mode 100644 src/src/config/grouping/GroupingPopovers.ts create mode 100644 src/src/config/illustrationConfig/illustrationConfig.tsx create mode 100644 src/src/config/mediaConfigs/mediaConfigs.ts create mode 100644 src/src/config/monacoConfig/monacoConfig.ts create mode 100644 src/src/config/notification-messages/notificationMessages.ts create mode 100644 src/src/config/pageTitles/pageTitles.ts create mode 100644 src/src/config/references/index.ts create mode 100644 src/src/config/stitches/animations.ts create mode 100644 src/src/config/stitches/global.ts create mode 100644 src/src/config/stitches/index.ts create mode 100644 src/src/config/stitches/media.ts create mode 100644 src/src/config/stitches/theme.ts create mode 100644 src/src/config/stitches/types.ts create mode 100644 src/src/config/stitches/utils.ts create mode 100644 src/src/config/systemMetrics/systemMetrics.ts create mode 100644 src/src/config/table/tableConfigs.ts create mode 100644 src/src/hooks/index.ts create mode 100644 src/src/hooks/useCodeHighlighter.ts create mode 100644 src/src/hooks/useCopy.ts create mode 100644 src/src/hooks/useFontSize.ts create mode 100644 src/src/hooks/useModel.ts create mode 100644 src/src/hooks/usePanelResize.ts create mode 100644 src/src/hooks/useParamsSuggestions.ts create mode 100644 src/src/hooks/window/index.ts create mode 100644 src/src/hooks/window/useAnimationFrame.ts create mode 100644 src/src/hooks/window/useResizeObserver.ts create mode 100644 src/src/hooks/window/useWindowResize.ts create mode 100644 src/src/index.tsx create mode 100644 src/src/modules/BaseExplorer/README.md create mode 100644 src/src/modules/BaseExplorer/components/AudioBox/AudioBox.d.ts create mode 100644 src/src/modules/BaseExplorer/components/AudioBox/AudioBox.scss create mode 100644 src/src/modules/BaseExplorer/components/AudioBox/AudioBox.tsx create mode 100644 src/src/modules/BaseExplorer/components/AudioBox/AudioBoxProgress.tsx create mode 100644 src/src/modules/BaseExplorer/components/AudioBox/AudioBoxVolume.tsx create mode 100644 src/src/modules/BaseExplorer/components/AudioBox/index.tsx create mode 100644 src/src/modules/BaseExplorer/components/BoxFullViewPopover/BoxFullViewPopover.d.ts create mode 100644 src/src/modules/BaseExplorer/components/BoxFullViewPopover/BoxFullViewPopover.scss create mode 100644 src/src/modules/BaseExplorer/components/BoxFullViewPopover/BoxFullViewPopover.tsx create mode 100644 src/src/modules/BaseExplorer/components/BoxFullViewPopover/index.ts create mode 100644 src/src/modules/BaseExplorer/components/BoxVirtualizer/BoxVirtualizer.d.ts create mode 100644 src/src/modules/BaseExplorer/components/BoxVirtualizer/BoxVirtualizer.scss create mode 100644 src/src/modules/BaseExplorer/components/BoxVirtualizer/BoxVirtualizer.tsx create mode 100644 src/src/modules/BaseExplorer/components/BoxVirtualizer/index.ts create mode 100644 src/src/modules/BaseExplorer/components/BoxWrapper/Box.tsx create mode 100644 src/src/modules/BaseExplorer/components/BoxWrapper/BoxWithStacking.tsx create mode 100644 src/src/modules/BaseExplorer/components/BoxWrapper/BoxWrapper.d.ts create mode 100644 src/src/modules/BaseExplorer/components/BoxWrapper/BoxWrapper.scss create mode 100644 src/src/modules/BaseExplorer/components/BoxWrapper/BoxWrapper.tsx create mode 100644 src/src/modules/BaseExplorer/components/BoxWrapper/index.ts create mode 100644 src/src/modules/BaseExplorer/components/CaptionBox/CaptionBox.d.ts create mode 100644 src/src/modules/BaseExplorer/components/CaptionBox/CaptionBox.scss create mode 100644 src/src/modules/BaseExplorer/components/CaptionBox/CaptionBox.tsx create mode 100644 src/src/modules/BaseExplorer/components/CaptionBox/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Aggregation/Aggregation.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Aggregation/Aggregation.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/Aggregation/Popover/AggregationPopover.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Aggregation/Popover/AggregationPopover.scss create mode 100644 src/src/modules/BaseExplorer/components/Controls/Aggregation/Popover/AggregationPopover.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/Aggregation/Popover/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Aggregation/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/BoxProperties/BoxProperties.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/BoxProperties/BoxProperties.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/BoxProperties/Popover/BoxPropertiesPopover.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/BoxProperties/Popover/BoxPropertiesPopover.scss create mode 100644 src/src/modules/BaseExplorer/components/Controls/BoxProperties/Popover/BoxPropertiesPopover.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/BoxProperties/Popover/index.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/BoxProperties/index.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/CaptionProperties/CaptionProperties.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/CaptionProperties/CaptionProperties.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/CaptionProperties/CaptionPropertiesPopover/CaptionPropertiesPopover.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/CaptionProperties/CaptionPropertiesPopover/CaptionPropertiesPopover.scss create mode 100644 src/src/modules/BaseExplorer/components/Controls/CaptionProperties/CaptionPropertiesPopover/CaptionPropertiesPopover.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/CaptionProperties/CaptionPropertiesPopover/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/CaptionProperties/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureAxes/ConfigureAxes.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureAxes/ConfigureAxes.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureAxes/Popover/Alignment.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureAxes/Popover/AxesRange.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureAxes/Popover/AxesType.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureAxes/Popover/ConfigureAxesPopover.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureAxes/Popover/ConfigureAxesPopover.scss create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureAxes/Popover/ConfigureAxesPopover.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureAxes/Popover/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureAxes/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureTooltip/ConfigureTooltip.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureTooltip/ConfigureTooltip.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureTooltip/Popover/ConfigureTooltipPopover.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureTooltip/Popover/ConfigureTooltipPopover.scss create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureTooltip/Popover/ConfigureTooltipPopover.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureTooltip/Popover/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/ConfigureTooltip/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Controls.scss create mode 100644 src/src/modules/BaseExplorer/components/Controls/Controls.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/Highlighting/Highlighting.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Highlighting/Highlighting.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/Highlighting/Popover/HighlightingPopover.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Highlighting/Popover/HighlightingPopover.scss create mode 100644 src/src/modules/BaseExplorer/components/Controls/Highlighting/Popover/HighlightingPopover.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/Highlighting/Popover/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Highlighting/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/IgnoreOutliers/IgnoreOutliers.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/IgnoreOutliers/IgnoreOutliers.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/IgnoreOutliers/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Legends/Legends.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Legends/Legends.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/Legends/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Smoothing/Popover/SmoothingPopover.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Smoothing/Popover/SmoothingPopover.scss create mode 100644 src/src/modules/BaseExplorer/components/Controls/Smoothing/Popover/SmoothingPopover.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/Smoothing/Popover/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Smoothing/Smoothing.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Smoothing/Smoothing.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/Smoothing/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/TextRendererMode/Popover/TextRendererModePopover.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/TextRendererMode/Popover/TextRendererModePopover.scss create mode 100644 src/src/modules/BaseExplorer/components/Controls/TextRendererMode/Popover/TextRendererModePopover.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/TextRendererMode/Popover/index.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/TextRendererMode/TextRendererMode.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/TextRendererMode/TextRendererMode.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/TextRendererMode/index.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/Zoom/Popover/ZoomInPopover/ZoomInPopover.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Zoom/Popover/ZoomInPopover/ZoomInPopover.scss create mode 100644 src/src/modules/BaseExplorer/components/Controls/Zoom/Popover/ZoomInPopover/ZoomInPopover.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/Zoom/Popover/ZoomInPopover/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Zoom/Popover/ZoomOutPopover/ZoomOutPopover.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Zoom/Popover/ZoomOutPopover/ZoomOutPopover.scss create mode 100644 src/src/modules/BaseExplorer/components/Controls/Zoom/Popover/ZoomOutPopover/ZoomOutPopover.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/Zoom/Popover/ZoomOutPopover/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Zoom/Popover/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Zoom/Zoom.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/Zoom/Zoom.tsx create mode 100644 src/src/modules/BaseExplorer/components/Controls/Zoom/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Controls/index.tsx create mode 100644 src/src/modules/BaseExplorer/components/Explorer/Explorer.tsx create mode 100644 src/src/modules/BaseExplorer/components/Explorer/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Explorer/styles.scss create mode 100644 src/src/modules/BaseExplorer/components/ExplorerBar/ExplorerBar.scss create mode 100644 src/src/modules/BaseExplorer/components/ExplorerBar/ExplorerBar.tsx create mode 100644 src/src/modules/BaseExplorer/components/ExplorerBar/index.ts create mode 100644 src/src/modules/BaseExplorer/components/ExplorerNotifications/ExplorerNotifications.scss create mode 100644 src/src/modules/BaseExplorer/components/ExplorerNotifications/ExplorerNotifications.tsx create mode 100644 src/src/modules/BaseExplorer/components/ExplorerNotifications/config.tsx create mode 100644 src/src/modules/BaseExplorer/components/ExplorerNotifications/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Figures/Figures.tsx create mode 100644 src/src/modules/BaseExplorer/components/Figures/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Grouping/Grouping/Grouping.scss create mode 100644 src/src/modules/BaseExplorer/components/Grouping/Grouping/Grouping.tsx create mode 100644 src/src/modules/BaseExplorer/components/Grouping/Grouping/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Grouping/GroupingItem/GroupingItem.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Grouping/GroupingItem/GroupingItem.scss create mode 100644 src/src/modules/BaseExplorer/components/Grouping/GroupingItem/GroupingItem.tsx create mode 100644 src/src/modules/BaseExplorer/components/Grouping/GroupingItem/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Grouping/GroupingPopover/GroupingPopover.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Grouping/GroupingPopover/GroupingPopover.scss create mode 100644 src/src/modules/BaseExplorer/components/Grouping/GroupingPopover/GroupingPopover.tsx create mode 100644 src/src/modules/BaseExplorer/components/Grouping/GroupingPopover/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Grouping/index.tsx create mode 100644 src/src/modules/BaseExplorer/components/Metrics/Metrics.tsx create mode 100644 src/src/modules/BaseExplorer/components/Metrics/hooks/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Metrics/hooks/useAggregateChartData.tsx create mode 100644 src/src/modules/BaseExplorer/components/Metrics/hooks/useAlignMetricsData.tsx create mode 100644 src/src/modules/BaseExplorer/components/Metrics/hooks/useSetChartData.tsx create mode 100644 src/src/modules/BaseExplorer/components/Metrics/hooks/useSmoothChartData.tsx create mode 100644 src/src/modules/BaseExplorer/components/Metrics/hooks/useSyncHoverState.tsx create mode 100644 src/src/modules/BaseExplorer/components/Metrics/index.ts create mode 100644 src/src/modules/BaseExplorer/components/ProgressBar/ProgressBarWrapper.tsx create mode 100644 src/src/modules/BaseExplorer/components/ProgressBar/index.tsx create mode 100644 src/src/modules/BaseExplorer/components/QueryForm/QueryForm.scss create mode 100644 src/src/modules/BaseExplorer/components/QueryForm/QueryForm.tsx create mode 100644 src/src/modules/BaseExplorer/components/QueryForm/SearchButton/SearchButton.d.ts create mode 100644 src/src/modules/BaseExplorer/components/QueryForm/SearchButton/SearchButton.tsx create mode 100644 src/src/modules/BaseExplorer/components/QueryForm/SearchButton/index.ts create mode 100644 src/src/modules/BaseExplorer/components/QueryForm/index.ts create mode 100644 src/src/modules/BaseExplorer/components/RangePanel/RangePanel.d.ts create mode 100644 src/src/modules/BaseExplorer/components/RangePanel/RangePanel.scss create mode 100644 src/src/modules/BaseExplorer/components/RangePanel/RangePanel.tsx create mode 100644 src/src/modules/BaseExplorer/components/RangePanel/RangePanelItem.tsx create mode 100644 src/src/modules/BaseExplorer/components/RangePanel/helpers.ts create mode 100644 src/src/modules/BaseExplorer/components/RangePanel/index.tsx create mode 100644 src/src/modules/BaseExplorer/components/TextBox/TextBox.scss create mode 100644 src/src/modules/BaseExplorer/components/TextBox/TextBox.tsx create mode 100644 src/src/modules/BaseExplorer/components/Visualizations/Visualizations.scss create mode 100644 src/src/modules/BaseExplorer/components/Visualizations/Visualizations.tsx create mode 100644 src/src/modules/BaseExplorer/components/Visualizations/index.tsx create mode 100644 src/src/modules/BaseExplorer/components/Visualizer/Visualizer.scss create mode 100644 src/src/modules/BaseExplorer/components/Visualizer/Visualizer.tsx create mode 100644 src/src/modules/BaseExplorer/components/Visualizer/hooks/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Visualizer/hooks/useDepthMap.ts create mode 100644 src/src/modules/BaseExplorer/components/Visualizer/index.tsx create mode 100644 src/src/modules/BaseExplorer/components/VisualizerPanel/VisualizerPanel.d.ts create mode 100644 src/src/modules/BaseExplorer/components/VisualizerPanel/VisualizerPanel.scss create mode 100644 src/src/modules/BaseExplorer/components/VisualizerPanel/VisualizerPanel.tsx create mode 100644 src/src/modules/BaseExplorer/components/VisualizerPanel/index.tsx create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerLegends/VisualizerLegends.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerLegends/VisualizerLegends.scss create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerLegends/VisualizerLegends.tsx create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerLegends/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/TooltipContent/AppearanceActionButtons/AppearanceActionButtons.scss create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/TooltipContent/AppearanceActionButtons/AppearanceActionButtons.tsx create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/TooltipContent/RunAdditionalInfo/RunAdditionalInfo.scss create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/TooltipContent/RunAdditionalInfo/RunAdditionalInfo.tsx create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/TooltipContent/SelectedFields/SelectedFields.scss create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/TooltipContent/SelectedFields/SelectedFields.tsx create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/TooltipContent/SelectedGroupingFields/SelectedGroupingFields.scss create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/TooltipContent/SelectedGroupingFields/SelectedGroupingFields.tsx create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/TooltipContent/TooltipContent.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/TooltipContent/TooltipContent.scss create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/TooltipContent/TooltipContent.tsx create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/TooltipContent/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/VisualizerTooltip.d.ts create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/VisualizerTooltip.tsx create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/getTooltipContent.ts create mode 100644 src/src/modules/BaseExplorer/components/Widgets/VisualizerTooltip/index.ts create mode 100644 src/src/modules/BaseExplorer/components/Widgets/index.ts create mode 100644 src/src/modules/BaseExplorer/components/index.tsx create mode 100644 src/src/modules/BaseExplorer/getDefaultHydration.tsx create mode 100644 src/src/modules/BaseExplorer/index.tsx create mode 100644 src/src/modules/BaseExplorer/styles.scss create mode 100644 src/src/modules/BaseExplorer/types.ts create mode 100644 src/src/modules/BaseExplorer/utils/getBaseExplorerStaticContent.tsx create mode 100644 src/src/modules/core/AimError.ts create mode 100644 src/src/modules/core/api/dashboardsApi/index.ts create mode 100644 src/src/modules/core/api/dashboardsApi/types.ts create mode 100644 src/src/modules/core/api/experimentsApi/index.ts create mode 100644 src/src/modules/core/api/experimentsApi/types.ts create mode 100644 src/src/modules/core/api/projectApi/index.ts create mode 100644 src/src/modules/core/api/projectApi/types.ts create mode 100644 src/src/modules/core/api/releaseNotesApi/index.ts create mode 100644 src/src/modules/core/api/releaseNotesApi/types.ts create mode 100644 src/src/modules/core/api/runsApi/index.ts create mode 100644 src/src/modules/core/api/runsApi/types.ts create mode 100644 src/src/modules/core/api/tagsApi/index.ts create mode 100644 src/src/modules/core/api/tagsApi/types.ts create mode 100644 src/src/modules/core/cache/index.ts create mode 100644 src/src/modules/core/cache/inlineCache.ts create mode 100644 src/src/modules/core/cache/memoize.ts create mode 100644 src/src/modules/core/engine/blob-uri-system/index.ts create mode 100644 src/src/modules/core/engine/custom-states/index.ts create mode 100644 src/src/modules/core/engine/event-system/index.ts create mode 100644 src/src/modules/core/engine/event-system/state.ts create mode 100644 src/src/modules/core/engine/explorer-engine/index.ts create mode 100644 src/src/modules/core/engine/explorer/groupings/index.ts create mode 100644 src/src/modules/core/engine/explorer/groupings/state.ts create mode 100644 src/src/modules/core/engine/explorer/index.ts create mode 100644 src/src/modules/core/engine/explorer/query/index.ts create mode 100644 src/src/modules/core/engine/explorer/query/state.ts create mode 100644 src/src/modules/core/engine/explorer/state/controls.ts create mode 100644 src/src/modules/core/engine/instructions/index.ts create mode 100644 src/src/modules/core/engine/instructions/state.ts create mode 100644 src/src/modules/core/engine/notifications/index.ts create mode 100644 src/src/modules/core/engine/notifications/state.ts create mode 100644 src/src/modules/core/engine/pipeline/index.ts create mode 100644 src/src/modules/core/engine/pipeline/state.ts create mode 100644 src/src/modules/core/engine/types.ts create mode 100644 src/src/modules/core/engine/visualizations/controls.ts create mode 100644 src/src/modules/core/engine/visualizations/index.ts create mode 100644 src/src/modules/core/pipeline/PipelineError.ts create mode 100644 src/src/modules/core/pipeline/adapter/AdapterError.ts create mode 100644 src/src/modules/core/pipeline/adapter/collectQueryableData.ts create mode 100644 src/src/modules/core/pipeline/adapter/depthInterceptors.ts create mode 100644 src/src/modules/core/pipeline/adapter/index.ts create mode 100644 src/src/modules/core/pipeline/adapter/processor.ts create mode 100644 src/src/modules/core/pipeline/adapter/types.ts create mode 100644 src/src/modules/core/pipeline/custom/index.ts create mode 100644 src/src/modules/core/pipeline/grouping/GroupingError.ts create mode 100644 src/src/modules/core/pipeline/grouping/getGroupValues.ts create mode 100644 src/src/modules/core/pipeline/grouping/group.ts create mode 100644 src/src/modules/core/pipeline/grouping/index.ts create mode 100644 src/src/modules/core/pipeline/index.ts create mode 100644 src/src/modules/core/pipeline/query/QueryError.ts create mode 100644 src/src/modules/core/pipeline/query/index.ts create mode 100644 src/src/modules/core/pipeline/query/types.ts create mode 100644 src/src/modules/core/pipeline/types.ts create mode 100644 src/src/modules/core/services/browserHistory.ts create mode 100644 src/src/modules/core/utils/createResource.ts create mode 100644 src/src/modules/core/utils/getQueryFromRanges.ts create mode 100644 src/src/modules/core/utils/getQueryParamsFromState.ts create mode 100644 src/src/modules/core/utils/getQueryStringFromSelect.ts create mode 100644 src/src/modules/core/utils/getSelectFormOptions.ts create mode 100644 src/src/modules/core/utils/getUpdatedUrl.ts create mode 100644 src/src/modules/core/utils/getUrlSearchParam.ts create mode 100644 src/src/modules/core/utils/hashing.ts create mode 100644 src/src/modules/core/utils/removeExampleTypesFromProjects.ts create mode 100644 src/src/modules/core/utils/store.ts create mode 100644 src/src/pages/AudiosExplorer/config.ts create mode 100644 src/src/pages/AudiosExplorer/getStaticContent.tsx create mode 100644 src/src/pages/AudiosExplorer/index.tsx create mode 100644 src/src/pages/Bookmarks/Bookmarks.scss create mode 100644 src/src/pages/Bookmarks/Bookmarks.tsx create mode 100644 src/src/pages/Bookmarks/BookmarksContainer.tsx create mode 100644 src/src/pages/Bookmarks/components/BookmarkCard/BookmarkCard.scss create mode 100644 src/src/pages/Bookmarks/components/BookmarkCard/BookmarkCard.tsx create mode 100644 src/src/pages/Dashboard/Dashboard.scss create mode 100644 src/src/pages/Dashboard/Dashboard.tsx create mode 100644 src/src/pages/Dashboard/components/ActiveRunsTable/ActiveRunsStore.ts create mode 100644 src/src/pages/Dashboard/components/ActiveRunsTable/ActiveRunsTable.scss create mode 100644 src/src/pages/Dashboard/components/ActiveRunsTable/ActiveRunsTable.tsx create mode 100644 src/src/pages/Dashboard/components/ActiveRunsTable/useActiveRunsTable.tsx create mode 100644 src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.scss create mode 100644 src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.tsx create mode 100644 src/src/pages/Dashboard/components/AimIntegrations/index.ts create mode 100644 src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeed.tsx create mode 100644 src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeedStore.ts create mode 100644 src/src/pages/Dashboard/components/DashboardContributionsFeed/index.ts create mode 100644 src/src/pages/Dashboard/components/DashboardContributionsFeed/useDashboardContributionsFeed.ts create mode 100644 src/src/pages/Dashboard/components/DashboardRight/DashboardRight.scss create mode 100644 src/src/pages/Dashboard/components/DashboardRight/DashboardRight.tsx create mode 100644 src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.scss create mode 100644 src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.tsx create mode 100644 src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuidesStore.ts create mode 100644 src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.scss create mode 100644 src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.tsx create mode 100644 src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleasesStore.ts create mode 100644 src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/useReleaseNotes.ts create mode 100644 src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.scss create mode 100644 src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.tsx create mode 100644 src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarksStore.ts create mode 100644 src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/useDashboardBookmarks.tsx create mode 100644 src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.d.ts create mode 100644 src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.scss create mode 100644 src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.tsx create mode 100644 src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsStore.ts create mode 100644 src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/index.ts create mode 100644 src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/useExperimentsCard.tsx create mode 100644 src/src/pages/Dashboard/components/ExploreSection/ExploreSection.scss create mode 100644 src/src/pages/Dashboard/components/ExploreSection/ExploreSection.tsx create mode 100644 src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.scss create mode 100644 src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.tsx create mode 100644 src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearchItem.tsx create mode 100644 src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.scss create mode 100644 src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.tsx create mode 100644 src/src/pages/Dashboard/components/ExploreSection/RecentSearches/useRecentSearches.ts create mode 100644 src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.d.ts create mode 100644 src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.scss create mode 100644 src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.tsx create mode 100644 src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsStore.ts create mode 100644 src/src/pages/Dashboard/components/ExploreSection/TagsCard/useTagsCard.tsx create mode 100644 src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.scss create mode 100644 src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.tsx create mode 100644 src/src/pages/Dashboard/components/ProjectContributions/ProjectContributionsStore.ts create mode 100644 src/src/pages/Dashboard/components/ProjectContributions/useProjectContributions.tsx create mode 100644 src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.d.ts create mode 100644 src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.scss create mode 100644 src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.tsx create mode 100644 src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatisticsStore.ts create mode 100644 src/src/pages/Dashboard/components/ProjectStatistics/index.tsx create mode 100644 src/src/pages/Dashboard/components/ProjectStatistics/useProjectStatistics.tsx create mode 100644 src/src/pages/Dashboard/components/QuickStart/QuickStart.scss create mode 100644 src/src/pages/Dashboard/components/QuickStart/QuickStart.tsx create mode 100644 src/src/pages/Dashboard/components/QuickStart/index.ts create mode 100644 src/src/pages/Experiment/Experiment.scss create mode 100644 src/src/pages/Experiment/Experiment.tsx create mode 100644 src/src/pages/Experiment/ExperimentStore.ts create mode 100644 src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.d.ts create mode 100644 src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.scss create mode 100644 src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentHeader/index.ts create mode 100644 src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.d.ts create mode 100644 src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.scss create mode 100644 src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentNavigationPopover/index.ts create mode 100644 src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesEngine.ts create mode 100644 src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.d.ts create mode 100644 src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.scss create mode 100644 src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentNotesTab/index.ts create mode 100644 src/src/pages/Experiment/components/ExperimentNotesTab/useExperimentNotes.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.d.ts create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.scss create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributionsStore.ts create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/index.ts create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/useExperimentContributions.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.d.ts create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeedStore.ts create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/index.ts create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/useExperimentContributionsFeed.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.d.ts create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.scss create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/index.ts create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.d.ts create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.scss create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.d.ts create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.scss create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/index.ts create mode 100644 src/src/pages/Experiment/components/ExperimentOverviewTab/index.ts create mode 100644 src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsStore.ts create mode 100644 src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.d.ts create mode 100644 src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.scss create mode 100644 src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.d.ts create mode 100644 src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.scss create mode 100644 src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/index.ts create mode 100644 src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/useExperimentRunsTable.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentRunsTab/index.ts create mode 100644 src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.d.ts create mode 100644 src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.scss create mode 100644 src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.tsx create mode 100644 src/src/pages/Experiment/components/ExperimentSettingsTab/index.ts create mode 100644 src/src/pages/Experiment/useExperimentState.tsx create mode 100644 src/src/pages/FiguresExplorer/config.ts create mode 100644 src/src/pages/FiguresExplorer/getStaticContent.tsx create mode 100644 src/src/pages/FiguresExplorer/index.tsx create mode 100644 src/src/pages/ImagesExplore/ImagesExplore.scss create mode 100644 src/src/pages/ImagesExplore/ImagesExplore.tsx create mode 100644 src/src/pages/ImagesExplore/components/Controls/Controls.scss create mode 100644 src/src/pages/ImagesExplore/components/Controls/Controls.tsx create mode 100644 src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.scss create mode 100644 src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.tsx create mode 100644 src/src/pages/ImagesExplore/components/ImagesExploreTableGrid/ImagesExploreTableGrid.tsx create mode 100644 src/src/pages/ImagesExplore/components/SelectForm/SelectForm.scss create mode 100644 src/src/pages/ImagesExplore/components/SelectForm/SelectForm.tsx create mode 100644 src/src/pages/Metrics/Metrics.scss create mode 100644 src/src/pages/Metrics/Metrics.tsx create mode 100644 src/src/pages/Metrics/MetricsContainer.tsx create mode 100644 src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.scss create mode 100644 src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.tsx create mode 100644 src/src/pages/Metrics/components/Controls/Controls.scss create mode 100644 src/src/pages/Metrics/components/Controls/Controls.tsx create mode 100644 src/src/pages/Metrics/components/MetricsBar/MetricsBar.scss create mode 100644 src/src/pages/Metrics/components/MetricsBar/MetricsBar.tsx create mode 100644 src/src/pages/Metrics/components/MetricsTableGrid/MetricsTableGrid.tsx create mode 100644 src/src/pages/Metrics/components/SelectForm/SelectForm.scss create mode 100644 src/src/pages/Metrics/components/SelectForm/SelectForm.tsx create mode 100644 src/src/pages/Metrics/components/StrokePopover/StrokePopoverAdvanced.scss create mode 100644 src/src/pages/Metrics/components/StrokePopover/StrokePopoverAdvanced.tsx create mode 100644 src/src/pages/Metrics/components/Table/CompareSelectedRunsPopover/CompareSelectedRunsPopover.d.ts create mode 100644 src/src/pages/Metrics/components/Table/CompareSelectedRunsPopover/CompareSelectedRunsPopover.scss create mode 100644 src/src/pages/Metrics/components/Table/CompareSelectedRunsPopover/CompareSelectedRunsPopover.tsx create mode 100644 src/src/pages/Metrics/components/Table/CompareSelectedRunsPopover/index.ts create mode 100644 src/src/pages/Metrics/components/Table/HideRowsPopover/HideRowsPopover.scss create mode 100644 src/src/pages/Metrics/components/Table/HideRowsPopover/HideRowsPopover.tsx create mode 100644 src/src/pages/Metrics/components/Table/ManageColumnsPopover/ColumnItem/ColumnItem.d.ts create mode 100644 src/src/pages/Metrics/components/Table/ManageColumnsPopover/ColumnItem/ColumnItem.scss create mode 100644 src/src/pages/Metrics/components/Table/ManageColumnsPopover/ColumnItem/ColumnItem.tsx create mode 100644 src/src/pages/Metrics/components/Table/ManageColumnsPopover/ManageColumns.d.ts create mode 100644 src/src/pages/Metrics/components/Table/ManageColumnsPopover/ManageColumnsPopover.scss create mode 100644 src/src/pages/Metrics/components/Table/ManageColumnsPopover/ManageColumnsPopover.tsx create mode 100644 src/src/pages/Metrics/components/Table/MetricsValueKeyPopover/MetricsValueKeyPopover.scss create mode 100644 src/src/pages/Metrics/components/Table/MetricsValueKeyPopover/MetricsValueKeyPopover.tsx create mode 100644 src/src/pages/Metrics/components/Table/MetricsValueKeyPopover/index.ts create mode 100644 src/src/pages/Metrics/components/Table/RowHeightPopover/RowHeightPopover.scss create mode 100644 src/src/pages/Metrics/components/Table/RowHeightPopover/RowHeightPopover.tsx create mode 100644 src/src/pages/Metrics/components/Table/SortPopover/SortPopover.scss create mode 100644 src/src/pages/Metrics/components/Table/SortPopover/SortPopover.tsx create mode 100644 src/src/pages/Metrics/components/Table/SortPopover/SortPopoverList.tsx create mode 100644 src/src/pages/MetricsExplorer/TooltipContentHeader.tsx create mode 100644 src/src/pages/MetricsExplorer/config.tsx create mode 100644 src/src/pages/MetricsExplorer/getStaticContent.tsx create mode 100644 src/src/pages/MetricsExplorer/index.ts create mode 100644 src/src/pages/PageWrapper.tsx create mode 100644 src/src/pages/Params/Params.scss create mode 100644 src/src/pages/Params/Params.tsx create mode 100644 src/src/pages/Params/ParamsContainer.tsx create mode 100644 src/src/pages/Params/components/Controls/Controls.scss create mode 100644 src/src/pages/Params/components/Controls/Controls.tsx create mode 100644 src/src/pages/Params/components/ParamsTableGrid/ParamsTableGrid.tsx create mode 100644 src/src/pages/Params/components/SelectForm/SelectForm.scss create mode 100644 src/src/pages/Params/components/SelectForm/SelectForm.tsx create mode 100644 src/src/pages/RunDetail/AudiosVisualizer/AudiosVisualizer.scss create mode 100644 src/src/pages/RunDetail/AudiosVisualizer/AudiosVisualizer.tsx create mode 100644 src/src/pages/RunDetail/AudiosVisualizer/index.ts create mode 100644 src/src/pages/RunDetail/DistributionsVisualizer/DistributionVisualizer.tsx create mode 100644 src/src/pages/RunDetail/DistributionsVisualizer/DistributionsVisualizer.scss create mode 100644 src/src/pages/RunDetail/DistributionsVisualizer/index.ts create mode 100644 src/src/pages/RunDetail/DistributionsVisualizer/temp/Heatmap/Heatmap.js create mode 100644 src/src/pages/RunDetail/DistributionsVisualizer/temp/Histogram/Histogram.jsx create mode 100644 src/src/pages/RunDetail/DistributionsVisualizer/temp/Wrapper.jsx create mode 100644 src/src/pages/RunDetail/ImagesVisualizer/ImagesVisualizer.scss create mode 100644 src/src/pages/RunDetail/ImagesVisualizer/ImagesVisualizer.tsx create mode 100644 src/src/pages/RunDetail/ImagesVisualizer/index.ts create mode 100644 src/src/pages/RunDetail/NotesTab/types.d.ts create mode 100644 src/src/pages/RunDetail/PlotlyVisualizer/PlotlyVisualizer.scss create mode 100644 src/src/pages/RunDetail/PlotlyVisualizer/PlotlyVisualizer.tsx create mode 100644 src/src/pages/RunDetail/PlotlyVisualizer/index.ts create mode 100644 src/src/pages/RunDetail/RunDetail.scss create mode 100644 src/src/pages/RunDetail/RunDetail.tsx create mode 100644 src/src/pages/RunDetail/RunDetailMetricsAndSystemTab.tsx create mode 100644 src/src/pages/RunDetail/RunDetailNotesTab/NoteTooltip.tsx create mode 100644 src/src/pages/RunDetail/RunDetailNotesTab/RunDetailNotesTab.scss create mode 100644 src/src/pages/RunDetail/RunDetailNotesTab/RunDetailNotesTab.tsx create mode 100644 src/src/pages/RunDetail/RunDetailNotesTab/index.ts create mode 100644 src/src/pages/RunDetail/RunDetailNotesTab/types.d.ts create mode 100644 src/src/pages/RunDetail/RunDetailParamsTab.tsx create mode 100644 src/src/pages/RunDetail/RunDetailSettingsTab/RunDetailSettingsTab.scss create mode 100644 src/src/pages/RunDetail/RunDetailSettingsTab/RunDetailSettingsTab.tsx create mode 100644 src/src/pages/RunDetail/RunDetailSettingsTab/index.ts create mode 100644 src/src/pages/RunDetail/RunDetailSettingsTab/types.d.ts create mode 100644 src/src/pages/RunDetail/RunLogRecords/LogRecordItem/LogRecordItem.d.ts create mode 100644 src/src/pages/RunDetail/RunLogRecords/LogRecordItem/LogRecordItem.scss create mode 100644 src/src/pages/RunDetail/RunLogRecords/LogRecordItem/LogRecordItem.tsx create mode 100644 src/src/pages/RunDetail/RunLogRecords/LogRecordItem/config.ts create mode 100644 src/src/pages/RunDetail/RunLogRecords/LogRecordItem/index.ts create mode 100644 src/src/pages/RunDetail/RunLogRecords/RunLogRecords.d.ts create mode 100644 src/src/pages/RunDetail/RunLogRecords/RunLogRecords.scss create mode 100644 src/src/pages/RunDetail/RunLogRecords/RunLogRecords.tsx create mode 100644 src/src/pages/RunDetail/RunLogRecords/RunLogRecordsStore.ts create mode 100644 src/src/pages/RunDetail/RunLogRecords/index.ts create mode 100644 src/src/pages/RunDetail/RunLogRecords/useRunLogRecords.tsx create mode 100644 src/src/pages/RunDetail/RunLogsTab/LogRow.tsx create mode 100644 src/src/pages/RunDetail/RunLogsTab/RunLogsTab.d.ts create mode 100644 src/src/pages/RunDetail/RunLogsTab/RunLogsTab.scss create mode 100644 src/src/pages/RunDetail/RunLogsTab/RunLogsTab.tsx create mode 100644 src/src/pages/RunDetail/RunLogsTab/index.tsx create mode 100644 src/src/pages/RunDetail/RunMetricCard.tsx create mode 100644 src/src/pages/RunDetail/RunOverviewTab/RunOverviewTab.d.ts create mode 100644 src/src/pages/RunDetail/RunOverviewTab/RunOverviewTab.scss create mode 100644 src/src/pages/RunDetail/RunOverviewTab/RunOverviewTab.tsx create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/ArtifactsCard/RunOverviewTabArtifactsCard.d.ts create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/ArtifactsCard/RunOverviewTabArtifactsCard.tsx create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/CLIArgumentsCard/RunOverviewTabCLIArgumentsCard.d.ts create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/CLIArgumentsCard/RunOverviewTabCLIArgumentsCard.scss create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/CLIArgumentsCard/RunOverviewTabCLIArgumentsCard.tsx create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/EnvVariablesCard/RunOverviewTabEnvVariablesCard.d.ts create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/EnvVariablesCard/RunOverviewTabEnvVariablesCard.tsx create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/GitInfoCard/GitInfoCard.d.ts create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/GitInfoCard/GitInfoCard.scss create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/GitInfoCard/index.tsx create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/MetricsCard/RunOverviewTabMetricsCard.tsx create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/Packages/RunOverviewTabPackagesCard.d.ts create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/Packages/RunOverviewTabPackagesCard.tsx create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/ParamsCard/RunOverviewTabParamsCard.tsx create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/RunOverviewSidebar/RunOverviewSidebar.d.ts create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/RunOverviewSidebar/RunOverviewSidebar.scss create mode 100644 src/src/pages/RunDetail/RunOverviewTab/components/RunOverviewSidebar/RunOverviewSidebar.tsx create mode 100644 src/src/pages/RunDetail/RunOverviewTab/index.tsx create mode 100644 src/src/pages/RunDetail/RunSelectPopoverContent.tsx create mode 100644 src/src/pages/RunDetail/TextsVisualizer/TextsVisualizer.scss create mode 100644 src/src/pages/RunDetail/TextsVisualizer/TextsVisualizer.tsx create mode 100644 src/src/pages/RunDetail/TextsVisualizer/index.ts create mode 100644 src/src/pages/RunDetail/TraceVisualizationContainer/TraceVisualizationContainer.scss create mode 100644 src/src/pages/RunDetail/TraceVisualizationContainer/TraceVisualizationContainer.tsx create mode 100644 src/src/pages/RunDetail/TraceVisualizationContainer/index.tsx create mode 100644 src/src/pages/RunDetail/TraceVisualizationContainer/withEmptyTraceCheck.tsx create mode 100644 src/src/pages/RunDetail/hooks/useNotesResizePanel.tsx create mode 100644 src/src/pages/RunDetail/hooks/useRunMetricsBatch.tsx create mode 100644 src/src/pages/RunDetail/types.d.ts create mode 100644 src/src/pages/Runs/Runs.scss create mode 100644 src/src/pages/Runs/Runs.tsx create mode 100644 src/src/pages/Runs/RunsContainer.tsx create mode 100644 src/src/pages/Runs/RunsTable.tsx create mode 100644 src/src/pages/Runs/components/RunsBar/RunsBar.tsx create mode 100644 src/src/pages/Runs/components/RunsTableGrid/RunsTableGrid.tsx create mode 100644 src/src/pages/Runs/components/SearchBar/SearchBar.scss create mode 100644 src/src/pages/Runs/components/SearchBar/SearchBar.tsx create mode 100644 src/src/pages/Scatters/Scatters.scss create mode 100644 src/src/pages/Scatters/Scatters.tsx create mode 100644 src/src/pages/Scatters/ScattersContainer.tsx create mode 100644 src/src/pages/Scatters/components/Controls/Controls.scss create mode 100644 src/src/pages/Scatters/components/Controls/Controls.tsx create mode 100644 src/src/pages/Scatters/components/SelectForm/SelectForm.scss create mode 100644 src/src/pages/Scatters/components/SelectForm/SelectForm.tsx create mode 100644 src/src/pages/Tags/TagDelete.tsx create mode 100644 src/src/pages/Tags/TagDetail.tsx create mode 100644 src/src/pages/Tags/TagRunsTable.tsx create mode 100644 src/src/pages/Tags/TagSoftDelete.tsx create mode 100644 src/src/pages/Tags/Tags.scss create mode 100644 src/src/pages/Tags/Tags.tsx create mode 100644 src/src/pages/Tags/TagsContainer.tsx create mode 100644 src/src/pages/Tags/TagsList.tsx create mode 100644 src/src/pages/Tags/TagsTable.tsx create mode 100644 src/src/pages/TextExplorer/getStaticContent.tsx create mode 100644 src/src/pages/TextExplorer/index.tsx create mode 100644 src/src/pages/TextExplorer/textConfig.tsx create mode 100644 src/src/react-app-env.d.ts create mode 100644 src/src/reportWebVitals.ts create mode 100644 src/src/routes/routes.tsx create mode 100644 src/src/services/NetworkService/index.ts create mode 100644 src/src/services/NetworkService/interceptors/exceptionDetector.ts create mode 100644 src/src/services/NetworkService/types.ts create mode 100644 src/src/services/analytics.ts create mode 100644 src/src/services/api/api.ts create mode 100644 src/src/services/api/apps/appsService.ts create mode 100644 src/src/services/api/audiosExplore/audiosExplore.ts create mode 100644 src/src/services/api/dashboard/dashboardService.ts create mode 100644 src/src/services/api/endpoints.ts create mode 100644 src/src/services/api/experiments/experimentsService.ts create mode 100644 src/src/services/api/imagesExplore/imagesExploreService.ts create mode 100644 src/src/services/api/metrics/metricsMock.ts create mode 100644 src/src/services/api/metrics/metricsService.ts create mode 100644 src/src/services/api/notes/notesService.ts create mode 100644 src/src/services/api/projects/projectsService.ts create mode 100644 src/src/services/api/runs/paramsMock.ts create mode 100644 src/src/services/api/runs/runsService.ts create mode 100644 src/src/services/api/tags/tagsService.ts create mode 100644 src/src/services/live-update/README.md create mode 100644 src/src/services/live-update/Worker.ts create mode 100644 src/src/services/live-update/examples/LiveUpdateBridge.example.js create mode 100644 src/src/services/live-update/index.ts create mode 100644 src/src/services/live-update/types.ts create mode 100644 src/src/services/live-update/utils.ts create mode 100644 src/src/services/models/bookmarks/bookmarksAppModel.ts create mode 100644 src/src/services/models/explorer/config.ts create mode 100644 src/src/services/models/explorer/createAppModel.ts create mode 100644 src/src/services/models/explorer/index.ts create mode 100644 src/src/services/models/explorer/metricsModelMethods.ts create mode 100644 src/src/services/models/explorer/paramsModelMethods.ts create mode 100644 src/src/services/models/explorer/runsModelMethods.ts create mode 100644 src/src/services/models/explorer/scattersModelMethods.ts create mode 100644 src/src/services/models/imagesExplore/imagesExploreAppModel.ts create mode 100644 src/src/services/models/media/blobsURIModel.ts create mode 100644 src/src/services/models/metrics/metricModel.ts create mode 100644 src/src/services/models/metrics/metricsAppModel.ts create mode 100644 src/src/services/models/metrics/runModel.ts create mode 100644 src/src/services/models/model.ts create mode 100644 src/src/services/models/notes/notesModel.ts create mode 100644 src/src/services/models/params/paramsAppModel.ts create mode 100644 src/src/services/models/projects/projectsModel.ts create mode 100644 src/src/services/models/runs/runDetailAppModel.ts create mode 100644 src/src/services/models/runs/runTracesModel.ts create mode 100644 src/src/services/models/runs/runsAppModel.ts create mode 100644 src/src/services/models/runs/settings.ts create mode 100644 src/src/services/models/runs/types.d.ts create mode 100644 src/src/services/models/runs/util.test.ts create mode 100644 src/src/services/models/runs/util.ts create mode 100644 src/src/services/models/scatters/mockData.ts create mode 100644 src/src/services/models/scatters/scattersAppModel.ts create mode 100644 src/src/services/models/tags/tagsAppModel.ts create mode 100644 src/src/setupTests.ts create mode 100644 src/src/stories/Badge.stories.tsx create mode 100644 src/src/stories/Box.stories.tsx create mode 100644 src/src/stories/Button.stories.tsx create mode 100644 src/src/stories/Checkbox.stories.tsx create mode 100644 src/src/stories/ControlsButton.stories.tsx create mode 100644 src/src/stories/Dialog.stories.tsx create mode 100644 src/src/stories/Icon.stories.tsx create mode 100644 src/src/stories/IconButton.stories.tsx create mode 100644 src/src/stories/Input.stories.tsx create mode 100644 src/src/stories/ListItem.stories.tsx create mode 100644 src/src/stories/QueryBadge.stories.tsx create mode 100644 src/src/stories/Radio.stories.tsx create mode 100644 src/src/stories/Select.stories.tsx create mode 100644 src/src/stories/Separator.stories.tsx create mode 100644 src/src/stories/Slider.stories.tsx create mode 100644 src/src/stories/Switch.stories.tsx create mode 100644 src/src/stories/Text.stories.tsx create mode 100644 src/src/stories/Toast.stories.tsx create mode 100644 src/src/stories/ToggleButton.stories.tsx create mode 100644 src/src/stories/Tooltip.stories.tsx create mode 100644 src/src/stories/Tree.stories.tsx create mode 100644 src/src/styles/_global.scss create mode 100644 src/src/styles/_utils.scss create mode 100644 src/src/styles/abstracts/_functions.scss create mode 100644 src/src/styles/abstracts/_index.scss create mode 100644 src/src/styles/abstracts/_mixins.scss create mode 100644 src/src/styles/abstracts/_variables.scss create mode 100644 src/src/styles/base/_reset.scss create mode 100644 src/src/styles/components/_autocomplete.scss create mode 100644 src/src/styles/components/_inputs.scss create mode 100644 src/src/styles/components/_tooltip.scss create mode 100644 src/src/tests/hooks/model/createModel.test.ts create mode 100644 src/src/tests/hooks/model/useModel.test.ts create mode 100644 src/src/tests/utils/app/getFilteredSystemMetrics.test.ts create mode 100644 src/src/tests/utils/app/getSystemMetricsFromColumns.test.ts create mode 100644 src/src/tests/utils/index.ts create mode 100644 src/src/types/components/AggregationPopover/AggregationPopover.d.ts create mode 100644 src/src/types/components/AppBar/AppBar.d.ts create mode 100644 src/src/types/components/AttachedTagsList/AttachedTagsList.d.ts create mode 100644 src/src/types/components/AxesScalePopover/AxesScalePopover.d.ts create mode 100644 src/src/types/components/BookmarkForm/BookmarkForm.d.ts create mode 100644 src/src/types/components/BusyLoaderWrapper/BusyLoaderWrapper.d.ts create mode 100644 src/src/types/components/ChartLoader/ChartLoader.d.ts create mode 100644 src/src/types/components/ChartPanel/ChartPanel.d.ts create mode 100644 src/src/types/components/ChartPanel/ChartPopover.d.ts create mode 100644 src/src/types/components/ChartPanel/PopoverContent.d.ts create mode 100644 src/src/types/components/CodeBlock/CodeBlock.d.ts create mode 100644 src/src/types/components/ColorPopoverAdvanced/ColorPopoverAdvanced.d.ts create mode 100644 src/src/types/components/ConfirmModal/ConfirmModal.d.ts create mode 100644 src/src/types/components/ControlPopover/ControlPopover.d.ts create mode 100644 src/src/types/components/CopyToClipBoard/CopyToClipBoard.d.ts create mode 100644 src/src/types/components/ErrorBoundary/ErrorBoundary.d.ts create mode 100644 src/src/types/components/GroupConfigPopover/GroupConfigPopover.d.ts create mode 100644 src/src/types/components/GroupingPopover/GroupingPopover.d.ts create mode 100644 src/src/types/components/HighPlot/HighPlot.d.ts create mode 100644 src/src/types/components/HighlightModesPopover/HighlightModesPopover.d.ts create mode 100644 src/src/types/components/IllustrationBlock/IllustrationBlock.d.ts create mode 100644 src/src/types/components/LineChart/LineChart.d.ts create mode 100644 src/src/types/components/MultiSelect/MultiSelect.d.ts create mode 100644 src/src/types/components/NotificationContainer/NotificationContainer.d.ts create mode 100644 src/src/types/components/ResizeModeActions/ResizeModeActions.d.ts create mode 100644 src/src/types/components/ResizePanel/ResizePanel.d.ts create mode 100644 src/src/types/components/SelectTag/SelectTag.d.ts create mode 100644 src/src/types/components/SmoothingPopover/SmoothingPopover.d.ts create mode 100644 src/src/types/components/TabPanel/TabPanel.d.ts create mode 100644 src/src/types/components/Table/Table.d.ts create mode 100644 src/src/types/components/TagForm/TagForm.d.ts create mode 100644 src/src/types/components/Theme/Theme.d.ts create mode 100644 src/src/types/components/TooltipContentPopover/TooltipContentPopover.d.ts create mode 100644 src/src/types/components/ZoomInPopover/ZoomInPopover.d.ts create mode 100644 src/src/types/components/ZoomOutPopover/ZoomOutPopover.d.ts create mode 100644 src/src/types/core/AimObjects/AimFlatObjectBase.d.ts create mode 100644 src/src/types/core/AimObjects/Audio.d.ts create mode 100644 src/src/types/core/AimObjects/CustomObject.d.ts create mode 100644 src/src/types/core/AimObjects/Distribution.d.ts create mode 100644 src/src/types/core/AimObjects/Figure.d.ts create mode 100644 src/src/types/core/AimObjects/Image.d.ts create mode 100644 src/src/types/core/AimObjects/Metric.d.ts create mode 100644 src/src/types/core/AimObjects/Run.d.ts create mode 100644 src/src/types/core/AimObjects/Sequence.d.ts create mode 100644 src/src/types/core/AimObjects/index.d.ts create mode 100644 src/src/types/core/enums/index.ts create mode 100644 src/src/types/core/shared/index.d.ts create mode 100644 src/src/types/global.d.ts create mode 100644 src/src/types/pages/bookmarks/Bookmarks.d.ts create mode 100644 src/src/types/pages/bookmarks/components/BookmarkCard.d.ts create mode 100644 src/src/types/pages/components/Grouping/Grouping.d.ts create mode 100644 src/src/types/pages/components/GroupingItem/GroupingItem.d.ts create mode 100644 src/src/types/pages/imagesExplore/components/Controls/Controls.d.ts create mode 100644 src/src/types/pages/imagesExplore/components/SelectForm/SelectForm.d.ts create mode 100644 src/src/types/pages/metrics/Metrics.d.ts create mode 100644 src/src/types/pages/metrics/components/Controls/Controls.d.ts create mode 100644 src/src/types/pages/metrics/components/MetricsBar/MetricsBar.d.ts create mode 100644 src/src/types/pages/metrics/components/SelectForm/SelectForm.d.ts create mode 100644 src/src/types/pages/metrics/components/SortPopover/SortPopover.d.ts create mode 100644 src/src/types/pages/metrics/components/TableColumns/TableColumns.d.ts create mode 100644 src/src/types/pages/params/Params.d.ts create mode 100644 src/src/types/pages/params/components/Controls/Controls.d.ts create mode 100644 src/src/types/pages/params/components/SelectForm/SelectForm.d.ts create mode 100644 src/src/types/pages/runs/Runs.d.ts create mode 100644 src/src/types/pages/scatters/Scatters.d.ts create mode 100644 src/src/types/pages/scatters/components/Controls/Controls.d.ts create mode 100644 src/src/types/pages/scatters/components/SelectForm/SelectForm.d.ts create mode 100644 src/src/types/pages/tags/Tags.d.ts create mode 100644 src/src/types/services/models/bookmarks/bookmarksAppModel.d.ts create mode 100644 src/src/types/services/models/explorer/createAppModel.d.ts create mode 100644 src/src/types/services/models/imagesExplore/imagesExploreAppModel.d.ts create mode 100644 src/src/types/services/models/metrics/metricModel.d.ts create mode 100644 src/src/types/services/models/metrics/metricsAppModel.d.ts create mode 100644 src/src/types/services/models/metrics/runModel.d.ts create mode 100644 src/src/types/services/models/model.d.ts create mode 100644 src/src/types/services/models/notes/notes.d.ts create mode 100644 src/src/types/services/models/params/paramsAppModel.d.ts create mode 100644 src/src/types/services/models/projects/projectsModel.d.ts create mode 100644 src/src/types/services/models/runs/runsAppModel.d.ts create mode 100644 src/src/types/services/models/scatter/scatterAppModel.d.ts create mode 100644 src/src/types/services/services.d.ts create mode 100644 src/src/types/utils/aggregateGroupData.d.ts create mode 100644 src/src/types/utils/common.d.ts create mode 100644 src/src/types/utils/d3/clearArea.d.ts create mode 100644 src/src/types/utils/d3/drawArea.d.ts create mode 100644 src/src/types/utils/d3/drawAxes.d.ts create mode 100644 src/src/types/utils/d3/drawBrush.d.ts create mode 100644 src/src/types/utils/d3/drawHoverAttributes.d.ts create mode 100644 src/src/types/utils/d3/drawLines.d.ts create mode 100644 src/src/types/utils/d3/drawParallelAxes.d.ts create mode 100644 src/src/types/utils/d3/drawParallelAxesBrush.d.ts create mode 100644 src/src/types/utils/d3/drawParallelColorIndicator.d.ts create mode 100644 src/src/types/utils/d3/drawParallelHoverAttributes.d.ts create mode 100644 src/src/types/utils/d3/drawParallelLines.d.ts create mode 100644 src/src/types/utils/d3/drawPoints.d.ts create mode 100644 src/src/types/utils/d3/getAxisScale.d.ts create mode 100644 src/src/types/utils/d3/processLineChartData.d.ts create mode 100644 src/src/types/utils/formatSystemMetricName.d.ts create mode 100644 src/src/types/utils/getImageBoxSize.d.ts create mode 100644 src/src/types/utils/getImageMediaListHeight.d.ts create mode 100644 src/src/types/utils/getImageMediaSetSize.d.ts create mode 100644 src/src/utils/JsonToCSV.ts create mode 100644 src/src/utils/aggregateGroupData.ts create mode 100644 src/src/utils/alphabeticalSortComparator.ts create mode 100644 src/src/utils/app/alignMetricData.ts create mode 100644 src/src/utils/app/exceptionHandler.ts create mode 100644 src/src/utils/app/filterMetricData.ts create mode 100644 src/src/utils/app/getAggregatedData.ts create mode 100644 src/src/utils/app/getAppConfigData.ts create mode 100644 src/src/utils/app/getChartTitleData.ts create mode 100644 src/src/utils/app/getCompatibleChartConfig.ts create mode 100644 src/src/utils/app/getCompatibleSelectConfig.ts create mode 100644 src/src/utils/app/getDataAsMediaSetNestedObject.ts create mode 100644 src/src/utils/app/getFilteredGroupingOptions.ts create mode 100644 src/src/utils/app/getFilteredRow.ts create mode 100644 src/src/utils/app/getFilteredSystemMetrics.ts create mode 100644 src/src/utils/app/getGroupConfig.ts create mode 100644 src/src/utils/app/getGroupingPersistIndex.ts create mode 100644 src/src/utils/app/getGroupingSelectOptions.ts create mode 100644 src/src/utils/app/getLegendsData.tsx create mode 100644 src/src/utils/app/getMetricHash.ts create mode 100644 src/src/utils/app/getMetricLabel.ts create mode 100644 src/src/utils/app/getMetricsInitialRowData.ts create mode 100644 src/src/utils/app/getMetricsSelectOptions.ts create mode 100644 src/src/utils/app/getParamsSuggestions.ts create mode 100644 src/src/utils/app/getQueryStringFromSelect.ts create mode 100644 src/src/utils/app/getRunData.ts create mode 100644 src/src/utils/app/getSelectOptions.ts create mode 100644 src/src/utils/app/getSystemMetricsFromColumns.ts create mode 100644 src/src/utils/app/isGroupingApplied.ts create mode 100644 src/src/utils/app/manageSystemMetricColumns.ts create mode 100644 src/src/utils/app/onAggregationConfigChange.ts create mode 100644 src/src/utils/app/onAlignmentMetricChange.ts create mode 100644 src/src/utils/app/onAlignmentTypeChange.ts create mode 100644 src/src/utils/app/onAxesScaleRangeChange.ts create mode 100644 src/src/utils/app/onAxesScaleTypeChange.ts create mode 100644 src/src/utils/app/onAxisBrushExtentChange.ts create mode 100644 src/src/utils/app/onBookmarkCreate.ts create mode 100644 src/src/utils/app/onBookmarkUpdate.ts create mode 100644 src/src/utils/app/onChangeTooltip.ts create mode 100644 src/src/utils/app/onChangeTrendlineOptions.ts create mode 100644 src/src/utils/app/onColorIndicatorChange.ts create mode 100644 src/src/utils/app/onColumnsOrderChange.ts create mode 100644 src/src/utils/app/onColumnsVisibilityChange.ts create mode 100644 src/src/utils/app/onCurveInterpolationChange.ts create mode 100644 src/src/utils/app/onDensityTypeChange.ts create mode 100644 src/src/utils/app/onGroupingApplyChange.ts create mode 100644 src/src/utils/app/onGroupingModeChange.ts create mode 100644 src/src/utils/app/onGroupingPaletteChange.ts create mode 100644 src/src/utils/app/onGroupingPersistenceChange.ts create mode 100644 src/src/utils/app/onGroupingReset.ts create mode 100644 src/src/utils/app/onGroupingSelectChange.ts create mode 100644 src/src/utils/app/onHighlightModeChange.ts create mode 100644 src/src/utils/app/onIgnoreOutliersChange.ts create mode 100644 src/src/utils/app/onLegendsChange.ts create mode 100644 src/src/utils/app/onMetricsValueKeyChange.ts create mode 100644 src/src/utils/app/onMetricsVisibilityChange.ts create mode 100644 src/src/utils/app/onNotificationAdd.ts create mode 100644 src/src/utils/app/onNotificationDelete.ts create mode 100644 src/src/utils/app/onParamsVisibilityChange.ts create mode 100644 src/src/utils/app/onResetConfigData.ts create mode 100644 src/src/utils/app/onRowHeightChange.ts create mode 100644 src/src/utils/app/onRowSelect.ts create mode 100644 src/src/utils/app/onRowVisibilityChange.ts create mode 100644 src/src/utils/app/onRowsVisibilityChange.ts create mode 100644 src/src/utils/app/onRunsTagsChange.ts create mode 100644 src/src/utils/app/onSearchQueryCopy.ts create mode 100644 src/src/utils/app/onSelectAdvancedQueryChange.ts create mode 100644 src/src/utils/app/onSelectOptionsChange.ts create mode 100644 src/src/utils/app/onSelectRunQueryChange.ts create mode 100644 src/src/utils/app/onShuffleChange.ts create mode 100644 src/src/utils/app/onSmoothingChange.ts create mode 100644 src/src/utils/app/onSortFieldsChange.ts create mode 100644 src/src/utils/app/onTableDiffShow.ts create mode 100644 src/src/utils/app/onTableResizeEnd.ts create mode 100644 src/src/utils/app/onTableResizeModeChange.ts create mode 100644 src/src/utils/app/onTableRowClick.ts create mode 100644 src/src/utils/app/onTableRowHover.ts create mode 100644 src/src/utils/app/onTableSortChange.ts create mode 100644 src/src/utils/app/onToggleColumnsColorScales.ts create mode 100644 src/src/utils/app/onZoomChange.ts create mode 100644 src/src/utils/app/resetChartZoom.ts create mode 100644 src/src/utils/app/resetModelOnError.ts create mode 100644 src/src/utils/app/setAggregationEnabled.ts create mode 100644 src/src/utils/app/setComponentRefs.ts create mode 100644 src/src/utils/app/setDefaultAppConfigData.ts create mode 100644 src/src/utils/app/setRequestProgress.ts create mode 100644 src/src/utils/app/setRequestStatus.ts create mode 100644 src/src/utils/app/sortDependingArrays.ts create mode 100644 src/src/utils/app/toggleSelectAdvancedMode.ts create mode 100644 src/src/utils/app/updateColumnsWidths.ts create mode 100644 src/src/utils/app/updateTableSortFields.ts create mode 100644 src/src/utils/app/updateURL.ts create mode 100644 src/src/utils/app/updateUrlParam.ts create mode 100644 src/src/utils/arrayBufferToBase64.ts create mode 100644 src/src/utils/changeDasharraySize.ts create mode 100644 src/src/utils/contextToString.ts create mode 100644 src/src/utils/d3/areaGenerator.ts create mode 100644 src/src/utils/d3/clearArea.ts create mode 100644 src/src/utils/d3/drawArea.ts create mode 100644 src/src/utils/d3/drawAxes.ts create mode 100644 src/src/utils/d3/drawBrush.ts create mode 100644 src/src/utils/d3/drawHoverAttributes.ts create mode 100644 src/src/utils/d3/drawLegends.ts create mode 100644 src/src/utils/d3/drawLines.ts create mode 100644 src/src/utils/d3/drawParallelAxes.ts create mode 100644 src/src/utils/d3/drawParallelAxesBrush.ts create mode 100644 src/src/utils/d3/drawParallelColorIndicator.ts create mode 100644 src/src/utils/d3/drawParallelHoverAttributes.ts create mode 100644 src/src/utils/d3/drawParallelLines.ts create mode 100644 src/src/utils/d3/drawPoints.ts create mode 100644 src/src/utils/d3/drawScatterTrendline.ts create mode 100644 src/src/utils/d3/drawUnableToRender.ts create mode 100644 src/src/utils/d3/getAxisScale.ts create mode 100644 src/src/utils/d3/getColorFromRange.ts create mode 100644 src/src/utils/d3/getCoordinates.ts create mode 100644 src/src/utils/d3/getDimensionValue.ts create mode 100644 src/src/utils/d3/index.ts create mode 100644 src/src/utils/d3/lineGenerator.ts create mode 100644 src/src/utils/d3/processLineChartData.ts create mode 100644 src/src/utils/d3/symbolGenerator.ts create mode 100644 src/src/utils/d3/tickFormatting.ts create mode 100644 src/src/utils/decodeWithBase58Checker.ts create mode 100644 src/src/utils/document/documentTitle.ts create mode 100644 src/src/utils/encoder/encoder.ts create mode 100644 src/src/utils/encoder/format_bytes.ts create mode 100644 src/src/utils/encoder/streamEncoding.ts create mode 100644 src/src/utils/filterArrayByIndexes.ts create mode 100644 src/src/utils/formatAnsiToHtml.ts create mode 100644 src/src/utils/formatByAlignment.ts create mode 100644 src/src/utils/formatSystemMetricName.ts create mode 100644 src/src/utils/formatToPositiveNumber.ts create mode 100644 src/src/utils/formatValue.ts create mode 100644 src/src/utils/getAdvancedSuggestions.ts create mode 100644 src/src/utils/getBiggestImageFromList.ts create mode 100644 src/src/utils/getCaretPosition.ts create mode 100644 src/src/utils/getClosestValue.ts create mode 100644 src/src/utils/getColumnOptions.ts create mode 100644 src/src/utils/getMinAndMaxBetweenArrays.ts create mode 100644 src/src/utils/getObjectPaths.ts create mode 100644 src/src/utils/getPositionBasedOnOverflow.ts create mode 100644 src/src/utils/getSmoothenedData.ts create mode 100644 src/src/utils/getSortedFields.ts create mode 100644 src/src/utils/getStateFromLocalStorage.ts create mode 100644 src/src/utils/getStateFromUrl.ts create mode 100644 src/src/utils/getTooltipContent.ts create mode 100644 src/src/utils/getUrlWithParam.ts create mode 100644 src/src/utils/getValueByField.ts create mode 100644 src/src/utils/getValuesMedian.ts create mode 100644 src/src/utils/helper/downloadLink/downloadLink.ts create mode 100644 src/src/utils/helper/float64FromUint8/float64FromUint8.ts create mode 100644 src/src/utils/helper/getPathSegments/getPathSegments.test.ts create mode 100644 src/src/utils/helper/getPathSegments/getPathSegments.ts create mode 100644 src/src/utils/helper/getSVGString/getSVGString.test.ts create mode 100644 src/src/utils/helper/getSVGString/getSVGString.ts create mode 100644 src/src/utils/helper/getValue/getValue.test.ts create mode 100644 src/src/utils/helper/getValue/getValue.ts create mode 100644 src/src/utils/helper/imgSource2Image/imgSource2Image.ts create mode 100644 src/src/utils/helper/inIframe/inIframe.ts create mode 100644 src/src/utils/helper/index.ts create mode 100644 src/src/utils/helper/measureTextWidth/measureTextWidth.test.ts create mode 100644 src/src/utils/helper/measureTextWidth/measureTextWidth.ts create mode 100644 src/src/utils/helper/toTextEllipsis/toTextEllipsis.test.ts create mode 100644 src/src/utils/helper/toTextEllipsis/toTextEllipsis.ts create mode 100644 src/src/utils/hexToRgbA.ts create mode 100644 src/src/utils/isMetricHash.ts create mode 100644 src/src/utils/isSystemMetric.ts create mode 100644 src/src/utils/jsonParse.ts create mode 100644 src/src/utils/minMaxOfArray.ts create mode 100644 src/src/utils/object/getObjectPaths.ts create mode 100644 src/src/utils/object/traverseTree.ts create mode 100644 src/src/utils/onCopyToClipBoard.ts create mode 100644 src/src/utils/processDurationTime.ts create mode 100644 src/src/utils/regression/linearRegression.test.ts create mode 100644 src/src/utils/regression/linearRegression.ts create mode 100644 src/src/utils/regression/loess.test.ts create mode 100644 src/src/utils/regression/loess.ts create mode 100644 src/src/utils/removeOutliers.ts create mode 100644 src/src/utils/removeSyntaxErrBrackets.ts create mode 100644 src/src/utils/roundValue.ts create mode 100644 src/src/utils/saveRecentSearches.ts create mode 100644 src/src/utils/shortEnglishHumanizer.ts create mode 100644 src/src/utils/shortenRunPropLabel.ts create mode 100644 src/src/utils/showAutocompletion.ts create mode 100644 src/src/utils/smoothingData.ts create mode 100644 src/src/utils/stopPropagation.ts create mode 100644 src/src/utils/storage.ts create mode 100644 src/src/utils/store/createSlice.ts create mode 100644 src/src/utils/stringToPath.ts create mode 100644 src/src/utils/toFormatData.ts create mode 100644 src/src/utils/valueToType/valueToType.test.ts create mode 100644 src/src/utils/valueToType/valueToType.ts create mode 100644 src/tasks/bundle-analyzer.js create mode 100644 src/tasks/cli/README.md create mode 100644 src/tasks/cli/commands/createComponent.js create mode 100644 src/tasks/cli/index.js create mode 100644 src/tasks/cli/src/componentData.js create mode 100644 src/tasks/index-html-template-generator.js create mode 100644 src/tsconfig.json diff --git a/src/.editorconfig b/src/.editorconfig new file mode 100644 index 00000000..874bf8b8 --- /dev/null +++ b/src/.editorconfig @@ -0,0 +1,2 @@ +[*] +end_of_line = lf \ No newline at end of file diff --git a/src/.eslintrc b/src/.eslintrc new file mode 100644 index 00000000..a5a2f9f5 --- /dev/null +++ b/src/.eslintrc @@ -0,0 +1,142 @@ +{ + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } + }, + "extends": [ + "react-app", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "plugin:prettier/recommended", + "plugin:prettier/recommended", + "prettier" + ], + "rules": { + "prettier/prettier": "error", + "react/no-unescaped-entities": 0, + "no-console": "warn", + "quotes": [ + "error", + "single", + { + "avoidEscape": true + } + ], + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn", + "react/react-in-jsx-scope": "off", + "react/display-name": "off", + "import/order": [ + "error", + { + "groups": [ + "builtin", + "external", + "internal", + "parent", + "sibling", + "index", + "unknown" + ], + "pathGroups": [ + { + "pattern": "*.+(css|sass|less|scss|pcss|styl)", + "group": "unknown", + "patternOptions": { + "matchBase": true + }, + "position": "after" + }, + { + "pattern": "*", + "group": "external", + "position": "before" + }, + { + "pattern": "@+/**", + "group": "external", + "position": "before" + }, + { + "pattern": "assets/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "components/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "config/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "fonts/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "hooks/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "modules/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "pages/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "routes/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "services/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "styles/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "tests/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "types/**", + "group": "parent", + "position": "before" + }, + { + "pattern": "utils/**", + "group": "parent", + "position": "before" + } + ], + "pathGroupsExcludedImportTypes": [], + "warnOnUnassignedImports": true, + "newlines-between": "always" + } + ] + }, + "plugins": [ + "react", + "prettier", + "react-hooks", + "@typescript-eslint" + ] +} diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 00000000..79829f37 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,27 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +/public/vs + +# testing +/coverage +.vscode + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +Desktop diff --git a/src/.prettierrc b/src/.prettierrc new file mode 100644 index 00000000..d0f3a4a1 --- /dev/null +++ b/src/.prettierrc @@ -0,0 +1,13 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": true, + "jsxSingleQuote": true, + "quoteProps": "as-needed", + "trailingComma": "all", + "bracketSpacing": true, + "arrowParens": "always", + "endOfLine": "lf" +} diff --git a/src/.storybook/main.js b/src/.storybook/main.js new file mode 100644 index 00000000..059a600e --- /dev/null +++ b/src/.storybook/main.js @@ -0,0 +1,10 @@ +module.exports = { + stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-interactions', + '@storybook/preset-create-react-app', + ], + framework: '@storybook/react', +}; diff --git a/src/.storybook/preview-body.html b/src/.storybook/preview-body.html new file mode 100644 index 00000000..50bdb5b6 --- /dev/null +++ b/src/.storybook/preview-body.html @@ -0,0 +1,10 @@ + diff --git a/src/.storybook/preview-head.html b/src/.storybook/preview-head.html new file mode 100644 index 00000000..6dfff0b4 --- /dev/null +++ b/src/.storybook/preview-head.html @@ -0,0 +1,34 @@ + + + + + + + + + diff --git a/src/.storybook/preview.js b/src/.storybook/preview.js new file mode 100644 index 00000000..d3914580 --- /dev/null +++ b/src/.storybook/preview.js @@ -0,0 +1,9 @@ +export const parameters = { + actions: { argTypesRegex: '^on[A-Z].*' }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, +}; diff --git a/src/aim_ui/VERSION b/src/aim_ui/VERSION new file mode 120000 index 00000000..d62dc733 --- /dev/null +++ b/src/aim_ui/VERSION @@ -0,0 +1 @@ +../../../VERSION \ No newline at end of file diff --git a/src/aim_ui/__init__.py b/src/aim_ui/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/aim_ui/build b/src/aim_ui/build new file mode 120000 index 00000000..ab180172 --- /dev/null +++ b/src/aim_ui/build @@ -0,0 +1 @@ +../build \ No newline at end of file diff --git a/src/config-overrides.js b/src/config-overrides.js new file mode 100644 index 00000000..83e5fdfb --- /dev/null +++ b/src/config-overrides.js @@ -0,0 +1,56 @@ +const webpack = require('webpack'); +const WebpackDynamicPublicPathPlugin = require('webpack-dynamic-public-path'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); + +module.exports = { + webpack: function (config, webpackEnv) { + const isEnvProduction = webpackEnv === 'production'; + + // Optimization Overrides + config.optimization.splitChunks = { + cacheGroups: { + default: false, + }, + }; + config.optimization.runtimeChunk = true; + + // Output Overrides. + if (isEnvProduction) { + // JS static filenames overrides. + config.output.filename = 'static/js/[name].js?version=[contenthash]'; + config.output.chunkFilename = 'static/js/[name].js?version=[contenthash]'; + } + + // Plugins Overrides. + if (isEnvProduction) { + // CSS static filenames overrides. + config.plugins.forEach((plugin, index) => { + if (plugin instanceof MiniCssExtractPlugin) { + // remove the existing MiniCssExtractPlugin and add new one + config.plugins.splice( + index, + 1, + new MiniCssExtractPlugin({ + filename: 'static/css/[name].css?version=[contenthash]', + chunkFilename: 'static/css/[name].css?version=[contenthash]', + }), + ); + } + }); + } + + // Add external variable for base path support. + config.plugins.push( + new WebpackDynamicPublicPathPlugin({ + externalPublicPath: 'window.externalPublicPath', + }), + ); + + config.plugins.push( + new webpack.DefinePlugin({ + __DEV__: !isEnvProduction, + }), + ); + return config; + }, +}; diff --git a/src/package-lock.json b/src/package-lock.json new file mode 100755 index 00000000..5f23879b --- /dev/null +++ b/src/package-lock.json @@ -0,0 +1,66363 @@ +{ + "name": "ui_v2", + "version": "3.17.5", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "ui_v2", + "version": "3.17.5", + "hasInstallScript": true, + "dependencies": { + "@aksel/structjs": "^1.0.0", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^4.0.0-alpha.60", + "@monaco-editor/react": "4.4.4", + "@radix-ui/primitive": "^1.0.0", + "@radix-ui/react-checkbox": "^1.0.1", + "@radix-ui/react-dialog": "^1.0.2", + "@radix-ui/react-popover": "^1.0.2", + "@radix-ui/react-radio-group": "^1.1.0", + "@radix-ui/react-separator": "^1.0.1", + "@radix-ui/react-slider": "^1.1.0", + "@radix-ui/react-slot": "^1.0.1", + "@radix-ui/react-switch": "^1.0.1", + "@radix-ui/react-toast": "^1.1.2", + "@radix-ui/react-tooltip": "^1.0.3", + "@stitches/react": "^1.2.8", + "@storybook/react": "^6.5.12", + "@tabler/icons-react": "^2.2.0", + "@uiw/react-textarea-code-editor": "^1.4.14", + "antd": "^4.23.6", + "bs58check": "^2.1.2", + "classnames": "^2.3.1", + "comlink": "^4.3.1", + "d3": "^7.0.0", + "dot-object": "^2.1.4", + "file-saver": "^2.0.5", + "formik": "^2.2.9", + "highcharts": "^9.3.1", + "highcharts-react-official": "^3.1.0", + "history": "^5.3.0", + "humanize-duration": "^3.27.0", + "immer": "^9.0.16", + "js-cookie": "^3.0.5", + "lodash-es": "^4.17.21", + "marked": "^4.1.1", + "material-ui-audio-player": "^1.7.1", + "md5": "^2.3.0", + "memoize-one": "^5.2.1", + "moment": "^2.29.4", + "monaco-editor": "^0.33.0", + "plotly.js": "^2.7.0", + "prop-types": "^15.7.2", + "prosemirror-tables": "^1.1.1", + "react": "^17.0.2", + "react-accessible-dropdown-menu-hook": "^3.1.0", + "react-beautiful-dnd": "^13.1.0", + "react-dom": "^17.0.2", + "react-plotly.js": "^2.5.1", + "react-router-dom": "^5.3.0", + "react-scripts": "4.0.3", + "react-select": "^5.5.4", + "react-split": "^2.0.14", + "react-virtualized": "^9.22.3", + "react-virtualized-auto-sizer": "^1.0.5", + "react-virtualized-tree": "^3.4.1", + "react-window": "^1.8.6", + "rich-markdown-editor": "^11.21.3", + "styled-components": "^5.3.3", + "typeface-roboto": "^1.1.13", + "web-vitals": "^1.0.1", + "yup": "^0.32.9", + "zustand": "^4.1.1" + }, + "devDependencies": { + "@storybook/addon-actions": "^6.5.12", + "@storybook/addon-essentials": "^6.5.12", + "@storybook/addon-interactions": "^6.5.12", + "@storybook/addon-links": "^6.5.12", + "@storybook/builder-webpack4": "^6.5.12", + "@storybook/manager-webpack4": "^6.5.12", + "@storybook/node-logger": "^6.5.12", + "@storybook/preset-create-react-app": "^3.2.0", + "@storybook/testing-library": "^0.0.13", + "@testing-library/jest-dom": "^5.11.4", + "@testing-library/react": "^11.1.0", + "@testing-library/react-hooks": "^7.0.2", + "@testing-library/user-event": "^12.1.10", + "@types/bs58check": "^2.1.0", + "@types/d3": "^7.0.0", + "@types/dot-object": "^2.1.2", + "@types/file-saver": "^2.0.3", + "@types/history": "^5.0.0", + "@types/humanize-duration": "^3.25.1", + "@types/jest": "^26.0.15", + "@types/js-cookie": "^3.0.6", + "@types/lodash-es": "^4.17.4", + "@types/marked": "^4.0.7", + "@types/md5": "^2.3.1", + "@types/node": "^12.0.0", + "@types/node-sass": "^4.11.2", + "@types/react": "^17.0.0", + "@types/react-beautiful-dnd": "^13.1.1", + "@types/react-dom": "^17.0.0", + "@types/react-plotly.js": "^2.5.0", + "@types/react-router-dom": "^5.1.7", + "@types/react-virtualized-auto-sizer": "^1.0.1", + "@types/react-window": "^1.8.4", + "@types/storybook__react": "^5.2.1", + "@types/styled-components": "^5.1.15", + "@typescript-eslint/eslint-plugin": "^4.28.0", + "@typescript-eslint/parser": "^4.28.0", + "comlink-loader": "^2.0.0", + "eslint": "^7.29.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-react": "^7.24.0", + "eslint-plugin-react-hooks": "^4.2.0", + "gzipper": "^5.0.1", + "husky": "^6.0.0", + "jest-canvas-mock": "^2.3.1", + "jss-plugin-template": "^10.7.1", + "lint-staged": "^11.0.0", + "node-sass": "^6.0.1", + "prettier": "2.3.1", + "prettier-eslint": "^12.0.0", + "progress-bar-webpack-plugin": "^2.1.0", + "react-app-rewired": "^2.1.8", + "sass": "^1.38.1", + "typescript": "^4.3.4", + "webpack-bundle-analyzer": "^4.4.2", + "webpack-dynamic-public-path": "^1.0.8", + "yargs": "^17.2.1" + } + }, + "node_modules/@aksel/structjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aksel/structjs/-/structjs-1.0.0.tgz", + "integrity": "sha512-7BuOlCj7bS09Gr/uJFrKJVWaZqTSOoK2eUuqUebAZq5cALZP6eNz5K5cbprYNX6KBFGMnR+CeSmZk/DjVo3ecg==", + "dependencies": { + "npm-name": "^5.0.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.0.tgz", + "integrity": "sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.9.4" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", + "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + }, + "node_modules/@ant-design/react-slick": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.29.2.tgz", + "integrity": "sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "lodash": "^4.17.21", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "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==", + "bin": { + "semver": "bin/semver" + } + }, + "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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "dependencies": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/generator/node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dependencies": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", + "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "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" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dependencies": { + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", + "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-decorators": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz", + "integrity": "sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-default-from": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz", + "integrity": "sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz", + "integrity": "sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", + "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", + "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-flow": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", + "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz", + "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz", + "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.5.tgz", + "integrity": "sha512-M/fmDX6n0cfHK/NLTcPmrfVAORKDhK8tyjDhyxlUjYyPYYO8FRWwuxBA3WBx8kWN/uBUuwGa3s/0+hQ9JIN3Tg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", + "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "dependencies": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz", + "integrity": "sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.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", + "@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-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.18.6.tgz", + "integrity": "sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-flow-strip-types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-flow/node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz", + "integrity": "sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-flow": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", + "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz", + "integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.5", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz", + "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==", + "dependencies": { + "core-js-pure": "^3.15.0", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@base2/pretty-print-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", + "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==" + }, + "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==" + }, + "node_modules/@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "dependencies": { + "commander": "^2.15.1" + }, + "bin": { + "findup": "bin/findup.js" + } + }, + "node_modules/@choojs/findup/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/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@csstools/normalize.css": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", + "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", + "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@design-systems/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@design-systems/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-Y/d2Zzr+JJfN6u1gbuBUb1ufBuLMJJRZQk+dRmw8GaTpqKx5uf7cGUYGTwN02dIb3I+Tf+cW8jcGBTRiFxdYFg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.11.2", + "clsx": "^1.0.4", + "focus-lock": "^0.8.0", + "react-merge-refs": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": ">= 16.8.6", + "react-dom": ">= 16.8.6" + } + }, + "node_modules/@devtools-ds/object-inspector": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/object-inspector/-/object-inspector-1.2.0.tgz", + "integrity": "sha512-VztcwqVwScSvYdvJVZBJYsVO/2Pew3JPpFV3T9fuCHQLlHcLYOV3aU/kBS2ScuE2O1JN0ZbobLqFLa3vQF54Fw==", + "dev": true, + "dependencies": { + "@babel/runtime": "7.7.2", + "@devtools-ds/object-parser": "^1.2.0", + "@devtools-ds/themes": "^1.2.0", + "@devtools-ds/tree": "^1.2.0", + "clsx": "1.1.0" + }, + "peerDependencies": { + "react": ">= 16.8.6" + } + }, + "node_modules/@devtools-ds/object-inspector/node_modules/@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/@devtools-ds/object-inspector/node_modules/clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@devtools-ds/object-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/object-parser/-/object-parser-1.2.0.tgz", + "integrity": "sha512-SjGGyiFFY8dtUpiWXAvRSzRT+hE11EAAysrq2PsC/GVLf2ZLyT2nHlQO5kDStywyTz+fjw7S7pyDRj1HG9YTTA==", + "dev": true, + "dependencies": { + "@babel/runtime": "~7.5.4" + } + }, + "node_modules/@devtools-ds/object-parser/node_modules/@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/@devtools-ds/themes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/themes/-/themes-1.2.0.tgz", + "integrity": "sha512-LimEITorE6yWZWWuMc6OiBfLQgPrQqWbyMEmfRUDPa3PHXoAY4SpDxczfg31fgyRDUNWnZhjaJH5bBbu8VEbIw==", + "dev": true, + "dependencies": { + "@babel/runtime": "~7.5.4", + "@design-systems/utils": "2.12.0", + "clsx": "1.1.0" + }, + "peerDependencies": { + "react": ">= 16.8.6" + } + }, + "node_modules/@devtools-ds/themes/node_modules/@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/@devtools-ds/themes/node_modules/clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@devtools-ds/tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/tree/-/tree-1.2.0.tgz", + "integrity": "sha512-hC4g4ocuo2eg7jsnzKdauxH0sDQiPW3KSM2+uK3kRgcmr9PzpBD5Kob+Y/WFSVKswFleftOGKL4BQLuRv0sPxA==", + "dev": true, + "dependencies": { + "@babel/runtime": "7.7.2", + "@devtools-ds/themes": "^1.2.0", + "clsx": "1.1.0" + }, + "peerDependencies": { + "react": ">= 16.8.6" + } + }, + "node_modules/@devtools-ds/tree/node_modules/@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/@devtools-ds/tree/node_modules/clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", + "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "dependencies": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "node_modules/@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/serialize/node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "node_modules/@emotion/serialize/node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, + "node_modules/@emotion/serialize/node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "node_modules/@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@floating-ui/core": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz", + "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==" + }, + "node_modules/@floating-ui/dom": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz", + "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==", + "dependencies": { + "@floating-ui/core": "^0.7.3" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz", + "integrity": "sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==", + "dependencies": { + "@floating-ui/dom": "^0.5.3", + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'" + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" + }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "deprecated": "Switch to 'npm install joi'", + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dependencies": { + "@hapi/hoek": "^8.3.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==", + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "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==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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/core/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==", + "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/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "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==", + "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==", + "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==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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/reporters/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==", + "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/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==", + "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==", + "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==", + "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==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz", + "integrity": "sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA==", + "dependencies": { + "get-stream": "^6.0.1", + "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==", + "peerDependencies": { + "mapbox-gl": ">=0.32.1 <2.0.0" + } + }, + "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/rehype-prism": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@mapbox/rehype-prism/-/rehype-prism-0.8.0.tgz", + "integrity": "sha512-bIz4a3oZ8g+pQBHSMMIxNpYOMX4yq4aZdpezoiCl9yJudh1Z9SRmHQqH6f+WtTBNOORzXMEGkvBze4PiH17wtA==", + "dependencies": { + "hast-util-to-string": "^1.0.4", + "mrm": "^3.0.9", + "refractor": "^3.4.0", + "unist-util-visit": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", + "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" + }, + "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/@material-ui/core": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.2.tgz", + "integrity": "sha512-Q1npB8V73IC+eV2X6as+g71MpEGQwqKHUI2iujY62npk35V8nMx/bUXAHjv5kKG1BZ8s8XUWoG6s/VkjYPjjQA==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/icons": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", + "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", + "dependencies": { + "@babel/runtime": "^7.4.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@material-ui/core": "^4.0.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/lab": { + "version": "4.0.0-alpha.60", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.60.tgz", + "integrity": "sha512-fadlYsPJF+0fx2lRuyqAuJj7hAS1tLDdIEEdov5jlrpb5pp4b+mRDUqQTUxi4inRZHS1bEXpU8QWUhO6xX88aA==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@material-ui/core": "^4.12.1", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/styles": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/system": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@mdx-js/mdx/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/@mdx-js/mdx/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@mdx-js/mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + } + }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@monaco-editor/loader": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.3.2.tgz", + "integrity": "sha512-BTDbpHl3e47r3AAtpfVFTlAi7WXv4UQ/xZmz8atKl4q7epQV5e7+JbigFDViWF71VBi4IIBdcWP57Hj+OWuc9g==", + "dependencies": { + "state-local": "^1.0.6" + }, + "peerDependencies": { + "monaco-editor": ">= 0.21.0 < 1" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.4.4.tgz", + "integrity": "sha512-yQsYnVkgP5RC5ZMoRVCXSBn4D4hLUOgoQK+AZJpVY57NDXmEb57OVaaYKh8/RTzxkpuLV278hKNw5DnuzlgQwg==", + "dependencies": { + "@monaco-editor/loader": "^1.3.1", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@mrmlnc/readdir-enhanced/node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@plotly/d3": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.0.tgz", + "integrity": "sha512-L10iHgzvw3uSic/nQpYehlNzxUQvImwms5U7S95pJAEhrllzkrdQNy1Mc5DW9ab881Yr4fh300gJztKXWZDfkQ==" + }, + "node_modules/@plotly/d3-sankey": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", + "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", + "dependencies": { + "d3-array": "1", + "d3-collection": "1", + "d3-shape": "^1.2.0" + } + }, + "node_modules/@plotly/d3-sankey-circular": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz", + "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==", + "dependencies": { + "d3-array": "^1.2.1", + "d3-collection": "^1.0.4", + "d3-shape": "^1.2.0", + "elementary-circuits-directed-graph": "^1.0.4" + } + }, + "node_modules/@plotly/d3-sankey-circular/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/@plotly/d3-sankey-circular/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/@plotly/d3-sankey-circular/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/@plotly/d3-sankey/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/@plotly/d3-sankey/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/@plotly/d3-sankey/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/@plotly/point-cluster": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", + "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==", + "dependencies": { + "array-bounds": "^1.0.1", + "binary-search-bounds": "^2.0.4", + "clamp": "^1.0.1", + "defined": "^1.0.0", + "dtype": "^2.0.0", + "flatten-vertex-data": "^1.0.2", + "is-obj": "^1.0.1", + "math-log2": "^1.0.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", + "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", + "dependencies": { + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.x" + }, + "peerDependencies": { + "@types/webpack": "4.x", + "react-refresh": ">=0.8.3 <0.10.0", + "sockjs-client": "^1.4.0", + "type-fest": "^0.13.1", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/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==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.20", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.20.tgz", + "integrity": "sha512-88p7+M0QGxKpmnkfXjS4V26AnoC/eiqZutE8GLdaI5X12NY75bXSdTY9NkmYb2Xyk1O+MmkuO6Frmsj84V6I8Q==", + "dev": true + }, + "node_modules/@radix-ui/number": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", + "integrity": "sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.1.tgz", + "integrity": "sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.0.1.tgz", + "integrity": "sha512-TisH0B8hWmYP3ONRduYCyN04rR9yLPIw/Rwyn1RoC1suSoGCa8Wn+YPdSSSarSszeIbcg3p2lBkDp2XXit4sZw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.1.tgz", + "integrity": "sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", + "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", + "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.2.tgz", + "integrity": "sha512-EKxxp2WNSmUPkx4trtWNmZ4/vAYEg7JkAfa1HKBUnaubw9eHzf1Orr9B472lJYaYz327RHDrd4R95fsw7VR8DA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz", + "integrity": "sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz", + "integrity": "sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.2" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", + "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.1.tgz", + "integrity": "sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", + "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.2.tgz", + "integrity": "sha512-4tqZEl9w95R5mlZ/sFdgBnfhCBOEPepLIurBA5kt/qaAhldJ1tNQd0ngr0ET0AHbPotT4mwxMPr7a+MA/wbK0g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.0.1", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.1.tgz", + "integrity": "sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.1.tgz", + "integrity": "sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.1.0.tgz", + "integrity": "sha512-7rrkZCXu0Q7oC0MxCm497X1DdV/tI78oNIGXA8sDbCkboiTkuLSe728zCCpRYHw+9PifHIx86nsbITPEq5yijg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-roving-focus": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.1.tgz", + "integrity": "sha512-TB76u5TIxKpqMpUAuYH2VqMhHYKa+4Vs1NHygo/llLvlffN6mLVsFhz0AnSFlSBAvTBYVHYAkHAyEt7x1gPJOA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.1.tgz", + "integrity": "sha512-uc6Izot0D8uVz6T2nSb/HI7OaxkeaD50GgKr3W6HORnbfGVrG7LWuy+g6Fd58n8wHbrRblSYJZEfcjgymMlJjw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.1.0.tgz", + "integrity": "sha512-5H/QB4xD3GF9UfoSCVLBx2JjlXamMcmTyL6gr4kkd/MiAGaYB0W7Exi4MQa0tJApBFJe+KmS5InKCI56p2kmjA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.0", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", + "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.0.1.tgz", + "integrity": "sha512-tTxGluMtwrc5ffgAiOSMrYIx0r3vSTcgM4Vl8rqfpXcHt6ryB9B0OlFKUOiDpKASXlhvzfHf4Y0AYKJdpzjL8w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.2.tgz", + "integrity": "sha512-Kpr4BBYoP0O5A1UeDBmao87UnCMNdAKGNioQH5JzEm6OYTUVGhuDRbOwoZxPwOZ6vsjJHeIpdUrwbiHEB65CCw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.3.tgz", + "integrity": "sha512-cmc9qV4KpgqdXVTn1K8KN8MnuSXvw+E719pKwyvpCGrQ+0AA2qTjcIL3uxCj4jc4k3sDR36RF7R3H7N5hPybBQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.1.0", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.0.tgz", + "integrity": "sha512-07U7jpI0dZcLRAxT7L9qs6HecSoPhDSJybF7mEGHJDBDv+ZoGCvIlva0s+WxMXwJEav+ckX3hAlXBtnHmuvlCQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.2.tgz", + "integrity": "sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.0.tgz", + "integrity": "sha512-RG2K8z/K7InnOKpq6YLDmT49HGjNmrK+fr82UCVKT2sW0GYfVnYp4wZWBooT/EYfQ5faA9uIjvsuMMhH61rheg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz", + "integrity": "sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz", + "integrity": "sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.1.tgz", + "integrity": "sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.0.tgz", + "integrity": "sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.0.tgz", + "integrity": "sha512-tbXM9SB1r5FOuZjRCljERFByFiEUcMmCWMXLog/NmgCzlAzreXyf23Vei3ZpSMxSMavzPnhCovfZjZdmxS3d1w==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "dependencies": { + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "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==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@stitches/react": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz", + "integrity": "sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==", + "peerDependencies": { + "react": ">= 16.3.0" + } + }, + "node_modules/@storybook/addon-actions": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.5.13.tgz", + "integrity": "sha512-3Tji0gIy95havhTpSc6CsFl5lNxGn4O5Y1U9fyji+GRkKqDFOrvVLYAHPtLOpYdEI5tF0bDo+akiqfDouY8+eA==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "polished": "^4.2.2", + "prop-types": "^15.7.2", + "react-inspector": "^5.1.0", + "regenerator-runtime": "^0.13.7", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "uuid-browser": "^3.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-backgrounds": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.13.tgz", + "integrity": "sha512-b4JX7JMY7e50y1l6g71D+2XWV3GO0TO2z1ta8J6W4OQt8f44V7sSkRQaJUzXdLjQMrA+Anojuy1ZwPjVeLC6vg==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-controls": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.5.13.tgz", + "integrity": "sha512-lYq3uf2mlVevm0bi6ueL3H6TpUMRYW9s/pTNTVJT225l27kLdFR9wEKxAkCBrlKaTgDLJmzzDRsJE3NLZlR/5Q==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/node-logger": "6.5.13", + "@storybook/store": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-docs": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.5.13.tgz", + "integrity": "sha512-RG/NjsheD9FixZ789RJlNyNccaR2Cuy7CtAwph4oUNi3aDFjtOI8Oe9L+FOT7qtVnZLw/YMjF+pZxoDqJNKLPw==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@jest/transform": "^26.6.2", + "@mdx-js/react": "^1.6.22", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/docs-tools": "6.5.13", + "@storybook/mdx1-csf": "^0.0.1", + "@storybook/node-logger": "6.5.13", + "@storybook/postinstall": "6.5.13", + "@storybook/preview-web": "6.5.13", + "@storybook/source-loader": "6.5.13", + "@storybook/store": "6.5.13", + "@storybook/theming": "6.5.13", + "babel-loader": "^8.0.0", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "regenerator-runtime": "^0.13.7", + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@storybook/mdx2-csf": "^0.0.3", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@storybook/mdx2-csf": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-essentials": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.5.13.tgz", + "integrity": "sha512-G9FVAWV7ixjVLWeLgIX+VT90tcAk6yQxfZQegfg5ucRilGysJCDaNnoab4xuuvm1R40TfFhba3iAGZtQYsddmw==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "6.5.13", + "@storybook/addon-backgrounds": "6.5.13", + "@storybook/addon-controls": "6.5.13", + "@storybook/addon-docs": "6.5.13", + "@storybook/addon-measure": "6.5.13", + "@storybook/addon-outline": "6.5.13", + "@storybook/addon-toolbars": "6.5.13", + "@storybook/addon-viewport": "6.5.13", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/node-logger": "6.5.13", + "core-js": "^3.8.2", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@babel/core": "^7.9.6" + }, + "peerDependenciesMeta": { + "@storybook/angular": { + "optional": true + }, + "@storybook/builder-manager4": { + "optional": true + }, + "@storybook/builder-manager5": { + "optional": true + }, + "@storybook/builder-webpack4": { + "optional": true + }, + "@storybook/builder-webpack5": { + "optional": true + }, + "@storybook/html": { + "optional": true + }, + "@storybook/vue": { + "optional": true + }, + "@storybook/vue3": { + "optional": true + }, + "@storybook/web-components": { + "optional": true + }, + "lit": { + "optional": true + }, + "lit-html": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "svelte": { + "optional": true + }, + "sveltedoc-parser": { + "optional": true + }, + "vue": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-interactions": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-6.5.13.tgz", + "integrity": "sha512-FPOeS7AT/Odxl6z7E0qYI4F0Sh06jFRttRvSgpKC5P2lYUWUstLP5TC8N+F5ijBeLfIdIsf5zBK7l5Y/cluueg==", + "dev": true, + "dependencies": { + "@devtools-ds/object-inspector": "^1.1.2", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/instrumenter": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "jest-mock": "^27.0.6", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-interactions/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@storybook/addon-interactions/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/@storybook/addon-interactions/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@storybook/addon-links": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.5.13.tgz", + "integrity": "sha512-K/LYYu9R/Xoah5h9MNh4mSHOic3q5csqjderLqr2YW/KPYiuNubgvzEbAAbzI5xq5JrtAZqnINrZUv2A4CyYbQ==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.13", + "@types/qs": "^6.9.5", + "core-js": "^3.8.2", + "global": "^4.4.0", + "prop-types": "^15.7.2", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-links/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/addon-measure": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.5.13.tgz", + "integrity": "sha512-pi5RFB9YTnESRFtYHAVRUrgEI5to0TFc4KndtwcCKt1fMJ8OFjXQeznEfdj95PFeUvW5TNUwjL38vK4LhicB+g==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-outline": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.5.13.tgz", + "integrity": "sha512-8d8taPheO/tryflzXbj2QRuxHOIS8CtzRzcaglCcioqHEMhOIDOx9BdXKdheq54gdk/UN94HdGJUoVxYyXwZ4Q==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-toolbars": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.5.13.tgz", + "integrity": "sha512-Qgr4wKRSP+gY1VaN7PYT4TM1um7KY341X3GHTglXLFHd8nDsCweawfV2shaX3WxCfZmVro8g4G+Oest30kLLCw==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-viewport": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.5.13.tgz", + "integrity": "sha512-KSfeuCSIjncwWGnUu6cZBx8WNqYvm5gHyFvkSPKEu0+MJtgncbUy7pl53lrEEr6QmIq0GRXvS3A0XzV8RCnrSA==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "prop-types": "^15.7.2", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addons": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.13.tgz", + "integrity": "sha512-18CqzNnrGMfeZtiKz+R/3rHtSNnfNwz6y6prIQIbWseK16jY8ELTfIFGviwO5V2OqpbHDQi5+xQQ63QAIb89YA==", + "dependencies": { + "@storybook/api": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.13", + "@storybook/theming": "6.5.13", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/api": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.13.tgz", + "integrity": "sha512-xVSmB7/IuFd6G7eiJjbI2MuS7SZunoUM6d+YCWpjiehfMeX47MXt1gZtOwFrgJC1ShZlefXFahq/dvxwtmWs+w==", + "dependencies": { + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/builder-webpack4": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.5.13.tgz", + "integrity": "sha512-Agqy3IKPv3Nl8QqdS7PjtqLp+c0BD8+/3A2ki/YfKqVz+F+J34EpbZlh3uU053avm1EoNQHSmhZok3ZlWH6O7A==", + "dependencies": { + "@babel/core": "^7.12.10", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/preview-web": "6.5.13", + "@storybook/router": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.5.13", + "@storybook/theming": "6.5.13", + "@storybook/ui": "6.5.13", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/webpack": "^4.41.26", + "autoprefixer": "^9.8.6", + "babel-loader": "^8.0.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "core-js": "^3.8.2", + "css-loader": "^3.6.0", + "file-loader": "^6.2.0", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^4.1.6", + "glob": "^7.1.6", + "glob-promise": "^3.4.0", + "global": "^4.4.0", + "html-webpack-plugin": "^4.0.0", + "pnp-webpack-plugin": "1.6.4", + "postcss": "^7.0.36", + "postcss-flexbugs-fixes": "^4.2.1", + "postcss-loader": "^4.2.0", + "raw-loader": "^4.0.2", + "stable": "^0.1.8", + "style-loader": "^1.3.0", + "terser-webpack-plugin": "^4.2.3", + "ts-dedent": "^2.0.0", + "url-loader": "^4.1.1", + "util-deprecate": "^1.0.2", + "webpack": "4", + "webpack-dev-middleware": "^3.7.3", + "webpack-filter-warnings-plugin": "^1.2.1", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.2.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "node_modules/@storybook/builder-webpack4/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dependencies": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/css-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/css-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack4/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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/postcss-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/postcss-loader/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/channel-postmessage": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.5.13.tgz", + "integrity": "sha512-R79MBs0mQ7TV8M/a6x/SiTRyvZBidDfMEEthG7Cyo9p35JYiKOhj2535zhW4qlVMESBu95pwKYBibTjASoStPw==", + "dependencies": { + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "qs": "^6.10.0", + "telejson": "^6.0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/channel-postmessage/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/channel-websocket": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.5.13.tgz", + "integrity": "sha512-kwh667H+tzCiNvs92GNwYOwVXdj9uHZyieRAN5rJtTBJ7XgLzGkpTEU50mWlbc0nDKhgE0qYvzyr5H393Iy5ug==", + "dependencies": { + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "telejson": "^6.0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/channels": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.13.tgz", + "integrity": "sha512-sGYSilE30bz0jG+HdHnkv0B4XkAv2hP+KRZr4xmnv+MOOQpRnZpJ5Z3HVU16s17cj/83NWihKj6BuKcEVzyilg==", + "dependencies": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/client-api": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.5.13.tgz", + "integrity": "sha512-uH1mAWbidPiuuTdMUVEiuaNOfrYXm+9QLSP1MMYTKULqEOZI5MSOGkEDqRfVWxbYv/iWBOPTQ+OM9TQ6ecYacg==", + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.13", + "@types/qs": "^6.9.5", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/client-api/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/client-logger": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.13.tgz", + "integrity": "sha512-F2SMW3LWFGXLm2ENTwTitrLWJgmMXRf3CWQXdN2EbkNCIBHy5Zcbt+91K4OX8e2e5h9gjGfrdYbyYDYOoUCEfA==", + "dependencies": { + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/components": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.5.13.tgz", + "integrity": "sha512-6Hhx70JK5pGfKCkqMU4yq/BBH+vRTmzj7tZKfPwba+f8VmTMoOr/2ysTQFRtXryiHB6Z15xBYgfq5x2pIwQzLQ==", + "dependencies": { + "@storybook/client-logger": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/components/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/core": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.5.13.tgz", + "integrity": "sha512-kw1lCgbsxzUimGww6t5rmuWJmFPe9kGGyzIqvj4RC4BBcEsP40LEu9XhSfvnb8vTOLIULFZeZpdRFfJs4TYbUw==", + "dependencies": { + "@storybook/core-client": "6.5.13", + "@storybook/core-server": "6.5.13" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "webpack": "*" + }, + "peerDependenciesMeta": { + "@storybook/builder-webpack5": { + "optional": true + }, + "@storybook/manager-webpack5": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/core-client": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.5.13.tgz", + "integrity": "sha512-YuELbRokTBdqjbx/R4/7O4rou9kvbBIOJjlUkor9hdLLuJ3P0yGianERGNkZFfvcfMBAxU0p52o7QvDldSR3kA==", + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/channel-websocket": "6.5.13", + "@storybook/client-api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/preview-web": "6.5.13", + "@storybook/store": "6.5.13", + "@storybook/ui": "6.5.13", + "airbnb-js-shims": "^2.2.1", + "ansi-to-html": "^0.6.11", + "core-js": "^3.8.2", + "global": "^4.4.0", + "lodash": "^4.17.21", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "unfetch": "^4.2.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "webpack": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/core-client/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/core-common": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.5.13.tgz", + "integrity": "sha512-+DVZrRsteE9pw0X5MNffkdBgejQnbnL+UOG3qXkE9xxUamQALnuqS/w1BzpHE9WmOHuf7RWMKflyQEW3OLKAJg==", + "dependencies": { + "@babel/core": "^7.12.10", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-decorators": "^7.12.12", + "@babel/plugin-proposal-export-default-from": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-private-property-in-object": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.12", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/preset-env": "^7.12.11", + "@babel/preset-react": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@babel/register": "^7.12.1", + "@storybook/node-logger": "6.5.13", + "@storybook/semver": "^7.3.2", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/pretty-hrtime": "^1.0.0", + "babel-loader": "^8.0.0", + "babel-plugin-macros": "^3.0.1", + "babel-plugin-polyfill-corejs3": "^0.1.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "express": "^4.17.1", + "file-system-cache": "^1.0.5", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.0.4", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "handlebars": "^4.7.7", + "interpret": "^2.2.0", + "json5": "^2.1.3", + "lazy-universal-dotenv": "^3.0.1", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "webpack": "4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/core-common/node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@storybook/core-common/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/core-common/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==", + "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" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@storybook/core-common/node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/core-common/node_modules/@babel/plugin-proposal-decorators": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.2.tgz", + "integrity": "sha512-nkBH96IBmgKnbHQ5gXFrcmez+Z9S2EIDKDQGp005ROqBigc88Tky4rzCnlP/lnlj245dCEQl4/YyV0V1kYh5dw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/plugin-syntax-decorators": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@storybook/core-common/node_modules/@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@storybook/core-common/node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "node_modules/@storybook/core-common/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@storybook/core-common/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==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.1.5", + "core-js-compat": "^3.8.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@storybook/core-common/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@storybook/core-common/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-common/node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/@storybook/core-common/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-common/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-common/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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-common/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-common/node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/core-common/node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/core-common/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-common/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@storybook/core-events": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.13.tgz", + "integrity": "sha512-kL745tPpRKejzHToA3/CoBNbI+NPRVk186vGxXBmk95OEg0TlwgQExP8BnqEtLlRZMbW08e4+6kilc1M1M4N5w==", + "dependencies": { + "core-js": "^3.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.5.13.tgz", + "integrity": "sha512-vs7tu3kAnFwuINio1p87WyqDNlFyZESmeh9s7vvrZVbe/xS/ElqDscr9DT5seW+jbtxufAaHsx+JUTver1dheQ==", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.3", + "@storybook/builder-webpack4": "6.5.13", + "@storybook/core-client": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/csf-tools": "6.5.13", + "@storybook/manager-webpack4": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.5.13", + "@storybook/telemetry": "6.5.13", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/node-fetch": "^2.5.7", + "@types/pretty-hrtime": "^1.0.0", + "@types/webpack": "^4.41.26", + "better-opn": "^2.1.1", + "boxen": "^5.1.2", + "chalk": "^4.1.0", + "cli-table3": "^0.6.1", + "commander": "^6.2.1", + "compression": "^1.7.4", + "core-js": "^3.8.2", + "cpy": "^8.1.2", + "detect-port": "^1.3.0", + "express": "^4.17.1", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "globby": "^11.0.2", + "ip": "^2.0.0", + "lodash": "^4.17.21", + "node-fetch": "^2.6.7", + "open": "^8.4.0", + "pretty-hrtime": "^1.0.3", + "prompts": "^2.4.0", + "regenerator-runtime": "^0.13.7", + "serve-favicon": "^2.5.0", + "slash": "^3.0.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "watchpack": "^2.2.0", + "webpack": "4", + "ws": "^8.2.3", + "x-default-browser": "^0.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@storybook/builder-webpack5": { + "optional": true + }, + "@storybook/manager-webpack5": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/core-server/node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "node_modules/@storybook/core-server/node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/@storybook/core-server/node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@storybook/core-server/node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-server/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@storybook/core-server/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/@storybook/core-server/node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-server/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/core-server/node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@storybook/core-server/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-server/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@storybook/csf": { + "version": "0.0.2--canary.4566f4d.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", + "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/@storybook/csf-tools": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.5.13.tgz", + "integrity": "sha512-63Ev+VmBqzwSwfUzbuXOLKBD5dMTK2zBYLQ9anTVw70FuTikwTsGIbPgb098K0vsxRCgxl7KM7NpivHqtZtdjw==", + "dependencies": { + "@babel/core": "^7.12.10", + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@babel/traverse": "^7.12.11", + "@babel/types": "^7.12.11", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/mdx1-csf": "^0.0.1", + "core-js": "^3.8.2", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@storybook/mdx2-csf": "^0.0.3" + }, + "peerDependenciesMeta": { + "@storybook/mdx2-csf": { + "optional": true + } + } + }, + "node_modules/@storybook/csf-tools/node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@storybook/csf-tools/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/docs-tools": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-6.5.13.tgz", + "integrity": "sha512-hB+hk+895ny4SW84j3X5iV55DHs3bCfTOp7cDdcZJdQrlm0wuDb4A6d4ffNC7ZLh9VkUjU6ST4VEV5Bb0Cptow==", + "dependencies": { + "@babel/core": "^7.12.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.13", + "core-js": "^3.8.2", + "doctrine": "^3.0.0", + "lodash": "^4.17.21", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/docs-tools/node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@storybook/docs-tools/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/instrumenter": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-6.5.13.tgz", + "integrity": "sha512-izRF64BU+gGCP7qE1N3kOVLSv5Xk4M0OWcRmFIXoIS46qNDzmd8hmbkkx3M9wrvw0kcQ97kIyADF+UInbcr/dQ==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/manager-webpack4": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.5.13.tgz", + "integrity": "sha512-pURzS5W3XM0F7bCBWzpl7TRsuy+OXFwLXiWLaexuvo0POZe31Ueo2A1R4rx3MT5Iee8O9mYvG2XTmvK9MlLefQ==", + "dependencies": { + "@babel/core": "^7.12.10", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/preset-react": "^7.12.10", + "@storybook/addons": "6.5.13", + "@storybook/core-client": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/theming": "6.5.13", + "@storybook/ui": "6.5.13", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/webpack": "^4.41.26", + "babel-loader": "^8.0.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "css-loader": "^3.6.0", + "express": "^4.17.1", + "file-loader": "^6.2.0", + "find-up": "^5.0.0", + "fs-extra": "^9.0.1", + "html-webpack-plugin": "^4.0.0", + "node-fetch": "^2.6.7", + "pnp-webpack-plugin": "1.6.4", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7", + "resolve-from": "^5.0.0", + "style-loader": "^1.3.0", + "telejson": "^6.0.8", + "terser-webpack-plugin": "^4.2.3", + "ts-dedent": "^2.0.0", + "url-loader": "^4.1.1", + "util-deprecate": "^1.0.2", + "webpack": "4", + "webpack-dev-middleware": "^3.7.3", + "webpack-virtual-modules": "^0.2.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "node_modules/@storybook/manager-webpack4/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@storybook/manager-webpack4/node_modules/css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dependencies": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/css-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/css-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/manager-webpack4/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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/manager-webpack4/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/manager-webpack4/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/mdx1-csf": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@storybook/mdx1-csf/-/mdx1-csf-0.0.1.tgz", + "integrity": "sha512-4biZIWWzoWlCarMZmTpqcJNgo/RBesYZwGFbQeXiGYsswuvfWARZnW9RE9aUEMZ4XPn7B1N3EKkWcdcWe/K2tg==", + "dependencies": { + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/preset-env": "^7.12.11", + "@babel/types": "^7.12.11", + "@mdx-js/mdx": "^1.6.22", + "@types/lodash": "^4.14.167", + "js-string-escape": "^1.0.1", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "ts-dedent": "^2.0.0" + } + }, + "node_modules/@storybook/mdx1-csf/node_modules/prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@storybook/node-logger": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.5.13.tgz", + "integrity": "sha512-/r5aVZAqZRoy5FyNk/G4pj7yKJd3lJfPbAaOHVROv2IF7PJP/vtRaDkcfh0g2U6zwuDxGIqSn80j+qoEli9m5A==", + "dependencies": { + "@types/npmlog": "^4.1.2", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "npmlog": "^5.0.1", + "pretty-hrtime": "^1.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/node-logger/node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/node-logger/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@storybook/node-logger/node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/node-logger/node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/@storybook/node-logger/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/@storybook/node-logger/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/postinstall": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.5.13.tgz", + "integrity": "sha512-qmqP39FGIP5NdhXC5IpAs9cFoYx9fg1psoQKwb9snYb98eVQU31uHc1W2MBUh3lG4AjAm7pQaXJci7ti4jOh3g==", + "dev": true, + "dependencies": { + "core-js": "^3.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-create-react-app": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@storybook/preset-create-react-app/-/preset-create-react-app-3.2.0.tgz", + "integrity": "sha512-lLoWCGr5cV+JNDRKYHC2gD+P2eyBqdN8qhmBa+PxDgPSNKfgUf9Wnoh+C7WTG5q2DEeR9SvUpQpZomX9DDQa4Q==", + "dev": true, + "dependencies": { + "@pmmmwh/react-refresh-webpack-plugin": "^0.4.3", + "@types/babel__core": "^7.1.7", + "@types/webpack": "^4.41.13", + "babel-plugin-react-docgen": "^4.1.0", + "pnp-webpack-plugin": "^1.6.4", + "react-docgen-typescript-plugin": "^1.0.0", + "semver": "^7.3.5" + }, + "peerDependencies": { + "@babel/core": "*", + "@storybook/node-logger": "*", + "@storybook/react": ">=5.2", + "react-scripts": ">=3.0.0" + } + }, + "node_modules/@storybook/preset-create-react-app/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/preview-web": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.5.13.tgz", + "integrity": "sha512-GNNYVzw4SmRua3dOc52Ye6Us4iQbq5GKQ56U3iwnzZM3TBdJB+Rft94Fn1/pypHujEHS8hl5Xgp9td6C1lLCow==", + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.13", + "ansi-to-html": "^0.6.11", + "core-js": "^3.8.2", + "global": "^4.4.0", + "lodash": "^4.17.21", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "unfetch": "^4.2.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/preview-web/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/react": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-6.5.13.tgz", + "integrity": "sha512-4gO8qihEkVZ8RNm9iQd7G2iZz4rRAHizJ6T5m58Sn21fxfyg9zAMzhgd0JzXuPXR8lTTj4AvRyPv1Qx7b43smg==", + "dependencies": { + "@babel/preset-flow": "^7.12.1", + "@babel/preset-react": "^7.12.10", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/docs-tools": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/react-docgen-typescript-plugin": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.5.13", + "@types/estree": "^0.0.51", + "@types/node": "^14.14.20 || ^16.0.0", + "@types/webpack-env": "^1.16.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "babel-plugin-add-react-displayname": "^0.0.5", + "babel-plugin-react-docgen": "^4.2.1", + "core-js": "^3.8.2", + "escodegen": "^2.0.0", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^14.3.4", + "react-refresh": "^0.11.0", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "webpack": ">=4.43.0 <6.0.0" + }, + "bin": { + "build-storybook": "bin/build.js", + "start-storybook": "bin/index.js", + "storybook-server": "bin/index.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@babel/core": "^7.11.5", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "require-from-string": "^2.0.2" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@storybook/builder-webpack4": { + "optional": true + }, + "@storybook/builder-webpack5": { + "optional": true + }, + "@storybook/manager-webpack4": { + "optional": true + }, + "@storybook/manager-webpack5": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin": { + "version": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", + "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0.tgz", + "integrity": "sha512-eVg3BxlOm2P+chijHBTByr90IZVUtgRW56qEOLX7xlww2NBuKrcavBlcmn+HH7GIUktquWkMPtvy6e0W0NgA5w==", + "dependencies": { + "debug": "^4.1.1", + "endent": "^2.0.1", + "find-cache-dir": "^3.3.1", + "flat-cache": "^3.0.4", + "micromatch": "^4.0.2", + "react-docgen-typescript": "^2.1.1", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "typescript": ">= 3.x", + "webpack": ">= 4" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/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==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/@storybook/react/node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", + "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "dependencies": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <4.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@storybook/react/node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "node_modules/@storybook/react/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react/node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "node_modules/@storybook/react/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@storybook/react/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react/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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react/node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@storybook/react/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@storybook/react/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@storybook/router": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.13.tgz", + "integrity": "sha512-sf5aogfirH5ucD0d0hc2mKf2iyWsZsvXhr5kjxUQmgkcoflkGUWhc34sbSQVRQ1i8K5lkLIDH/q2s1Zr2SbzhQ==", + "dependencies": { + "@storybook/client-logger": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/router/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dependencies": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/source-loader": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.5.13.tgz", + "integrity": "sha512-tHuM8PfeB/0m+JigbaFp+Ld0euFH+fgOObH2W9rjEXy5vnwmaeex/JAdCprv4oL+LcDQEERqNULUUNIvbcTPAg==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "estraverse": "^5.2.0", + "global": "^4.4.0", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/source-loader/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@storybook/source-loader/node_modules/prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@storybook/store": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.5.13.tgz", + "integrity": "sha512-GG6lm+8fBX1tNUnX7x3raBOjYhhf14bPWLtYiPlxDTFEMs3sJte7zWKZq6NQ79MoBLL6jjzTeolBfDCBw6fiWQ==", + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "slash": "^3.0.0", + "stable": "^0.1.8", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/telemetry": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-6.5.13.tgz", + "integrity": "sha512-PFJEfGbunmfFWabD3rdCF8EHH+45578OHOkMPpXJjqXl94vPQxUH2XTVKQgEQJbYrgX0Vx9Z4tSkdMHuzYDbWQ==", + "dependencies": { + "@storybook/client-logger": "6.5.13", + "@storybook/core-common": "6.5.13", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "detect-package-manager": "^2.0.1", + "fetch-retry": "^5.0.2", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "isomorphic-unfetch": "^3.1.0", + "nanoid": "^3.3.1", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@storybook/testing-library": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@storybook/testing-library/-/testing-library-0.0.13.tgz", + "integrity": "sha512-vRMeIGer4EjJkTgI8sQyK9W431ekPWYCWL//OmSDJ64IT3h7FnW7Xg6p+eqM3oII98/O5pcya5049GxnjaPtxw==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "^6.4.0", + "@storybook/instrumenter": "^6.4.0", + "@testing-library/dom": "^8.3.0", + "@testing-library/user-event": "^13.2.1", + "ts-dedent": "^2.2.0" + } + }, + "node_modules/@storybook/testing-library/node_modules/@testing-library/dom": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz", + "integrity": "sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/testing-library/node_modules/@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@storybook/testing-library/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@storybook/testing-library/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/@storybook/testing-library/node_modules/deep-equal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.1.0.tgz", + "integrity": "sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/testing-library/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/@storybook/testing-library/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@storybook/testing-library/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/theming": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.13.tgz", + "integrity": "sha512-oif5NGFAUQhizo50r+ctw2hZNLWV4dPHai+L/gFvbaSeRBeHSNkIcMoZ2FlrO566HdGZTDutYXcR+xus8rI28g==", + "dependencies": { + "@storybook/client-logger": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/ui": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.5.13.tgz", + "integrity": "sha512-MklJuSg4Bc+MWjwhZVmZhJaucaeEBUMMa2V9oRWbIgZOdRHqdW72S2vCbaarDAYfBQdnfaoq1GkSQiw+EnWOzA==", + "dependencies": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/router": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "resolve-from": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/ui/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/ui/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", + "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", + "dependencies": { + "ejs": "^2.6.1", + "magic-string": "^0.25.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==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "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==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "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==", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "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==", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "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==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "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==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tabler/icons": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.7.0.tgz", + "integrity": "sha512-mSjUKhwN5fJHI9yITqFn9GXGnsJ4gBAyQDWyP4Ev5fk6hD78G7u6cHEF1KARr5FOOdiIKSZWCzNzUzyLhiNPrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-2.7.0.tgz", + "integrity": "sha512-WV2ZwMUuZN9QcCX4RPg9+G+ycUgoItzOWVCCQYVWbYKV581fH8szM2KVaQHQhMbttL4JYtOgf4ColJIDwsIgdw==", + "dependencies": { + "@tabler/icons": "2.7.0", + "prop-types": "^15.7.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", + "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^4.2.2", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.6", + "lz-string": "^1.4.4", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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/@testing-library/jest-dom": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz", + "integrity": "sha512-dfB7HVIgTNCxH22M1+KU6viG5of2ldoA5ly8Ar8xkezKHKXjRvznCdbMbqjYGgO2xjRbwnR+rR8MLUIqF3kKbQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^4.2.2", + "chalk": "^3.0.0", + "css": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/react": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz", + "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^7.28.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@testing-library/react-hooks": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-7.0.2.tgz", + "integrity": "sha512-dYxpz8u9m4q1TuzfcUApqi8iFfR6R0FaMbr2hjZJy1uC8z+bO/K4v8Gs9eogGKYQop7QsrBTFkv/BCF7MzD2Cg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@types/react": ">=16.9.0", + "@types/react-dom": ">=16.9.0", + "@types/react-test-renderer": ">=16.9.0", + "react-error-boundary": "^3.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0", + "react-test-renderer": ">=16.9.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-test-renderer": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "12.8.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", + "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@turf/area": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", + "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", + "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/centroid": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", + "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/helpers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", + "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/meta": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", + "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@types/aria-query": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz", + "integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "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==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/bs58check": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/bs58check/-/bs58check-2.1.0.tgz", + "integrity": "sha512-OxsysnJQh82vy9DRbOcw9m2j/WiyqZLn0YBhKxdQ+aCwoHj+tWzyCgpwAkr79IfDXZKxc6h7k89T9pwS78CqTQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/d3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.0.0.tgz", + "integrity": "sha512-7rMMuS5unvbvFCJXAkQXIxWTo2OUlmVXN5q7sfQFesuVICY55PSP6hhbUhWjTTNpfTTB3iLALsIYDFe7KUNABw==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.1.tgz", + "integrity": "sha512-D/G7oG0czeszALrkdUiV68CDiHDxXf+M2mLVqAyKktGd12VKQQljj1sHJGBKjcK4jRH1biBd6ZPQPHpJ0mNa0w==", + "dev": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.1.tgz", + "integrity": "sha512-zji/iIbdd49g9WN0aIsGcwcTBUkgLsCSwB+uH+LPVDAiKWENMtI3cJEWt+7/YYwelMoZmbBfzA3qCdrZ2XFNnw==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.1.tgz", + "integrity": "sha512-B532DozsiTuQMHu2YChdZU0qsFJSio3Q6jmBYGYNp3gMDzBmuFFgPt9qKA4VYuLZMp4qc6eX7IUFUEsvHiXZAw==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-eQfcxIHrg7V++W8Qxn6QkqBNBokyhdWSAS73AbkbMzvLQmVVBviknoz2SRS/ZJdIOmhcmmdCRE/NFOm28Z1AMw==", + "dev": true + }, + "node_modules/@types/d3-color": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-vcuR/rrvuoX6q0Rqe+gOScvYkTV7i6KZsfQozvThtAZ4CfuEM22OnZfiKP62nXHqRnIHXpBMy3JSha95qdYAxA==", + "dev": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-C3zfBrhHZvrpAAK3YXqLWVAGo87A4SvJ83Q/zVJ8rFWJdKejUnDYaWZPkA8K84kb2vDA/g90LTQAz7etXcgoQQ==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.0.tgz", + "integrity": "sha512-iGm7ZaGLq11RK3e69VeMM6Oqj2SjKUB9Qhcyd1zIcqn2uE8w9GFB445yCY46NOQO3ByaNyktX1DK+Etz7ZaX+w==", + "dev": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-NhxMn3bAkqhjoxabVJWKryhnZXXYYVQxaBnbANu0O94+O/nX9qSjrA1P1jbAQJxJf+VC72TxDX/YJcKue5bRqw==", + "dev": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.1.tgz", + "integrity": "sha512-o1Va7bLwwk6h03+nSM8dpaGEYnoIG19P0lKqlic8Un36ymh9NSkNFX1yiXMKNMx8rJ0Kfnn2eovuFaL6Jvj0zA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.0.tgz", + "integrity": "sha512-o0/7RlMl9p5n6FQDptuJVMxDf/7EDEv2SYEO/CwdG2tr1hTfUVi0Iavkk2ax+VpaQ/1jVhpnj5rq1nj8vwhn2A==", + "dev": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-toZJNOwrOIqz7Oh6Q7l2zkaNfXkfR7mFSJvGvlD/Ciq/+SQ39d5gynHJZ/0fjt83ec3WL7+u3ssqIijQtBISsw==", + "dev": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.1.tgz", + "integrity": "sha512-fY9fXELktloC4MospE1AMYk67p7zxbW1K79rdzZJ6oB2pddltiTelE9bz6YnZf9GboHhe9k0gwVjP7bOc7wjvg==", + "dev": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.0.tgz", + "integrity": "sha512-bbaJJs3Aye+C44aVbWW7qEgWNJQMtFNGsKq2L0OzjID2ewEUwb0Au8WF+b5PUrPkAqRKmtm4znYJadrYJMivYQ==", + "dev": true + }, + "node_modules/@types/d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-EFXzqJH7VFbnx6LJ3PBSYNCrxrjl6tFplmnJ9J4k7ICvL3QXSxG6APfKGe0A29sYkk7UV08avGkmfd/EqS5WbA==", + "dev": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.0.1.tgz", + "integrity": "sha512-bXAS5udAD5RXfM/FsWMP9ggCl9cWXH0417Mwpw6ytSDP+Oez+XP0SLFPG5oPQc3m7ZToKg3/b4UW8hC/F6Qddw==", + "dev": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dev": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-U+OiWUxoH2jFsznlQHLgP48dUgkvtkFpjqW9Y9w8W9z3lo1OyQC1gdbKDfH1CxRUOWMY9fSYEYWc2ErNieyVew==", + "dev": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.1.tgz", + "integrity": "sha512-GDuXcRcR6mKcpUVMhPNttpOzHi2dP6YcDqLZYSZHgwTZ+sfCa8e9q0VEBwZomblAPNMYpVqxojnSyIEb4s/Pwg==", + "dev": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-SZsDWFG1dLV9ivX2wGDPFWgLUf71tF4aupfEMTYMrbArHwEMLhmv3TS1CZECLQgoTttdpM1g5Z6JwRP7zoInWg==", + "dev": true + }, + "node_modules/@types/d3-shape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.0.0.tgz", + "integrity": "sha512-c1Wu/JwJJHSeY/M26pzNfuaybLCcTOkn1xxxVH7riuYObpvI8SfyDD30F8mqG+NHZuZTeIdKj4lej1USZ0V5vQ==", + "dev": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "dev": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "dev": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-Sv4qEI9uq3bnZwlOANvYK853zvpdKEm1yz9rcc8ZTsxvRklcs9Fx4YFuGA3gXoQN/c/1T6QkVNjhaRO/cWj94g==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.1.tgz", + "integrity": "sha512-7s5L9TjfqIYQmQQEUcpMAcBOahem7TRoSO/+Gkz02GbMVuULiZzjF2BOdw291dbO2aNon4m2OdFsRGaCq2caLQ==", + "dev": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/dot-object": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/dot-object/-/dot-object-2.1.2.tgz", + "integrity": "sha512-mARrpJofLNe6yhlukeBcznBe8ssZo5ZJ/CJWc3JKmG9L9151s0OHK+mealnkqSgO6cSn1219vND2wgL67Cuqiw==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", + "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "node_modules/@types/file-saver": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.3.tgz", + "integrity": "sha512-MBIou8pd/41jkff7s97B47bc9+p0BszqqDJsO51yDm49uUxeKzrfuNl5fSLC6BpLEWKA8zlwyqALVmXrFwoBHQ==", + "dev": true + }, + "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==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/history/-/history-5.0.0.tgz", + "integrity": "sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==", + "deprecated": "This is a stub types definition. history provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "history": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "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==" + }, + "node_modules/@types/humanize-duration": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/@types/humanize-duration/-/humanize-duration-3.25.1.tgz", + "integrity": "sha512-WZU/4bb+lvzyDmZzjJtp++9mfKy6B3lH6gGISgkcz6SU8hMILKRM0vi08TxIsb0dQB4Gzo68MWLmctu6xqUi9g==", + "dev": true + }, + "node_modules/@types/is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==" + }, + "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==" + }, + "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==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "26.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz", + "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", + "dev": true, + "dependencies": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "node_modules/@types/js-cookie": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", + "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + }, + "node_modules/@types/lodash": { + "version": "4.14.170", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz", + "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.4.tgz", + "integrity": "sha512-BBz79DCJbD2CVYZH67MBeHZRX++HF+5p8Mo5MzjZi64Wac39S3diedJYHZtScbRVf4DjZyN6LzA0SB0zy+HSSQ==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/marked": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.7.tgz", + "integrity": "sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==", + "dev": true + }, + "node_modules/@types/md5": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.1.tgz", + "integrity": "sha512-OK3oe+ALIoPSo262lnhAYwpqFNXbiwH2a+0+Z5YBnkQEwWD8fk5+PIeRhYA48PzvX9I4SGNpWy+9bLj8qz92RQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "12.20.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.15.tgz", + "integrity": "sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/node-sass": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@types/node-sass/-/node-sass-4.11.2.tgz", + "integrity": "sha512-pOFlTw/OtZda4e+yMjq6/QYuvY0RDMQ+mxXdWj7rfSyf18V8hS4SfgurO+MasAkQsv6Wt6edOGlwh5QqJml9gw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, + "node_modules/@types/npmlog": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.4.tgz", + "integrity": "sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==" + }, + "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==" + }, + "node_modules/@types/parse5": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.2.tgz", + "integrity": "sha512-+hQX+WyJAOne7Fh3zF5CxPemILIbuhNcqHHodzK9caYOLnC8pD5efmPleRnw0z++LfKUC/sVNMwk0Gap+B0baA==" + }, + "node_modules/@types/plotly.js": { + "version": "1.54.17", + "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-1.54.17.tgz", + "integrity": "sha512-2nk1jEDQ85Ix6SQsC7M7Otl5M8OoYwTl7V/x2ptyX373slUJAj+vQ3njYGy/h9p/rxTq7W0fn3JvXjuxXuA0Qg==", + "dev": true, + "dependencies": { + "@types/d3": "^3" + } + }, + "node_modules/@types/plotly.js/node_modules/@types/d3": { + "version": "3.5.46", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.46.tgz", + "integrity": "sha512-jNHfiGd41+JUV43LTMzQNidyp4Hn0XfhoSmy8baE0d/N5pGYpD+yX03JacY/MH+smFxYOQGXlz4HxkRZOuRNOQ==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==" + }, + "node_modules/@types/pretty-hrtime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz", + "integrity": "sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==" + }, + "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==" + }, + "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==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/react": { + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.11.tgz", + "integrity": "sha512-yFRQbD+whVonItSk7ZzP/L+gPTJVBkL/7shLEF+i9GC/1cV3JmUxEQz6+9ylhUpWSDuqo1N9qEvqS6vTj4USUA==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-1lBBxVSutE8CQM37Jq7KvJwuA94qaEEqsx+G0dnwzG6Sfwf6JGcNeFk5jjjhJli1q2naeMZm+D/dvT/zyX4QPw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-dom": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.8.tgz", + "integrity": "sha512-0ohAiJAx1DAUEcY9UopnfwCE9sSMDGnY/oXjWMax6g3RpzmTt2GMyMVAXcbn0mo8XAff0SbQJl2/SBU+hjSZ1A==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-plotly.js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@types/react-plotly.js/-/react-plotly.js-2.5.0.tgz", + "integrity": "sha512-bda7N/Y65d1x0FfwhgUXAugGeG9CRIxmkW/yBL8PVFUMvZGpfEnw4bXKjDozBYlOskVfxj6UQ9IKmZI6CZ7/QQ==", + "dev": true, + "dependencies": { + "@types/plotly.js": "*", + "@types/react": "*" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.18", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.18.tgz", + "integrity": "sha512-9iwAsPyJ9DLTRH+OFeIrm9cAbIj1i2ANL3sKQFATqnPWRbg+jEFXyZOKHiQK/N86pNRXbb4HRxAxo0SIX1XwzQ==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.15.tgz", + "integrity": "sha512-z3UlMG/x91SFEVmmvykk9FLTliDvfdIUky4k2rCfXWQ0NKbrP8o9BTCaCTPuYsB8gDkUnUmkcA2vYlm2DR+HAA==", + "dev": true, + "dependencies": { + "@types/history": "*", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", + "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "dev": true, + "dependencies": { + "@types/history": "*", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react-test-renderer": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz", + "integrity": "sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-window": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.4.tgz", + "integrity": "sha512-rFJ0h1nYffFBNi6N80CFORAQNNr+440RtGCAmKyn81U99pXRoxS2goi/fkYnUJtk+LcvWCp8cmP16M8loJJsjw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react/node_modules/csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + }, + "node_modules/@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "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==" + }, + "node_modules/@types/storybook__react": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@types/storybook__react/-/storybook__react-5.2.1.tgz", + "integrity": "sha512-p4QGO+VjEO3YxyWVHpPylNheA0JhStzoCg6RBTmdobrC0ZqLPEIIWu0pFkHlNkmGIiEKW2yDGFJooBe8M4Df0Q==", + "deprecated": "Deprecated", + "dev": true, + "dependencies": { + "@storybook/react": "*" + } + }, + "node_modules/@types/styled-components": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.15.tgz", + "integrity": "sha512-4evch8BRI3AKgb0GAZ/sn+mSeB+Dq7meYtMi7J/0Mg98Dt1+r8fySOek7Sjw1W+Wskyjc93565o5xWAT/FdY0Q==", + "dev": true, + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/styled-components/node_modules/csstype": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", + "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==", + "dev": true + }, + "node_modules/@types/tapable": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", + "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.0.tgz", + "integrity": "sha512-l2P2GO+hFF4Liye+fAajT1qBqvZOiL79YMpEvgGs1xTK7hECxBI8Wz4J7ntACJNiJ9r0vXQqYovroXRLPDja6A==", + "dev": true, + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/uglify-js": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", + "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@types/webpack": { + "version": "4.41.29", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz", + "integrity": "sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q==", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-env": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz", + "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==" + }, + "node_modules/@types/webpack-sources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/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==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/yargs": { + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.0.tgz", + "integrity": "sha512-KcF6p3zWhf1f8xO84tuBailV5cN92vhS+VT7UJsPzGBm9VnQqfI9AsiMUFUCYHTYPg1uCCo+HyiDnpDuvkAMfQ==", + "dependencies": { + "@typescript-eslint/experimental-utils": "4.28.0", + "@typescript-eslint/scope-manager": "4.28.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz", + "integrity": "sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==", + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/typescript-estree": "4.28.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.0.tgz", + "integrity": "sha512-7x4D22oPY8fDaOCvkuXtYYTQ6mTMmkivwEzS+7iml9F9VkHGbbZ3x4fHRwxAb5KeuSkLqfnYjs46tGx2Nour4A==", + "dependencies": { + "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/typescript-estree": "4.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz", + "integrity": "sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==", + "dependencies": { + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/visitor-keys": "4.28.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.0.tgz", + "integrity": "sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz", + "integrity": "sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==", + "dependencies": { + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/visitor-keys": "4.28.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz", + "integrity": "sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==", + "dependencies": { + "@typescript-eslint/types": "4.28.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@uiw/react-textarea-code-editor": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@uiw/react-textarea-code-editor/-/react-textarea-code-editor-1.4.14.tgz", + "integrity": "sha512-OCOyRY48JdA0SooXQWpEls2ZyFXyv+hR61SW4wLH+kdKnAeR72MSgehuU2R3k455+k8QLtsk0MVyctBJ8HLvVw==", + "dependencies": { + "@babel/runtime": "7.15.4", + "@mapbox/rehype-prism": "0.8.0", + "rehype": "12.0.0" + }, + "peerDependencies": { + "@babel/runtime": ">=7.10.0", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@uiw/react-textarea-code-editor/node_modules/@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "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==" + }, + "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==" + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/abs-svg-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", + "integrity": "sha1-32Acjo0roQ1KdtYl4japo5wnI78=" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "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==", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.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==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/airbnb-js-shims": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz", + "integrity": "sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==", + "dependencies": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "array.prototype.flatmap": "^1.2.1", + "es5-shim": "^4.5.13", + "es6-shim": "^0.35.5", + "function.prototype.name": "^1.1.0", + "globalthis": "^1.0.0", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0 || ^1.0.0", + "object.getownpropertydescriptors": "^2.0.3", + "object.values": "^1.1.0", + "promise.allsettled": "^1.0.0", + "promise.prototype.finally": "^3.1.0", + "string.prototype.matchall": "^4.0.0 || ^3.0.1", + "string.prototype.padend": "^3.0.0", + "string.prototype.padstart": "^3.0.0", + "symbol.prototype.description": "^1.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "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==", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "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==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/almost-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", + "integrity": "sha1-+FHGMROHV5lCdqou++jfowZszN0=" + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dependencies": { + "string-width": "^2.0.0" + } + }, + "node_modules/ansi-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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-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==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-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=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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=", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-to-html": { + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.15.tgz", + "integrity": "sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==", + "dependencies": { + "entities": "^2.0.0" + }, + "bin": { + "ansi-to-html": "bin/ansi-to-html" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/antd": { + "version": "4.24.8", + "resolved": "https://registry.npmjs.org/antd/-/antd-4.24.8.tgz", + "integrity": "sha512-wrNy2Hi27uM3948okG3n2GwzQKBFUn1Qn5mn2I/ALcR28rC6cTjHYOuA248Zl9ECzz3jo4TY2R0SIa+5GZ/zGA==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons": "^4.7.0", + "@ant-design/react-slick": "~0.29.1", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.4.0", + "classnames": "^2.2.6", + "copy-to-clipboard": "^3.2.0", + "lodash": "^4.17.21", + "moment": "^2.29.2", + "rc-cascader": "~3.7.0", + "rc-checkbox": "~2.3.0", + "rc-collapse": "~3.4.2", + "rc-dialog": "~9.0.2", + "rc-drawer": "~6.1.0", + "rc-dropdown": "~4.0.0", + "rc-field-form": "~1.27.0", + "rc-image": "~5.13.0", + "rc-input": "~0.1.4", + "rc-input-number": "~7.3.9", + "rc-mentions": "~1.13.1", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.1", + "rc-notification": "~4.6.0", + "rc-pagination": "~3.2.0", + "rc-picker": "~2.7.0", + "rc-progress": "~3.4.1", + "rc-rate": "~2.9.0", + "rc-resize-observer": "^1.2.0", + "rc-segmented": "~2.1.0", + "rc-select": "~14.1.13", + "rc-slider": "~10.0.0", + "rc-steps": "~5.0.0-alpha.2", + "rc-switch": "~3.2.0", + "rc-table": "~7.26.0", + "rc-tabs": "~12.5.6", + "rc-textarea": "~0.4.5", + "rc-tooltip": "~5.2.0", + "rc-tree": "~5.7.0", + "rc-tree-select": "~5.5.0", + "rc-trigger": "^5.2.10", + "rc-upload": "~4.3.0", + "rc-util": "^5.22.5", + "scroll-into-view-if-needed": "^2.2.25" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-dir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", + "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==" + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "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" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.2.tgz", + "integrity": "sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.9.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/aria-hidden/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, + "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=", + "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==", + "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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-bounds": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", + "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==" + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "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==" + }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-normalize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", + "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", + "dependencies": { + "array-bounds": "^1.0.0" + } + }, + "node_modules/array-range": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", + "integrity": "sha1-9W5GWRhDYRxqVvd+8C7afFAIm/w=" + }, + "node_modules/array-rearrange": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz", + "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==" + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "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=", + "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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", + "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "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/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "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/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dependencies": { + "inherits": "2.0.1" + } + }, + "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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + }, + "node_modules/ast-types/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "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==" + }, + "node_modules/async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "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==" + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "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==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/atob-lite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=" + }, + "node_modules/autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/axe-core": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.3.tgz", + "integrity": "sha512-pXnVMfJKSIWU2Ml4JHP7pZEPIrgBO1Fd3WGx+fPBsS+KRGhE4vxooD8XBGWbQOIVSZsVK7pUDBBkCicNu80yzQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "node_modules/babel-code-frame/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=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">= 4.12.1" + } + }, + "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "dependencies": { + "babylon": "^6.18.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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/babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dependencies": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 6.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/babel-plugin-add-react-displayname": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz", + "integrity": "sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==" + }, + "node_modules/babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@babel/core": "^7.11.6" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop/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==" + }, + "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==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/babel-plugin-extract-import-names/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==" + }, + "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==", + "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==", + "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-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", + "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-react-docgen": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz", + "integrity": "sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==", + "dependencies": { + "ast-types": "^0.14.2", + "lodash": "^4.17.15", + "react-docgen": "^5.0.0" + } + }, + "node_modules/babel-plugin-styled-components": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.3.tgz", + "integrity": "sha512-meGStRGv+VuKA/q0/jXxrPNWEm4LPfYIqxooDTdmh8kFsP/Ph7jJG5rUPwUPX3QHUvggwdbgdGpo88P/rRYsVw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-module-imports": "^7.15.4", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "node_modules/babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "node_modules/babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dependencies": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", + "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", + "dependencies": { + "@babel/core": "7.12.3", + "@babel/plugin-proposal-class-properties": "7.12.1", + "@babel/plugin-proposal-decorators": "7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", + "@babel/plugin-proposal-numeric-separator": "7.12.1", + "@babel/plugin-proposal-optional-chaining": "7.12.1", + "@babel/plugin-transform-flow-strip-types": "7.12.1", + "@babel/plugin-transform-react-display-name": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.12.1", + "@babel/preset-typescript": "7.12.1", + "@babel/runtime": "7.12.1", + "babel-plugin-macros": "2.8.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "dependencies": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/preset-react": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", + "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.1", + "@babel/plugin-transform-react-jsx-development": "^7.12.1", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/babel-preset-react-app/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "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-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "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=", + "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==", + "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==", + "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==", + "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==", + "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/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "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/better-opn": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", + "integrity": "sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==", + "dependencies": { + "open": "^7.0.3" + }, + "engines": { + "node": ">8.0.0" + } + }, + "node_modules/bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "dependencies": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "optional": true, + "engines": { + "node": ">=0.6" + } + }, + "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==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/binary-search-bounds": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bit-twiddle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", + "integrity": "sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4=" + }, + "node_modules/bitmap-sdf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz", + "integrity": "sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg==", + "dependencies": { + "clamp": "^1.0.1" + } + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "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==", + "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==", + "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==", + "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=" + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "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=" + }, + "node_modules/boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dependencies": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bplist-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", + "integrity": "sha512-2AEM0FXy8ZxVLBuqX0hqt1gDwcnz2zygEkQ6zaD5Wko/sB9paUNwlpawrFtKeHUAQUOzjVy9AO4oeonqIHKA9Q==", + "optional": true, + "dependencies": { + "big-integer": "^1.6.7" + } + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "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==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/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/browserify-sign/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==", + "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/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/browserslist/node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "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==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "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==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/buffer/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c8": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", + "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/c8/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c8/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c8/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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c8/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c8/node_modules/v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/c8/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/c8/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "dependencies": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "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/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/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==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "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==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camel-case/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/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/camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001434", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", + "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/canvas-fit": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", + "integrity": "sha1-rhO+Zq3kL1vg5IfjRfzjCl5bXl8=", + "dependencies": { + "element-size": "^1.1.1" + } + }, + "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==", + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", + "engines": { + "node": ">=4" + } + }, + "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/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "engines": { + "node": "*" + } + }, + "node_modules/check-types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "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==" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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==" + }, + "node_modules/clamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", + "integrity": "sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ=" + }, + "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==", + "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=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "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==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "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==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "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==", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==" + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "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==", + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "node_modules/color-alpha": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", + "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==", + "dependencies": { + "color-parse": "^1.3.8" + } + }, + "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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", + "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", + "dependencies": { + "clamp": "^1.0.1" + } + }, + "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==" + }, + "node_modules/color-normalize": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz", + "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==", + "dependencies": { + "clamp": "^1.0.1", + "color-rgba": "^2.1.1", + "dtype": "^2.0.0" + } + }, + "node_modules/color-parse": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.3.8.tgz", + "integrity": "sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA==", + "dependencies": { + "color-name": "^1.0.0", + "defined": "^1.0.0", + "is-plain-obj": "^1.1.0" + } + }, + "node_modules/color-rgba": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.1.1.tgz", + "integrity": "sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==", + "dependencies": { + "clamp": "^1.0.1", + "color-parse": "^1.3.8", + "color-space": "^1.14.6" + } + }, + "node_modules/color-space": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.16.0.tgz", + "integrity": "sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==", + "dependencies": { + "hsluv": "^0.0.3", + "mumath": "^3.3.4" + } + }, + "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==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "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==" + }, + "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==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comlink": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.3.1.tgz", + "integrity": "sha512-+YbhUdNrpBZggBAHWcgQMLPLH1KDF3wJpeqrCKieWQ8RL7atmgsgTQko1XEBK6PsecfopWNntopJ+ByYG1lRaA==" + }, + "node_modules/comlink-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/comlink-loader/-/comlink-loader-2.0.0.tgz", + "integrity": "sha512-106/k0JSssSCo2QO4ucbgbyWsb2zAEOSXFAVH2A+EO8kOz3n2BkvmkToxsoo+SWKUIKy8qubhAOLCS5mpFUvHw==", + "dev": true, + "dependencies": { + "comlink": "^4.2.0", + "loader-utils": "^1.1.0", + "slash": "^3.0.0", + "worker-loader": "^2.0.0" + } + }, + "node_modules/comlink-loader/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/comlink-loader/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/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/comment-json": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-2.4.2.tgz", + "integrity": "sha512-T+iXox779qsqneMYx/x5BZyz4xjCeQRmuNVzz8tko7qZUs3MlzpA3RAs+O1XsgcKToNBMIvfVzafGOeiU7RggA==", + "dependencies": { + "core-util-is": "^1.0.2", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "node_modules/common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "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==" + }, + "node_modules/compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "dependencies": { + "arity-n": "^1.0.4" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "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==", + "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==", + "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=" + }, + "node_modules/compute-dims": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/compute-dims/-/compute-dims-1.1.0.tgz", + "integrity": "sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg==", + "dependencies": { + "utils-copy": "^1.0.0", + "validate.io-array": "^1.0.6", + "validate.io-matrix-like": "^1.0.2", + "validate.io-ndarray-like": "^1.0.0", + "validate.io-positive-integer": "^1.0.0" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", + "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==" + }, + "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=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "dependencies": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/configstore/node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/configstore/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/configstore/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" + }, + "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==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "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=" + }, + "node_modules/const-max-uint32": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/const-max-uint32/-/const-max-uint32-1.0.2.tgz", + "integrity": "sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY=" + }, + "node_modules/const-pinf-float64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz", + "integrity": "sha1-9u+w15+cCYbT558pI6v5twtj1yY=" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "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==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "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==", + "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=" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.0.tgz", + "integrity": "sha512-GUbtPllXMYRzIgHNZ4dTYTcUemls2cni83Q4Q/TrFONHfhcg9oEGOtaGHfb0cpzec60P96UKPvMkjX1jET8rUw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.0.tgz", + "integrity": "sha512-8X6lWsG+s7IfOKzV93a7fRYfWRZobOfjw5V5rrq43Vh/W+V6qYxl7Akalsvgab4PFT/4L/pjQbdBUEM36NXKrw==", + "dependencies": { + "browserslist": "^4.16.6", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "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==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js-pure": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", + "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-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=" + }, + "node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "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/country-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", + "integrity": "sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY=" + }, + "node_modules/cp-file": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz", + "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "nested-error-stacks": "^2.0.0", + "p-event": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cp-file/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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cp-file/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/cpy": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/cpy/-/cpy-8.1.2.tgz", + "integrity": "sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==", + "dependencies": { + "arrify": "^2.0.1", + "cp-file": "^7.0.0", + "globby": "^9.2.0", + "has-glob": "^1.0.0", + "junk": "^3.1.0", + "nested-error-stacks": "^2.1.0", + "p-all": "^2.1.0", + "p-filter": "^2.1.0", + "p-map": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cpy/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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/cpy/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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cpy/node_modules/fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dependencies": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cpy/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "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/cpy/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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/cpy/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": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cpy/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/cpy/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cpy/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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/cpy/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cpy/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cpy/node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/cpy/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cpy/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": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "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==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "engines": { + "node": "*" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "dependencies": { + "postcss": "^7.0.5" + }, + "bin": { + "css-blank-pseudo": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-font": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", + "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==", + "dependencies": { + "css-font-size-keywords": "^1.0.0", + "css-font-stretch-keywords": "^1.0.1", + "css-font-style-keywords": "^1.0.1", + "css-font-weight-keywords": "^1.0.0", + "css-global-keywords": "^1.0.1", + "css-system-font-keywords": "^1.0.0", + "pick-by-alias": "^1.2.0", + "string-split-by": "^1.0.0", + "unquote": "^1.1.0" + } + }, + "node_modules/css-font-size-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", + "integrity": "sha1-hUh1rOmspqjS7g00WkSq6btttss=" + }, + "node_modules/css-font-stretch-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", + "integrity": "sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA=" + }, + "node_modules/css-font-style-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", + "integrity": "sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ=" + }, + "node_modules/css-font-weight-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", + "integrity": "sha1-m8BGcayFvHJLV07106yWsNYE/Zc=" + }, + "node_modules/css-global-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", + "integrity": "sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk=" + }, + "node_modules/css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "bin": { + "css-has-pseudo": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "dependencies": { + "camelcase": "^6.0.0", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "dependencies": { + "postcss": "^7.0.5" + }, + "bin": { + "css-prefers-color-scheme": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "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==" + }, + "node_modules/css-system-font-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", + "integrity": "sha1-hcbwhquk6zLFcaMIav/ENLhII+0=" + }, + "node_modules/css-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "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==", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "dependencies": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, + "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==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=", + "dev": true + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs=" + }, + "node_modules/cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "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==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssfontparser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", + "integrity": "sha1-9AIvyPlwDGgCnVQghK+69CWj8+M=", + "dev": true + }, + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "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==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "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==" + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "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==" + }, + "node_modules/csstype": { + "version": "2.6.17", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", + "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "optional": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "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==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/d3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.0.0.tgz", + "integrity": "sha512-t+jEKGO2jQiSBLJYYq6RFc500tsCeXBB4x41oQaSnZD3Som95nQrlw9XJGrFTMUOQOkwSMauWy9+8Tz1qm9UZw==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.0.1.tgz", + "integrity": "sha512-l3Bh5o8RSoC3SBm5ix6ogaFW+J6rOUm42yOtZ2sQPCEvCqUMepeX7zgrlLLGIemxgOyo9s2CsWEidnLv5PwwRw==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-hdL7+HBIohpgfolhBxr1KX47VMD6+vVD/oEFrxk5yhmzV2prk99EkFKYpXuhVkFpTgHdJ6/4bYcjdLPPXV4tIA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo-projection": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz", + "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==", + "dependencies": { + "commander": "2", + "d3-array": "1", + "d3-geo": "^1.12.0", + "resolve": "^1.1.10" + }, + "bin": { + "geo2svg": "bin/geo2svg", + "geograticule": "bin/geograticule", + "geoproject": "bin/geoproject", + "geoquantize": "bin/geoquantize", + "geostitch": "bin/geostitch" + } + }, + "node_modules/d3-geo-projection/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-geo-projection/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-geo-projection/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": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.0.1.tgz", + "integrity": "sha512-RlLTaofEoOrMK1JoXYIGhKTkJFI/6rFrYPgxy6QlZo2BcVc4HGTqEU0rPpzuMq5T/5XcMtAzv1XiLA3zRTfygw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.0.tgz", + "integrity": "sha512-foHQYKpWQcyndH1CGoHdUC4PECxTxonzwwBXGT8qu+Drb1FIc6ON6dG2P5f4hRRMkLiIKeWK7iFtdznDUrnuPQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.0.1.tgz", + "integrity": "sha512-HNZNEQoDhuCrDWEc/BMbF/hKtzMZVoe64TvisFLDp2Iyj0UShB/E6/lBsLlJTfBMbYgftHj90cXJ0SEitlE6Xw==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-nzaCwlj+ZVBIlFuVOT1RmU+6xb/7D5IcnhHzHQcBgS/aTa5K9fWZNN5LCXA27LgF5WxoSNJqKBbLcGMtM6Ca6A==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" + }, + "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==", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "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==" + }, + "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=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "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==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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=" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-1.0.4.tgz", + "integrity": "sha512-qPy925qewwul9Hifs+3sx1ZYn14obHxpkX+mPD369w4Rzg+YkJBgi3SOvwUq81nWSjqGUegIgEPwD8u+HUnxlw==", + "optional": true, + "dependencies": { + "bplist-parser": "^0.1.0", + "meow": "^3.1.0", + "untildify": "^2.0.0" + }, + "bin": { + "default-browser-id": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "optional": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "optional": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "optional": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "optional": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "optional": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "optional": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "optional": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "optional": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "optional": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "optional": 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==", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/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==", + "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/default-gateway/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "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/default-gateway/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==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/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=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/default-gateway/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=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/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/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "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==", + "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==", + "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/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "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/del/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "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/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "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=", + "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=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "dependencies": { + "repeat-string": "^1.5.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-kerning": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz", + "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/detect-package-manager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", + "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", + "dependencies": { + "execa": "^5.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "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==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "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=" + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "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=", + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", + "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", + "dev": true + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "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==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-helpers/node_modules/csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + }, + "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==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "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==" + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "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==", + "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==", + "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==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/dot-object": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-2.1.4.tgz", + "integrity": "sha512-7FXnyyCLFawNYJ+NhkqyP9Wd2yzuo+7n9pGiYpkmXCTYa8Ci2U0eUNDVg5OuO5Pm6aFXI2SWN8/N/w7SJWu1WA==", + "dependencies": { + "commander": "^4.0.0", + "glob": "^7.1.5" + }, + "bin": { + "dot-object": "bin/dot-object" + } + }, + "node_modules/dot-object/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "node_modules/draw-svg-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", + "integrity": "sha1-bxFtli3TFLmepTTW9Y3WbNvWk3k=", + "dependencies": { + "abs-svg-path": "~0.1.1", + "normalize-svg-path": "~0.1.0" + } + }, + "node_modules/dtype": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", + "integrity": "sha1-zQUjI84GFETs0uj1dI9popvihDQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/dup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", + "integrity": "sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk=" + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/earcut": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.3.tgz", + "integrity": "sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug==" + }, + "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/editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dependencies": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "bin": { + "editorconfig": "bin/editorconfig" + } + }, + "node_modules/editorconfig/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/editorconfig/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/editorconfig/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "hasInstallScript": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + }, + "node_modules/element-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", + "integrity": "sha1-ZOXxWdlxIWMYRby67K8nnDm1404=" + }, + "node_modules/elementary-circuits-directed-graph": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz", + "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==", + "dependencies": { + "strongly-connected-components": "^1.0.1" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "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=", + "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==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/endent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", + "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", + "dependencies": { + "dedent": "^0.7.0", + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.5" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "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==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "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==", + "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==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "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==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "dependencies": { + "stackframe": "^1.1.1" + } + }, + "node_modules/es-abstract": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "node_modules/es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "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==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es5-shim": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.7.tgz", + "integrity": "sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==", + "engines": { + "node": ">=0.4.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=", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-shim": { + "version": "0.35.6", + "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.6.tgz", + "integrity": "sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==" + }, + "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==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "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=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "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/escodegen/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=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==", + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "dependencies": { + "confusing-browser-globals": "^1.0.10" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0", + "@typescript-eslint/parser": "^4.0.0", + "babel-eslint": "^10.0.0", + "eslint": "^7.5.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-jest": "^24.0.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.20.3", + "eslint-plugin-react-hooks": "^4.0.8", + "eslint-plugin-testing-library": "^3.9.0" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + }, + "eslint-plugin-testing-library": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", + "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "dependencies": { + "debug": "^3.2.7", + "find-up": "^2.1.0", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.7.2.tgz", + "integrity": "sha512-7Oq/N0+3nijBnYWQYzz/Mp/7ZCpwxYvClRyW/PLAmimY9uLCBvoXsNsERcJdkKceyOjgRbFhhxs058KTrne9Mg==", + "dependencies": { + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz", + "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==", + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.0", + "has": "^1.0.3", + "is-core-module": "^2.7.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/eslint-plugin-import/node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-import/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "24.3.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz", + "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==", + "dependencies": { + "@typescript-eslint/experimental-utils": "^4.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": ">= 4", + "eslint": ">=5" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/eslint-plugin-prettier": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", + "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", + "dependencies": { + "@typescript-eslint/experimental-utils": "^3.10.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "dependencies": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", + "dependencies": { + "@types/eslint": "^7.2.6", + "arrify": "^2.0.1", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/eslint-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==", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "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==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "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==", + "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==", + "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==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-to-babel": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/estree-to-babel/-/estree-to-babel-3.2.1.tgz", + "integrity": "sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==", + "dependencies": { + "@babel/traverse": "^7.1.6", + "@babel/types": "^7.2.0", + "c8": "^7.6.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "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=", + "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==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", + "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "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" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "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=", + "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==", + "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=", + "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=", + "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=" + }, + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "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/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "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=" + }, + "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==", + "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=" + }, + "node_modules/express/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=" + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "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==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "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=", + "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=", + "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==", + "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==", + "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==", + "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/falafel": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz", + "integrity": "sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==", + "dependencies": { + "acorn": "^7.1.1", + "foreach": "^2.0.5", + "isarray": "^2.0.1", + "object-keys": "^1.0.6" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/falafel/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "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==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-isnumeric": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz", + "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==", + "dependencies": { + "is-string-blank": "^1.0.1" + } + }, + "node_modules/fast-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==" + }, + "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==" + }, + "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=" + }, + "node_modules/fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "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==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fetch-retry": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.3.tgz", + "integrity": "sha512-uJQyMrX5IJZkhoEUBQ3EjxkeiZkppBd5jS/fMTJmfZxLSiaQjv2zD0kTvuvkSH89uFvgSlB6ueGpjD3HWN7Bxw==" + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/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==", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "node_modules/file-system-cache": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.1.0.tgz", + "integrity": "sha512-IzF5MBq+5CR0jXx5RxPe4BICl/oEhBSXKaL9fLhAXrIfIUS77Hr4vzrYyqYMHN6uTt+BOqi3fDCTjjEBCjERKw==", + "dependencies": { + "fs-extra": "^10.1.0", + "ramda": "^0.28.0" + } + }, + "node_modules/file-system-cache/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "node_modules/filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "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==", + "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=" + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==" + }, + "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==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" + }, + "node_modules/flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash." + }, + "node_modules/flatten-vertex-data": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", + "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", + "dependencies": { + "dtype": "^2.0.0" + } + }, + "node_modules/flip-pixels": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flip-pixels/-/flip-pixels-1.0.2.tgz", + "integrity": "sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA==" + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/focus-lock": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.8.1.tgz", + "integrity": "sha512-/LFZOIo82WDsyyv7h7oc0MJF9ACOvDRdx9rWPZ2pgMfNWu/z8hQDBtOchuB/0BVLmuFOZjV02YwUVzNsWx/EzA==", + "dev": true, + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/font-atlas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz", + "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==", + "dependencies": { + "css-font": "^1.0.0" + } + }, + "node_modules/font-measure": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", + "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", + "dependencies": { + "css-font": "^1.2.0" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.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/fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "dependencies": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "engines": { + "node": ">=6.11.5", + "yarn": ">=1.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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/fork-ts-checker-webpack-plugin/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=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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/fork-ts-checker-webpack-plugin/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=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formik": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", + "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==", + "funding": [ + { + "type": "individual", + "url": "https://opencollective.com/formik" + } + ], + "dependencies": { + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "react-fast-compare": "^2.0.1", + "tiny-warning": "^1.0.2", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/formik/node_modules/deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "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=", + "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=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "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", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzy-search": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/fuzzy-search/-/fuzzy-search-3.2.1.tgz", + "integrity": "sha512-vAcPiyomt1ioKAsAL2uxSABHJ4Ju/e4UeDM+g1OlR0vV4YhLGMNsdLNvZTpEDY4JCSt0E4hASCNM5t2ETtsbyg==" + }, + "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/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/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/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/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/gemoji": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-6.1.0.tgz", + "integrity": "sha512-MOlX3doQ1fsfzxQX8Y+u6bC5Ssc1pBUBIPVyrS69EzKt+5LIZAOm0G5XGVNhwXFgkBF3r+Yk88ONyrFHo8iNFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-canvas-context": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", + "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "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==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "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/git-config-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", + "integrity": "sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ=", + "dependencies": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "homedir-polyfill": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-config-path/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-username": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/git-username/-/git-username-1.0.0.tgz", + "integrity": "sha512-xm45KwBR6Eu1jO4umx/o2M84v9TC7tdOBuzLx8ayhdR9H1FBiiG9azz31uC0esDvaWVBTDINpJ5USomk+ja8OQ==", + "dependencies": { + "parse-github-url": "^1.0.2", + "remote-origin-url": "^1.0.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "dev": true + }, + "node_modules/gl-mat4": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", + "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" + }, + "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/gl-text": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.3.1.tgz", + "integrity": "sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w==", + "dependencies": { + "bit-twiddle": "^1.0.2", + "color-normalize": "^1.5.0", + "css-font": "^1.2.0", + "detect-kerning": "^2.1.2", + "es6-weak-map": "^2.0.3", + "flatten-vertex-data": "^1.0.2", + "font-atlas": "^2.1.0", + "font-measure": "^1.2.2", + "gl-util": "^3.1.2", + "is-plain-obj": "^1.1.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "parse-unit": "^1.0.1", + "pick-by-alias": "^1.2.0", + "regl": "^2.0.0", + "to-px": "^1.0.1", + "typedarray-pool": "^1.1.0" + } + }, + "node_modules/gl-util": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz", + "integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==", + "dependencies": { + "is-browser": "^2.0.1", + "is-firefox": "^1.0.3", + "is-plain-obj": "^1.1.0", + "number-is-integer": "^1.0.1", + "object-assign": "^4.1.0", + "pick-by-alias": "^1.2.0", + "weak-map": "^1.0.5" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-promise": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", + "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "dependencies": { + "@types/glob": "*" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "glob": "*" + } + }, + "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==" + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globule": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", + "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", + "dev": true, + "dependencies": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glsl-inject-defines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", + "integrity": "sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q=", + "dependencies": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "node_modules/glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha1-iUvvc5ENeSyBtRQxgANdCnivdtM=", + "dependencies": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + } + }, + "node_modules/glsl-resolve/node_modules/resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha1-3ZV5gufnNt699TtYpN2RdUV13UY=" + }, + "node_modules/glsl-resolve/node_modules/xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/glsl-token-assignments": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8=" + }, + "node_modules/glsl-token-defines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha1-y4kqqVmTYjFyhHDU90AySJaX+p0=", + "dependencies": { + "glsl-tokenizer": "^2.0.0" + } + }, + "node_modules/glsl-token-depth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha1-I8XjDuK9JViEtKKLyFC495HpXYQ=" + }, + "node_modules/glsl-token-descope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY=", + "dependencies": { + "glsl-token-assignments": "^2.0.0", + "glsl-token-depth": "^1.1.0", + "glsl-token-properties": "^1.0.0", + "glsl-token-scope": "^1.1.0" + } + }, + "node_modules/glsl-token-inject-block": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", + "integrity": "sha1-4QFfWYDBCRgkraomJfHf3ovQADQ=" + }, + "node_modules/glsl-token-properties": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4=" + }, + "node_modules/glsl-token-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", + "integrity": "sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E=" + }, + "node_modules/glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha1-WUQdL4V958NEnJRWZgIezjWOSOw=" + }, + "node_modules/glsl-token-whitespace-trim": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", + "integrity": "sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA=" + }, + "node_modules/glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "dependencies": { + "through2": "^0.6.3" + } + }, + "node_modules/glsl-tokenizer/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/glsl-tokenizer/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/glsl-tokenizer/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/glslify": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", + "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", + "dependencies": { + "bl": "^2.2.1", + "concat-stream": "^1.5.2", + "duplexify": "^3.4.5", + "falafel": "^2.1.0", + "from2": "^2.3.0", + "glsl-resolve": "0.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glslify-bundle": "^5.0.0", + "glslify-deps": "^1.2.5", + "minimist": "^1.2.5", + "resolve": "^1.1.5", + "stack-trace": "0.0.9", + "static-eval": "^2.0.5", + "through2": "^2.0.1", + "xtend": "^4.0.0" + }, + "bin": { + "glslify": "bin.js" + } + }, + "node_modules/glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "dependencies": { + "glsl-inject-defines": "^1.0.1", + "glsl-token-defines": "^1.0.0", + "glsl-token-depth": "^1.1.1", + "glsl-token-descope": "^1.0.2", + "glsl-token-scope": "^1.1.1", + "glsl-token-string": "^1.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glsl-tokenizer": "^2.0.2", + "murmurhash-js": "^1.0.0", + "shallow-copy": "0.0.1" + } + }, + "node_modules/glslify-deps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "dependencies": { + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "^2.0.0", + "graceful-fs": "^4.1.2", + "inherits": "^2.0.1", + "map-limit": "0.0.1", + "resolve": "^1.0.0" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/got/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==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "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=", + "optional": true + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/gzipper": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gzipper/-/gzipper-5.0.1.tgz", + "integrity": "sha512-dGrx0KGY3pycpw1ecbQN35zA0SfJERJjwO2rN8F3zgtbNXdlgB1DlbUl4BnmyRrIjioN2g1o91lIDpMzXb95JQ==", + "dev": true, + "dependencies": { + "commander": "^7.2.0", + "deep-equal": "^2.0.5", + "uuid": "^8.3.2" + }, + "bin": { + "gzipper": "bin/index.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gzipper/node_modules/deep-equal": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", + "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "es-get-iterator": "^1.1.1", + "get-intrinsic": "^1.0.1", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.1.1", + "isarray": "^2.0.5", + "object-is": "^1.1.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.3", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gzipper/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": 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==" + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "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==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", + "integrity": "sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g==", + "dependencies": { + "is-glob": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-glob/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-hover": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", + "integrity": "sha1-PZdDeusZnGK4rAisvcU9O8UsF/c=", + "dependencies": { + "is-browser": "^2.0.1" + } + }, + "node_modules/has-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-passive-events": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", + "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", + "dependencies": { + "is-browser": "^2.0.1" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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=" + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "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=", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/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=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/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/hash-base/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==", + "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/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-to-hyperscript/node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz", + "integrity": "sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hast-util-parse-selector": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz", + "integrity": "sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hastscript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.0.2.tgz", + "integrity": "sha512-uA8ooUY4ipaBvKcMuPehTAB/YfFLSSzCwFSwT6ltJbocFUKH/GDHLN+tflq7lSRf9H86uOuxOFkh1KgIy3Gg2g==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-from-parse5/node_modules/space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-is-element": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.1.tgz", + "integrity": "sha512-ag0fiZfRWsPiR1udvnSbaazJLGv8qd8E+/e3rW8rUZhbKG4HNJmFL4QkEceN+22BgE+uozXY30z/s+2dL6Z++g==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "node_modules/hast-util-raw/node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-raw/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/hast-util-raw/node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.3.tgz", + "integrity": "sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A==", + "dependencies": { + "@types/hast": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.2", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html/node_modules/property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html/node_modules/space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html/node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz", + "integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", + "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "node_modules/highcharts": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-9.3.2.tgz", + "integrity": "sha512-I/48gNMvs3hZxZnPRUqLbnlrGZJJ7YPPVr1+fYeZ35p4pSZAOwTmAGbptrjBr7JlF52HmJH9zMbt/I4TPLu9Pg==" + }, + "node_modules/highcharts-react-official": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/highcharts-react-official/-/highcharts-react-official-3.1.0.tgz", + "integrity": "sha512-CkWJHrVMOc6CT8KFu1dR+a0w5OxCVKKgZUNWtEi5TmR0xqBDIDe+RyM652MAN/jBYppxMo6TCUVlRObCyWAn0Q==", + "peerDependencies": { + "highcharts": ">=6.0.0", + "react": ">=16.8.0" + } + }, + "node_modules/history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "dependencies": { + "@babel/runtime": "^7.7.6" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/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/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "engines": { + "node": ">= 6.0.0" + } + }, + "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==" + }, + "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=", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "node_modules/hsluv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", + "integrity": "sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw=" + }, + "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==", + "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==" + }, + "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==" + }, + "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==", + "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/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "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==", + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "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-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "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==", + "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=" + }, + "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==" + }, + "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==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "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-proxy-middleware/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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/http-proxy-middleware/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=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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/http-proxy-middleware/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=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/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=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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/http-proxy-middleware/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.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/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-duration": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.27.0.tgz", + "integrity": "sha512-qLo/08cNc3Tb0uD7jK0jAcU5cnqCM0n568918E7R2XhMr/+7F37p4EY062W/stg7tmzvknNn9b/1+UhVRzsYrQ==" + }, + "node_modules/husky": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", + "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "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": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-palette": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/image-palette/-/image-palette-2.1.0.tgz", + "integrity": "sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ==", + "dependencies": { + "color-id": "^1.1.0", + "pxls": "^2.0.0", + "quantize": "^1.0.2" + } + }, + "node_modules/immer": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz", + "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "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==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/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==", + "dependencies": { + "find-up": "^4.0.0" + }, + "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=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.1.tgz", + "integrity": "sha512-Ujwccrj9FkGqjbY3iVoxD1VV+KdZZeENx0rphrtzmRXbFvkFO88L80BL/zeSIguX/7T+y8k04xqtgWgS5vxwxw==", + "engines": { + "node": ">=12" + } + }, + "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==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "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=", + "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==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "engines": { + "node": ">=0.10.0" + } + }, + "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=", + "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=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/is-base64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-base64/-/is-base64-0.1.0.tgz", + "integrity": "sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg==" + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-blob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz", + "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", + "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" + }, + "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==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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=", + "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=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "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", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-dom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.1.0.tgz", + "integrity": "sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ==", + "dev": true, + "dependencies": { + "is-object": "^1.0.1", + "is-window": "^1.0.2" + } + }, + "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=", + "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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-firefox": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", + "integrity": "sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-float-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-float-array/-/is-float-array-1.0.0.tgz", + "integrity": "sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ==" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "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==", + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-iexplorer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", + "integrity": "sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, + "node_modules/is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dependencies": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-installed-globally/node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-mobile": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.2.tgz", + "integrity": "sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg==" + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-scoped": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-2.1.0.tgz", + "integrity": "sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==", + "dependencies": { + "scoped-regex": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string-blank": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", + "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==" + }, + "node_modules/is-svg-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz", + "integrity": "sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA=" + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url-superb": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-3.0.0.tgz", + "integrity": "sha512-3faQP+wHCGDQT1qReM5zCPx2mxoal6DzbzquFlCYJLWyy4WPTved33ea2xFbX37z4NoriEwZGIYhFtx8RUB5wQ==", + "dependencies": { + "url-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "optional": true + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-window": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-window/-/is-window-1.0.2.tgz", + "integrity": "sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "dependencies": { + "node-fetch": "^2.6.1", + "unfetch": "^4.2.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.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "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==", + "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-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "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/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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "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.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dependencies": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jest": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "dependencies": { + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-canvas-mock": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.3.1.tgz", + "integrity": "sha512-5FnSZPrX3Q2ZfsbYNE3wqKR3+XorN8qFzDzB5o0golWgt6EOX1+emBnpOc9IAQ+NXFj8Nzm3h7ZdE/9H0ylBcg==", + "dev": true, + "dependencies": { + "cssfontparser": "^1.2.1", + "moo-color": "^1.0.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==", + "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/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "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" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "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==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/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==", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/jest-circus": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", + "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "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" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-config/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==", + "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-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==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "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==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-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==", + "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==", + "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-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==", + "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==", + "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-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-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==", + "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==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-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==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "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==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "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==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", + "dependencies": { + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "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==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-runner/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==", + "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-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-runtime/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest-runtime/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==", + "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-runtime/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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-snapshot/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==", + "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-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-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==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-watch-typeahead": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", + "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^26.0.0", + "jest-watcher": "^26.3.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "jest": "^26.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "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/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "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==", + "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/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==", + "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==", + "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==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "engines": { + "node": ">= 0.8" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "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.6.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", + "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "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.5.0", + "ws": "^7.4.5", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz", + "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "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/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "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==" + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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/jss": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.7.1.tgz", + "integrity": "sha512-5QN8JSVZR6cxpZNeGfzIjqPEP+ZJwJJfZbXmeABNdxiExyO+eJJDy6WDtqTf8SDKnbL5kZllEpAP71E/Lt7PXg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/jss" + } + }, + "node_modules/jss-plugin-camel-case": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.7.1.tgz", + "integrity": "sha512-+ioIyWvmAfgDCWXsQcW1NMnLBvRinOVFkSYJUgewQ6TynOcSj5F1bSU23B7z0p1iqK0PPHIU62xY1iNJD33WGA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.7.1" + } + }, + "node_modules/jss-plugin-default-unit": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.7.1.tgz", + "integrity": "sha512-tW+dfYVNARBQb/ONzBwd8uyImigyzMiAEDai+AbH5rcHg5h3TtqhAkxx06iuZiT/dZUiFdSKlbe3q9jZGAPIwA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "node_modules/jss-plugin-global": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.7.1.tgz", + "integrity": "sha512-FbxCnu44IkK/bw8X3CwZKmcAnJqjAb9LujlAc/aP0bMSdVa3/MugKQRyeQSu00uGL44feJJDoeXXiHOakBr/Zw==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "node_modules/jss-plugin-nested": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.7.1.tgz", + "integrity": "sha512-RNbICk7FlYKaJyv9tkMl7s6FFfeLA3ubNIFKvPqaWtADK0KUaPsPXVYBkAu4x1ItgsWx67xvReMrkcKA0jSXfA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-props-sort": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.7.1.tgz", + "integrity": "sha512-eyd5FhA+J0QrpqXxO7YNF/HMSXXl4pB0EmUdY4vSJI4QG22F59vQ6AHtP6fSwhmBdQ98Qd9gjfO+RMxcE39P1A==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "node_modules/jss-plugin-rule-value-function": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.7.1.tgz", + "integrity": "sha512-fGAAImlbaHD3fXAHI3ooX6aRESOl5iBt3LjpVjxs9II5u9tzam7pqFUmgTcrip9VpRqYHn8J3gA7kCtm8xKwHg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-template": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-template/-/jss-plugin-template-10.7.1.tgz", + "integrity": "sha512-FHQdbo5Yf13XOm9k7A+iJyUisY5yj6LGuLHOt3VR3yWRt6x/AzJ3q/znRKSNqZBaDFpNdxjIFZNAFFaVDd2cjQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-vendor-prefixer": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.7.1.tgz", + "integrity": "sha512-1UHFmBn7hZNsHXTkLLOL8abRl8vi+D1EVzWD4WmLFj55vawHZfnH1oEz6TUf5Y61XHv0smdHabdXds6BgOXe3A==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.7.1" + } + }, + "node_modules/jss/node_modules/csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + }, + "node_modules/jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "dependencies": { + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "engines": { + "node": ">=8" + } + }, + "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/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "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==", + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dependencies": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "node_modules/latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dependencies": { + "package-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lazy-universal-dotenv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz", + "integrity": "sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==", + "dependencies": { + "@babel/runtime": "^7.5.0", + "app-root-dir": "^1.0.2", + "core-js": "^3.0.4", + "dotenv": "^8.0.0", + "dotenv-expand": "^5.1.0" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=6.0.0", + "yarn": ">=1.0.0" + } + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libnpx": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/libnpx/-/libnpx-10.2.4.tgz", + "integrity": "sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA==", + "dependencies": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^14.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + }, + "node_modules/libnpx/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/libnpx/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/libnpx/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/libnpx/node_modules/dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==", + "engines": { + "node": ">=4.6.0" + } + }, + "node_modules/libnpx/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==" + }, + "node_modules/libnpx/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==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/libnpx/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/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==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/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==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/libnpx/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==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/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==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/node_modules/update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dependencies": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/libnpx/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/libnpx/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==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/libnpx/node_modules/yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dependencies": { + "cliui": "^5.0.0", + "decamelize": "^1.2.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": "^15.0.1" + } + }, + "node_modules/libnpx/node_modules/yargs-parser": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", + "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.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=" + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/lint-staged": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", + "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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/listify": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/listify/-/listify-1.0.3.tgz", + "integrity": "sha512-083swF7iH7bx8666zdzBColpgEuy46HjN3r1isD4zV6Ix7FuHfb/2/WVnl4CH8hjuoWeFF7P5KkKNXUnJCFEJg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "optional": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "optional": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.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==", + "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==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "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=" + }, + "node_modules/lodash.findindex": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", + "integrity": "sha512-9er6Ccz6sEST3bHFtUrCFWk14nE8cdL/RoW1RRDV1BxqN3qsmsT56L14jhfctAqhVPVcdJw4MRxEaVoAK+JVvw==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/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/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha1-akAhj9x64V/HbD0PPmdsRlOIYD4=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + } + }, + "node_modules/loglevel-colored-level-prefix/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/loglevel-colored-level-prefix/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/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/loglevel-colored-level-prefix/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", + "engines": { + "node": ">=0.10.0" + } + }, + "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/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "optional": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lower-case/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha1-63lhAxwPDo0AG/LVb6toXViCLzg=", + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/map-limit/node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==" + }, + "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=", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mapbox-gl": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.10.1.tgz", + "integrity": "sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg==", + "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.0.0", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.1" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-container": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-3.0.0.tgz", + "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==" + }, + "node_modules/markdown-it-emoji": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz", + "integrity": "sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ==" + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/marked": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", + "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/material-icons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-0.1.0.tgz", + "integrity": "sha512-xDTXrjrt03EiA+LL3nHttQs3DTGft/mV+JHSiVhQyl0Nk8SEwnNqB/fyu6REAz9mYoYCdr4vnhQzkTsGbx0BPg==" + }, + "node_modules/material-ui-audio-player": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/material-ui-audio-player/-/material-ui-audio-player-1.7.1.tgz", + "integrity": "sha512-5MGudB9K82Txm6cRoRaXS2AypPS3/kJvwPW5B+Gll8T6WIT6wPkX/NYpoOupasxuJKXXcSR+vNmCLh06QWdHbA==", + "dependencies": { + "classnames": "^2.2.6" + }, + "engines": { + "node": ">=v12.18.2", + "npm": "please-use-yarn", + "yarn": ">=v1.12.0" + }, + "peerDependencies": { + "@material-ui/core": ">=4.3.0", + "@material-ui/icons": ">=4.2.1", + "react": "*", + "react-dom": "*" + } + }, + "node_modules/math-log2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", + "integrity": "sha1-+4lBvl9evol55xjmJzsXjlhpRWU=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "dependencies": { + "unist-util-remove": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", + "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "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=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", + "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "node_modules/memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, + "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=", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/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/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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=" + }, + "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==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/middleearth-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/middleearth-names/-/middleearth-names-1.1.0.tgz", + "integrity": "sha1-wdXuSN77NoEo+66/686IR80Y3f8=", + "dependencies": { + "unique-random-array": "1.0.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dependencies": { + "mime-db": "1.48.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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", + "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/mini-css-extract-plugin/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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mini-css-extract-plugin/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==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "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==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/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/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/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/monaco-editor": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", + "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==" + }, + "node_modules/moo-color": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.2.tgz", + "integrity": "sha512-5iXz5n9LWQzx/C2WesGFfpE6RLamzdHwsn3KpfzShwbfIqs7stnoEpaNErf/7+3mbxwZ4s8Foq7I0tPxw7BWHg==", + "dev": true, + "dependencies": { + "color-name": "^1.1.4" + } + }, + "node_modules/mouse-change": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", + "integrity": "sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8=", + "dependencies": { + "mouse-event": "^1.0.0" + } + }, + "node_modules/mouse-event": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", + "integrity": "sha1-s3ie23EJmX1aky0dAdqhVDpQFzI=" + }, + "node_modules/mouse-event-offset": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", + "integrity": "sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ=" + }, + "node_modules/mouse-wheel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", + "integrity": "sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w=", + "dependencies": { + "right-now": "^1.0.0", + "signum": "^1.0.0", + "to-px": "^1.0.1" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/mrm": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/mrm/-/mrm-3.0.10.tgz", + "integrity": "sha512-aRByZsPXMM8W0NHNH9afkKyk5OW4bB5pYNRIN+8iSVfpMAzqeMejmj/yIYcdFNJTksXmdPMfTaucm2NYdh4xIw==", + "dependencies": { + "git-username": "^1.0.0", + "glob": "^7.1.6", + "inquirer": "^7.0.4", + "is-directory": "^0.3.1", + "kleur": "^3.0.3", + "libnpx": "^10.2.4", + "listify": "^1.0.0", + "lodash": "^4.17.15", + "longest": "^2.0.1", + "middleearth-names": "^1.1.0", + "minimist": "^1.2.0", + "mrm-core": "^6.1.7", + "semver-utils": "^1.1.4", + "update-notifier": "^4.1.0", + "user-home": "^2.0.0", + "user-meta": "^1.0.0", + "which": "^2.0.2" + }, + "bin": { + "mrm": "bin/mrm.js" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/mrm-core": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/mrm-core/-/mrm-core-6.1.7.tgz", + "integrity": "sha512-jLGWrkupcgGIsLerrI/xmM/dFHbaoehRsuVbgYBrxYKXNMRBHN3Mgkd8cw+/ZCCoiZEXF8/SaZol0GCp6oBQ9g==", + "dependencies": { + "babel-code-frame": "^6.26.0", + "comment-json": "^2.2.0", + "detect-indent": "^6.0.0", + "editorconfig": "^0.15.3", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "kleur": "^3.0.3", + "listify": "^1.0.0", + "lodash": "^4.17.15", + "minimist": "^1.2.0", + "prop-ini": "^0.0.2", + "rc": "^1.2.8", + "readme-badger": "^0.3.0", + "semver": "^6.3.0", + "smpltmpl": "^1.0.2", + "split-lines": "^2.0.0", + "strip-bom": "^4.0.0", + "validate-npm-package-name": "^3.0.0", + "webpack-merge": "^4.2.2", + "yaml": "^2.0.0-1" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/mrm-core/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/mrm-core/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/mrm-core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/mrm-core/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/mrm-core/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/mrm-core/node_modules/yaml": { + "version": "2.0.0-9", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-9.tgz", + "integrity": "sha512-Bf2KowHjyVkIIiGMt7+fbhmlvKOaE8DWuD07bnL4+FQ9sPmEl/5IzGpBpoxPqOaHuyasBjJhyXDcISpJWfhCGw==", + "engines": { + "node": ">= 12" + } + }, + "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==" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "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=" + }, + "node_modules/mumath": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/mumath/-/mumath-3.3.4.tgz", + "integrity": "sha1-SNSg8P2MrU57Mglu6JsWGmPTC78=", + "deprecated": "Redundant dependency in your project.", + "dependencies": { + "almost-equal": "^1.1.0" + } + }, + "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/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "devOptional": true + }, + "node_modules/nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "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==", + "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/native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" + }, + "node_modules/native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", + "dependencies": { + "querystring": "^0.2.0" + } + }, + "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=" + }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "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==", + "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==" + }, + "node_modules/nested-error-stacks": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==" + }, + "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=" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "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==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/no-case/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.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==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.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=" + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "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-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" + }, + "node_modules/node-sass": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tgz", + "integrity": "sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "meow": "^9.0.0", + "nan": "^2.13.2", + "node-gyp": "^7.1.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "bin": { + "node-sass": "bin/node-sass" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/node-sass/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/node-sass/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/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/node-sass/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "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==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-svg-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", + "integrity": "sha1-RWNg5g7Odfvve11+FgSA5//Rb+U=" + }, + "node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-name": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/npm-name/-/npm-name-5.5.0.tgz", + "integrity": "sha512-l7/uyVfEi2e3ho+ovaJZC0xlbwzXNUz3RxkxpfcnLuoGKAuYoo9YoJ/uy18PsTD8IziugGHks4t/mGmBJEZ4Qg==", + "dependencies": { + "got": "^9.6.0", + "is-scoped": "^2.1.0", + "is-url-superb": "^3.0.0", + "lodash.zip": "^4.2.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.1.0", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dependencies": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "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==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "node_modules/number-is-integer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz", + "integrity": "sha1-5ZvKFy/+0nMY55x862y3LAlbIVI=", + "dependencies": { + "is-finite": "^1.0.1" + }, + "engines": { + "node": ">=0.10.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==" + }, + "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=", + "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=", + "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=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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=", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/objectorarray": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", + "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==" + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "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==", + "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=", + "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==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "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==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "dependencies": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/orderedmap": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.5.tgz", + "integrity": "sha512-/fzlCGKRmfayGoI9UUXvJfc2nMZlJHW30QqEvwPvlg8tsX7jyiUSomYie6mYqx7Z9bOMGoag0H/q1PS/0PjYkg==" + }, + "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==", + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/outline-icons": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/outline-icons/-/outline-icons-1.42.0.tgz", + "integrity": "sha512-px2wNGrzTDCU0pxUO2pKs5dgE3fdz3bQ3lpLA9CgzBpkcadpOQgRxxxyBQ12fyOXyKC0L4evAJeomoAtvMWISQ==", + "funding": { + "url": "https://github.com/sponsors/outline" + }, + "peerDependencies": { + "react": "^17.0.1", + "react-dom": "^17.0.1" + } + }, + "node_modules/p-all": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-all/-/p-all-2.1.0.tgz", + "integrity": "sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-all/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "engines": { + "node": ">=8" + }, + "funding": { + "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==", + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-filter/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "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==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "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", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dependencies": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dependencies": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json/node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/package-json/node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/package-json/node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/param-case/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parenthesis": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz", + "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==" + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-git-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz", + "integrity": "sha1-06mYQxcTL1c5hxK7pDjhKVkN34w=", + "dependencies": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "git-config-path": "^1.0.1", + "ini": "^1.3.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-git-config/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "bin": { + "parse-github-url": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", + "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", + "dependencies": { + "pick-by-alias": "^1.2.0" + } + }, + "node_modules/parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha1-en7A0esG+lMlx9PgCbhZoJtdSes=" + }, + "node_modules/parse-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", + "integrity": "sha1-fhu21b7zh0wo45JSaiVBFwKR7s8=" + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "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==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "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==", + "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=", + "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=" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "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==", + "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/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/pick-by-alias": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", + "integrity": "sha1-X3yysfIabh6ISgyHhVqko3NhEHs=" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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=", + "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=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "engines": { + "node": ">= 6" + } + }, + "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==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/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==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/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==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/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==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/plotly.js": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.8.0.tgz", + "integrity": "sha512-bYuLdTlQEWMs/u3nNqV/jwERj9tw8qMDKBV8NBP1BucfapLoYIM9w4ARc3W9m93r6OYvP5I6ykUztiDmDcvA9Q==", + "dependencies": { + "@plotly/d3": "3.8.0", + "@plotly/d3-sankey": "0.7.2", + "@plotly/d3-sankey-circular": "0.33.1", + "@turf/area": "^6.4.0", + "@turf/bbox": "^6.4.0", + "@turf/centroid": "^6.0.2", + "canvas-fit": "^1.5.0", + "color-alpha": "1.0.4", + "color-normalize": "1.5.0", + "color-parse": "1.3.8", + "color-rgba": "2.1.1", + "country-regex": "^1.1.0", + "d3-force": "^1.2.1", + "d3-format": "^1.4.5", + "d3-geo": "^1.12.1", + "d3-geo-projection": "^2.9.0", + "d3-hierarchy": "^1.1.9", + "d3-interpolate": "^1.4.0", + "d3-time": "^1.1.0", + "d3-time-format": "^2.2.3", + "fast-isnumeric": "^1.1.4", + "gl-mat4": "^1.2.0", + "gl-text": "^1.3.1", + "glslify": "^7.1.1", + "has-hover": "^1.0.1", + "has-passive-events": "^1.0.0", + "is-mobile": "^2.2.2", + "mapbox-gl": "1.10.1", + "mouse-change": "^1.4.0", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.2.0", + "native-promise-only": "^0.8.1", + "parse-svg-path": "^0.1.2", + "polybooljs": "^1.2.0", + "probe-image-size": "^7.2.2", + "regl": "^2.1.0", + "regl-error2d": "^2.0.12", + "regl-line2d": "^3.1.2", + "regl-scatter2d": "^3.2.8", + "regl-splom": "^1.0.14", + "strongly-connected-components": "^1.0.1", + "superscript-text": "^1.0.0", + "svg-path-sdf": "^1.1.3", + "tinycolor2": "^1.4.2", + "to-px": "1.0.1", + "topojson-client": "^3.1.0", + "webgl-context": "^2.2.0", + "world-calendars": "^1.0.3" + } + }, + "node_modules/plotly.js/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/plotly.js/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/plotly.js/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/plotly.js/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/plotly.js/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/plotly.js/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/plotly.js/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/plotly.js/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/plotly.js/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/plotly.js/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/plotly.js/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/plotly.js/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/pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/polished": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", + "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/polybooljs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.0.tgz", + "integrity": "sha1-tDkMLgedTCYtOyUExiiNlbp6R1g=" + }, + "node_modules/popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, + "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==", + "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==", + "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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", + "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", + "dependencies": { + "postcss": "^7" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "browserslist": "^4" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dependencies": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dependencies": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-selectors/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "dependencies": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", + "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", + "dependencies": { + "postcss": "^7.0.26" + } + }, + "node_modules/postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-load-config/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/postcss-loader/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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-loader/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==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dependencies": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-normalize": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", + "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", + "dependencies": { + "@csstools/normalize.css": "^10.1.0", + "browserslist": "^4.6.2", + "postcss": "^7.0.17", + "postcss-browser-comments": "^3.0.0", + "sanitize.css": "^10.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dependencies": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-safe-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", + "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", + "dependencies": { + "postcss": "^8.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-safe-parser/node_modules/postcss": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dependencies": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "dependencies": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "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==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==" + }, + "node_modules/postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dependencies": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=6.14.4" + } + }, + "node_modules/postcss/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss/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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/postcss/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-eslint": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-12.0.0.tgz", + "integrity": "sha512-N8SGGQwAosISXTNl1E57sBbtnqUGlyRWjcfIUxyD3HF4ynehA9GZ8IfJgiep/OfYvCof/JEpy9ZqSl250Wia7A==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^3.0.0", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^7.9.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^2.0.0", + "pretty-format": "^23.0.1", + "require-relative": "^0.8.7", + "typescript": "^3.9.3", + "vue-eslint-parser": "~7.1.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", + "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", + "dev": true, + "dependencies": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "3.10.1", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/prettier-eslint/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/prettier-eslint/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/prettier-eslint/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/prettier-eslint/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/prettier-eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/prettier-eslint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier-eslint/node_modules/pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "node_modules/prettier-eslint/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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==", + "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-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, + "node_modules/probe-image-size": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.2.tgz", + "integrity": "sha512-QUm+w1S9WTsT5GZB830u0BHExrUmF0J4fyRm5kbLUMEP3fl9UVYXc3xOBVqZNnH9tnvVEJO8vDk3PMtsLqjxug==", + "dependencies": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "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==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/progress-bar-webpack-plugin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-2.1.0.tgz", + "integrity": "sha512-UtlZbnxpYk1wufEWfhIjRn2U52zlY38uvnzFhs8rRxJxC1hSqw88JNR2Mbpqq9Kix8L1nGb3uQ+/1BiUWbigAg==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "progress": "^2.0.3" + }, + "peerDependencies": { + "webpack": "^1.3.0 || ^2 || ^3 || ^4 || ^5" + } + }, + "node_modules/promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "node_modules/promise.allsettled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", + "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", + "dependencies": { + "array.prototype.map": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "iterate-value": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/promise.prototype.finally": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.4.tgz", + "integrity": "sha512-nNc3YbgMfLzqtqvO/q5DP6RR0SiHI9pUPGzyDf1q+usTwCN2kjvAnJkBb7bHe3o+fFSBPpsGMoYtaSi+LTNqng==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-ini": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/prop-ini/-/prop-ini-0.0.2.tgz", + "integrity": "sha1-ZzOny1JCrKsr5C5gdYPYEksXKls=", + "dependencies": { + "extend": "^3.0.0" + } + }, + "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/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/property-expr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz", + "integrity": "sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==" + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.2.2.tgz", + "integrity": "sha512-TX+KpWudMon06frryfpO/u7hsQv2hu8L4VSVbCpi3/7wXHBgl+35mV85qfa3RpT8xD2f3MdeoTqH0vy5JdbXPg==", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.4.0.tgz", + "integrity": "sha512-6+YwTjmqDwlA/Dm+5wK67ezgqgjA/MhSDgaNxKUzH97SmeuWFXyLeDRxxOPZeSo7yTxcDGUCWTEjmQZsVBuMrQ==", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.2.2.tgz", + "integrity": "sha512-7YzuRBbu9W7HGQde84kCHfIjaRLNcAdeijbgqrm/R9dsdTWkV+rrdcmic/sCc+bptiNpvjCEE+R6hrbT8zFQeQ==", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.2.0.tgz", + "integrity": "sha512-B9v9xtf4fYbKxQwIr+3wtTDNLDZcmMMmGiI3TAPShnUzvo+Rmv1GiUrsQChY1meetHl7rhML2cppF3FTs7f7UQ==", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.1.3.tgz", + "integrity": "sha512-ZaHCLyBtvbyIHv0f5p6boQTIJjlD6o2NPZiEaZWT2DA+j591zS29QQEMT4lBqwcLW3qRSf7ZvoKNbf05YrsStw==", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.1.5.tgz", + "integrity": "sha512-8SZgPH3K+GLsHL2wKuwBD9rxhsbnVBTwpHCO4VUO5GmqUQlxd/2GtBVWTsyLq4Dp3N9nGgPd3+lZFKUDuVp+Vw==", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.8.0.tgz", + "integrity": "sha512-RxGyM8dqdmlkYpM3PY/C5JBputv2xeKLNRqFpN04TtFlR9McN9Tmpf8DaP6HblfaZ8RofdUtQW+ghdArjANLvQ==", + "dependencies": { + "markdown-it": "^12.0.0", + "prosemirror-model": "^1.0.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.16.1.tgz", + "integrity": "sha512-r1/w0HDU40TtkXp0DyKBnFPYwd8FSlUSJmGCGFv4DeynfeSlyQF2FD0RQbVEMOe6P3PpUSXM6LZBV7W/YNZ4mA==", + "dependencies": { + "orderedmap": "^1.1.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.1.6.tgz", + "integrity": "sha512-aFGEdaCWmJzouZ8DwedmvSsL50JpRkqhQ6tcpThwJONVVmCgI36LJHtoQ4VGZbusMavaBhXXr33zyD2IVsTlkw==", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-state": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.4.tgz", + "integrity": "sha512-Xkkrpd1y/TQ6HKzN3agsQIGRcLckUMA9u3j207L04mt8ToRgpGeyhbVv0HI7omDORIBHjR29b7AwlATFFf2GLA==", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.1.1.tgz", + "integrity": "sha512-LmCz4jrlqQZRsYRDzCRYf/pQ5CUcSOyqZlAj5kv67ZWBH1SVLP2U9WJEvQfimWgeRlIz0y0PQVqO1arRm1+woA==", + "dependencies": { + "prosemirror-keymap": "^1.1.2", + "prosemirror-model": "^1.8.1", + "prosemirror-state": "^1.3.1", + "prosemirror-transform": "^1.2.1", + "prosemirror-view": "^1.13.3" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.4.2.tgz", + "integrity": "sha512-bcIsf3uRZhfab0xRfyyxOEh6eqSszq/hJbDbmUumFnbHBoWhB/uXbpz6vvUxfk0XiEvrZDJ+5pXRrNDc1Hu3vQ==", + "dependencies": { + "prosemirror-model": "^1.0.0" + } + }, + "node_modules/prosemirror-utils": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/prosemirror-utils/-/prosemirror-utils-0.9.6.tgz", + "integrity": "sha512-UC+j9hQQ1POYfMc5p7UFxBTptRiGPR7Kkmbl3jVvU8VgQbkI89tR/GK+3QYC8n+VvBZrtAoCrJItNhWSxX3slA==", + "peerDependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.1", + "prosemirror-tables": "^0.9.1" + } + }, + "node_modules/prosemirror-view": { + "version": "1.23.12", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.23.12.tgz", + "integrity": "sha512-uvw9ZVz5dNDD9w1bzHkU2r4NWFlpFz85v9rCD8NAhQBau6LYhwM/crjry+C4JgeR8gy6pMXS5eJ1zhNLcK4ctQ==", + "dependencies": { + "prosemirror-model": "^1.16.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "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=" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "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==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "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==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pxls": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/pxls/-/pxls-2.3.2.tgz", + "integrity": "sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw==", + "dependencies": { + "arr-flatten": "^1.1.0", + "compute-dims": "^1.1.0", + "flip-pixels": "^1.0.2", + "is-browser": "^2.1.0", + "is-buffer": "^2.0.3", + "to-uint8": "^1.4.1" + } + }, + "node_modules/pxls/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/quantize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz", + "integrity": "sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4=", + "engines": { + "node": ">=0.10.21" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "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==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, + "node_modules/ramda": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz", + "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "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==", + "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==", + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/raw-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "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/rc-align": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", + "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-cascader": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.7.0.tgz", + "integrity": "sha512-SFtGpwmYN7RaWEAGTS4Rkc62ZV/qmQGg/tajr/7mfIkleuu8ro9Hlk6J+aA0x1YS4zlaZBtTcSaXM01QMiEV/A==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.6.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz", + "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.4.2.tgz", + "integrity": "sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.2.1", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.2.tgz", + "integrity": "sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.1.4.tgz", + "integrity": "sha512-tuRk2Hzecczt4zSH09ZQkAPzvi28HxvTgsTJtqUHgPPezhE+UBypyNls1hLVehD8fpFbsA12flophT2rKT/W8Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-6", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.21.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", + "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-trigger": "^5.3.1", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "1.27.4", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.27.4.tgz", + "integrity": "sha512-PQColQnZimGKArnOh8V2907+VzDCXcqtFvHgevDLtqWc/P7YASb/FqntSmdS8q3VND5SHX3Y1vgMIzY22/f/0Q==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.8.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.13.0.tgz", + "integrity": "sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.0.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.0.6" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.1.4.tgz", + "integrity": "sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "7.3.11", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.3.11.tgz", + "integrity": "sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.23.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.13.1.tgz", + "integrity": "sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-menu": "~9.8.0", + "rc-textarea": "^0.4.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.22.5" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.8.2", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.2.tgz", + "integrity": "sha512-EahOJVjLuEnJsThoPN+mGnVm431RzVzDLZWHRS/YnXTQULa7OsgdJa/Y7qXxc3Z5sz8mgT6xYtgpmBXLxrZFaQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.8", + "rc-trigger": "^5.1.2", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.3.tgz", + "integrity": "sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.6.1.tgz", + "integrity": "sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.2.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.8.tgz", + "integrity": "sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.19.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz", + "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.7.0.tgz", + "integrity": "sha512-oZH6FZ3j4iuBxHB4NvQ6ABRsS2If/Kpty1YFFsji7/aej6ruGmfM7WnJWQ88AoPfpJ++ya5z+nVEA8yCRYGKyw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "date-fns": "2.x", + "dayjs": "1.x", + "moment": "^2.24.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.4.0", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-progress": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.1.tgz", + "integrity": "sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.2.tgz", + "integrity": "sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz", + "integrity": "sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.27.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.1.2.tgz", + "integrity": "sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.1.16", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.1.16.tgz", + "integrity": "sha512-71XLHleuZmufpdV2vis5oituRkhg2WNvLpVMJBGWRar6WGAVOHXaY9DR5HvwWry3EGTn19BqnL6Xbybje6f8YA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.2.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.0.1.tgz", + "integrity": "sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.18.1", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-5.0.0.tgz", + "integrity": "sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz", + "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.0.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.26.0.tgz", + "integrity": "sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.22.5", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "12.5.10", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.5.10.tgz", + "integrity": "sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.0.0", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.16.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.4.7.tgz", + "integrity": "sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.24.4", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.2.2.tgz", + "integrity": "sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.3.1", + "rc-trigger": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.3.tgz", + "integrity": "sha512-Oql2S9+ZmT+mfTp5SNo1XM0QvkENjc0mPRFsHWRFSPuKird0OYMZZKmLznUJ+0aGDeFFWN42wiUZJtMFhrLgLw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.4.8" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.5.5.tgz", + "integrity": "sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-trigger": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz", + "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.19.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-upload": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz", + "integrity": "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.29.2.tgz", + "integrity": "sha512-xHT9Dr3RD6tyvCibnH10l3mudC6TJjWNr9UDy3CrOGZqTY354OfdwP87ahKNe0b3A1dsysDldvx0SBuswhlOeA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/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/rc-virtual-list": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.4.13.tgz", + "integrity": "sha512-cPOVDmcNM7rH6ANotanMDilW/55XnFPw0Jh/GQYtrzZSy3AmWvCnqVNyNC/pgg3lfVmX2994dlzAhuUrd4jG7w==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.15.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-accessible-dropdown-menu-hook": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-accessible-dropdown-menu-hook/-/react-accessible-dropdown-menu-hook-3.1.0.tgz", + "integrity": "sha512-XOvct2l9Q1V5u29gdGHZhBYh3hUX3+syIwWC/uqBmmzJDttFMZKPug+Ut/oAsXTCeGn3+HcT1iqzLAFRtVrrJg==" + }, + "node_modules/react-app-polyfill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", + "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", + "dependencies": { + "core-js": "^3.6.5", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "whatwg-fetch": "^3.4.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-app-rewired": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.1.8.tgz", + "integrity": "sha512-wjXPdKPLscA7mn0I1de1NHrbfWdXz4S1ladaGgHVKdn1hTgKK5N6EdGIJM0KrS6bKnJBj7WuqJroDTsPKKr66Q==", + "dev": true, + "dependencies": { + "semver": "^5.6.0" + }, + "bin": { + "react-app-rewired": "bin/index.js" + }, + "peerDependencies": { + "react-scripts": ">=2.1.3" + } + }, + "node_modules/react-app-rewired/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/react-beautiful-dnd": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz", + "integrity": "sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA==", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0", + "react-dom": "^16.8.5 || ^17.0.0" + } + }, + "node_modules/react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "dependencies": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-dev-utils/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==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/react-dev-utils/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "dependencies": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + }, + "node_modules/react-dev-utils/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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/chalk/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=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/react-dev-utils/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/react-dev-utils/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/react-dev-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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/react-dev-utils/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==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/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==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/pkg-up/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==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-docgen": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.3.tgz", + "integrity": "sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA==", + "dependencies": { + "@babel/core": "^7.7.5", + "@babel/generator": "^7.12.11", + "@babel/runtime": "^7.7.6", + "ast-types": "^0.14.2", + "commander": "^2.19.0", + "doctrine": "^3.0.0", + "estree-to-babel": "^3.1.0", + "neo-async": "^2.6.1", + "node-dir": "^0.1.10", + "strip-indent": "^3.0.0" + }, + "bin": { + "react-docgen": "bin/react-docgen.js" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/react-docgen-typescript": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", + "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", + "peerDependencies": { + "typescript": ">= 4.3.x" + } + }, + "node_modules/react-docgen-typescript-plugin": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2.tgz", + "integrity": "sha512-/8OKrPRDTAGDnOkumGvDWixfrNPrRWhEMGLZnJr1NiJtRwdvNRGqGA2J/SeSvWerawqSPxNyXK+EfERCir6mMw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "endent": "^2.0.1", + "find-cache-dir": "^3.3.1", + "flat-cache": "^3.0.4", + "micromatch": "^4.0.2", + "react-docgen-typescript": "^2.2.2", + "tslib": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "peerDependencies": { + "typescript": ">= 4.x", + "webpack": ">= 4" + } + }, + "node_modules/react-docgen-typescript-plugin/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/react-docgen-typescript-plugin/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-docgen-typescript-plugin/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/react-docgen-typescript-plugin/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/react-docgen-typescript-plugin/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/react-docgen-typescript-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/react-docgen/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/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-element-to-jsx-string": { + "version": "14.3.4", + "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.4.tgz", + "integrity": "sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg==", + "dependencies": { + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "17.0.2" + }, + "peerDependencies": { + "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1", + "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1" + } + }, + "node_modules/react-element-to-jsx-string/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-error-boundary": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", + "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + }, + "node_modules/react-fast-compare": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", + "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" + }, + "node_modules/react-inspector": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-5.1.1.tgz", + "integrity": "sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.0.0", + "is-dom": "^1.0.0", + "prop-types": "^15.0.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0" + } + }, + "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==" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-medium-image-zoom": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/react-medium-image-zoom/-/react-medium-image-zoom-3.1.3.tgz", + "integrity": "sha512-5CoU8whSCz5Xz2xNeGD34dDfZ6jaf/pybdfZh8HNUmA9mbXbLfj0n6bQWfEUwkq9lsNg1sEkyeIJq2tcvZY8bw==", + "peerDependencies": { + "prop-types": "^15.5.8", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/react-merge-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-1.1.0.tgz", + "integrity": "sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/react-plotly.js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.5.1.tgz", + "integrity": "sha512-Oya14whSHvPsYXdI0nHOGs1pZhMzV2edV7HAW1xFHD58Y73m/LbG2Encvyz1tztL0vfjph0JNhiwO8cGBJnlhg==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "plotly.js": ">1.34.0", + "react": ">0.13.0" + } + }, + "node_modules/react-portal": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-4.2.2.tgz", + "integrity": "sha512-vS18idTmevQxyQpnde0Td6ZcUlv+pD8GTyR42n3CHUQq9OHi1C4jDE4ZWEbEsrbrLRhSECYiao58cvocwMtP7Q==", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0", + "react-dom": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/react-redux": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", + "integrity": "sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/react-redux": "^7.1.16", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^16.13.1" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-redux/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-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/react-remove-scroll/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/react-router": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-dom/node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/react-router/node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/react-router/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-scripts": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", + "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", + "dependencies": { + "@babel/core": "7.12.3", + "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", + "@svgr/webpack": "5.5.0", + "@typescript-eslint/eslint-plugin": "^4.5.0", + "@typescript-eslint/parser": "^4.5.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^26.6.0", + "babel-loader": "8.1.0", + "babel-plugin-named-asset-import": "^0.3.7", + "babel-preset-react-app": "^10.0.0", + "bfj": "^7.0.2", + "camelcase": "^6.1.0", + "case-sensitive-paths-webpack-plugin": "2.3.0", + "css-loader": "4.3.0", + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0", + "eslint": "^7.11.0", + "eslint-config-react-app": "^6.0.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jest": "^24.1.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-testing-library": "^3.9.2", + "eslint-webpack-plugin": "^2.5.2", + "file-loader": "6.1.1", + "fs-extra": "^9.0.1", + "html-webpack-plugin": "4.5.0", + "identity-obj-proxy": "3.0.0", + "jest": "26.6.0", + "jest-circus": "26.6.0", + "jest-resolve": "26.6.0", + "jest-watch-typeahead": "0.6.1", + "mini-css-extract-plugin": "0.11.3", + "optimize-css-assets-webpack-plugin": "5.0.4", + "pnp-webpack-plugin": "1.6.4", + "postcss-flexbugs-fixes": "4.2.1", + "postcss-loader": "3.0.0", + "postcss-normalize": "8.0.1", + "postcss-preset-env": "6.7.0", + "postcss-safe-parser": "5.0.2", + "prompts": "2.4.0", + "react-app-polyfill": "^2.0.0", + "react-dev-utils": "^11.0.3", + "react-refresh": "^0.8.3", + "resolve": "1.18.1", + "resolve-url-loader": "^3.1.2", + "sass-loader": "^10.0.5", + "semver": "7.3.2", + "style-loader": "1.3.0", + "terser-webpack-plugin": "4.2.3", + "ts-pnp": "1.2.0", + "url-loader": "4.1.1", + "webpack": "4.44.2", + "webpack-dev-server": "3.11.1", + "webpack-manifest-plugin": "2.2.0", + "workbox-webpack-plugin": "5.1.4" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.1.3" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/sass-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", + "dependencies": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", + "sass": "^1.3.0", + "webpack": "^4.36.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/react-select": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.1.tgz", + "integrity": "sha512-u/brzm3B6vgI+PtxNyE4/18kXgaf6bn5sOAjKhaQ54EItBfW41SRLH1AJC5fefPnGM4JmMcM51t/HAVCi5GrpQ==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-select/node_modules/@floating-ui/core": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.4.tgz", + "integrity": "sha512-SQOeVbMwb1di+mVWWJLpsUTToKfqVNioXys011beCAhyOIFtS+GQoW4EQSneuxzmQKddExDwQ+X0hLl4lJJaSQ==" + }, + "node_modules/react-select/node_modules/@floating-ui/dom": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.5.tgz", + "integrity": "sha512-+sAUfpQ3Frz+VCbPCqj+cZzvEESy3fjSeT/pDWkYCWOBXYNNKZfuVsHuv8/JO2zze8+Eb/Q7a6hZVgzS81fLbQ==", + "dependencies": { + "@floating-ui/core": "^1.2.4" + } + }, + "node_modules/react-select/node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "node_modules/react-split": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/react-split/-/react-split-2.0.14.tgz", + "integrity": "sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA==", + "dependencies": { + "prop-types": "^15.5.7", + "split.js": "^1.6.0" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-virtualized": { + "version": "9.22.3", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz", + "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha", + "react-dom": "^15.3.0 || ^16.0.0-alpha" + } + }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.5.tgz", + "integrity": "sha512-kivjYVWX15TX2IUrm8F1jaCEX8EXrpy3DD+u41WGqJ1ZqbljWpiwscV+VxOM1l7sSIM1jwi2LADjhhAJkJ9dxA==", + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0" + } + }, + "node_modules/react-virtualized-tree": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/react-virtualized-tree/-/react-virtualized-tree-3.4.1.tgz", + "integrity": "sha512-MolDiG9XgmflPPX9uPzf7iSWLqOHDlCZEiyA4FVYjv2pHfu6zV6/SIEFVyHdurWD80IjUuZ3Er12gq2bQQak2Q==", + "dependencies": { + "classnames": "^2.2.5", + "lodash": "^4.17.4", + "lodash.debounce": "^4.0.8", + "lodash.findindex": "^4.6.0", + "lodash.isequal": "^4.5.0", + "lodash.omit": "^4.5.0", + "material-icons": "^0.1.0", + "react-lifecycles-compat": "^3.0.4", + "reselect": "^3.0.1" + }, + "peerDependencies": { + "react": "16.x", + "react-dom": "^16.2.0", + "react-virtualized": "^9.13.0" + } + }, + "node_modules/react-window": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", + "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.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==", + "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==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "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==", + "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==", + "engines": { + "node": ">=8" + } + }, + "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==", + "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/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readme-badger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/readme-badger/-/readme-badger-0.3.0.tgz", + "integrity": "sha512-+sMOLSs1imZUISZ2Rhz7qqVd77QtpcAPbGeIraFdgJmijb04YtdlPjGNBvDChTNtLbeQ6JNGQy3pOgslWfaP3g==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redux": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz", + "integrity": "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/refractor": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.5.0.tgz", + "integrity": "sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.25.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==" + }, + "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==", + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "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==", + "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==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + }, + "node_modules/regex-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regex-regex/-/regex-regex-1.0.0.tgz", + "integrity": "sha1-kEih6uuHD01IDavHb8Qs3MC8OnI=" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "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/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "node_modules/regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "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=", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/regl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/regl/-/regl-2.1.0.tgz", + "integrity": "sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==" + }, + "node_modules/regl-error2d": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz", + "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==", + "dependencies": { + "array-bounds": "^1.0.1", + "color-normalize": "^1.5.0", + "flatten-vertex-data": "^1.0.2", + "object-assign": "^4.1.1", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0", + "update-diff": "^1.1.0" + } + }, + "node_modules/regl-line2d": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.2.tgz", + "integrity": "sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ==", + "dependencies": { + "array-bounds": "^1.0.1", + "array-find-index": "^1.0.2", + "array-normalize": "^1.1.4", + "color-normalize": "^1.5.0", + "earcut": "^2.1.5", + "es6-weak-map": "^2.0.3", + "flatten-vertex-data": "^1.0.2", + "glslify": "^7.0.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0" + } + }, + "node_modules/regl-scatter2d": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.2.8.tgz", + "integrity": "sha512-bqrqJyeHkGBa9mEfuBnRd7FUtdtZ1l+gsM2C5Ugr1U3vJG5K3mdWdVWtOAllZ5FHHyWJV/vgjVvftgFUg6CDig==", + "dependencies": { + "@plotly/point-cluster": "^3.1.9", + "array-range": "^1.0.1", + "array-rearrange": "^2.2.2", + "clamp": "^1.0.1", + "color-id": "^1.1.0", + "color-normalize": "^1.5.0", + "color-rgba": "^2.1.1", + "flatten-vertex-data": "^1.0.2", + "glslify": "^7.0.0", + "image-palette": "^2.1.0", + "is-iexplorer": "^1.0.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0", + "update-diff": "^1.1.0" + } + }, + "node_modules/regl-splom": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz", + "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==", + "dependencies": { + "array-bounds": "^1.0.1", + "array-range": "^1.0.1", + "color-alpha": "^1.0.4", + "flatten-vertex-data": "^1.0.2", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "raf": "^3.4.1", + "regl-scatter2d": "^3.2.3" + } + }, + "node_modules/rehype": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.0.tgz", + "integrity": "sha512-gZcttmf9R5IYHb8AlI1rlmWqXS1yX0rSB/S5ZGJs8atfYZy2DobvH3Ic/gSzB+HL/+oOHPtBguw1TprfhxXBgQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "rehype-parse": "^8.0.0", + "rehype-stringify": "^9.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.3.tgz", + "integrity": "sha512-RGw0CVt+0S6KdvpE8bbP2Db9WXclQcIX7A0ufM3QFqAhTo/ddJMQrrI2j3cijlRPZlGK8R3pRgC8U5HyV76IDw==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^6.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.2.tgz", + "integrity": "sha512-BuVA6lAEYtOpXO2xuHLohAzz8UNoQAxAqYRqh4QEEtU39Co+P1JBZhw6wXA9hMWp+JLcmrxWH8+UKcNSr443Fw==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-external-links": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz", + "integrity": "sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "is-absolute-url": "^3.0.0", + "mdast-util-definitions": "^4.0.0", + "space-separated-tokens": "^1.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-external-links/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/remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/remark-mdx/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==" + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-mdx/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/remark-mdx/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/remark-mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/remark-mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remark-mdx/node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse/node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-parse/node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-slug": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", + "integrity": "sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==", + "dev": true, + "dependencies": { + "github-slugger": "^1.0.0", + "mdast-util-to-string": "^1.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "dependencies": { + "mdast-squeeze-paragraphs": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remote-origin-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-1.0.0.tgz", + "integrity": "sha512-xHDM6IBqivpiQ1e4WOuFpM/T6rbzA/WBsu+3WLtgPOhHyjA0nYlijV3NprlTb4FcXlQ5+Q+z174sQ1NnUF5FwA==", + "dependencies": { + "parse-git-config": "^1.1.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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=" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "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.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "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==", + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "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.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/renderkid/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=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "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=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "optional": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "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/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": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "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==" + }, + "node_modules/require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "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=" + }, + "node_modules/reselect": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", + "integrity": "sha512-b/6tFZCmRhtBMa4xGqiiRp9jh9Aqi2A687Lo265cN0/QohJQEBPiQ52f4QB6i0eF3yp3hmLL21LSGBcML2dlxA==" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "dependencies": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/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==", + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "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=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/resolve-url-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", + "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", + "dependencies": { + "adjust-sourcemap-loader": "3.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.36", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/resolve-url-loader/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve-url-loader/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==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/resolve-url-loader/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "dependencies": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + } + }, + "node_modules/rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, + "node_modules/rework/node_modules/convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + }, + "node_modules/rework/node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/rework/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==", + "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/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "node_modules/rich-markdown-editor": { + "version": "11.21.3", + "resolved": "https://registry.npmjs.org/rich-markdown-editor/-/rich-markdown-editor-11.21.3.tgz", + "integrity": "sha512-XqVDfwDiGMVVtb+HUY35FQvfo97ECAe+Pgo1veFiYiL5f9Jfp9zuF6fOK5eze9h8rApBsgD9iVHEsA8/gyv5Jg==", + "dependencies": { + "copy-to-clipboard": "^3.0.8", + "fuzzy-search": "^3.2.1", + "gemoji": "6.x", + "lodash": "^4.17.11", + "markdown-it": "^12.2.0", + "markdown-it-container": "^3.0.0", + "markdown-it-emoji": "^2.0.0", + "outline-icons": "^1.38.1", + "prosemirror-commands": "^1.1.6", + "prosemirror-dropcursor": "^1.3.3", + "prosemirror-gapcursor": "^1.1.5", + "prosemirror-history": "^1.1.3", + "prosemirror-inputrules": "^1.1.3", + "prosemirror-keymap": "^1.1.4", + "prosemirror-markdown": "^1.5.2", + "prosemirror-model": "^1.13.3", + "prosemirror-schema-list": "^1.1.2", + "prosemirror-state": "^1.3.4", + "prosemirror-tables": "^1.1.1", + "prosemirror-transform": "1.2.5", + "prosemirror-utils": "^0.9.6", + "prosemirror-view": "1.18.1", + "react-medium-image-zoom": "^3.1.3", + "react-portal": "^4.2.1", + "refractor": "^3.3.1", + "resize-observer-polyfill": "^1.5.1", + "slugify": "^1.4.0", + "smooth-scroll-into-view-if-needed": "^1.1.29" + }, + "funding": { + "url": "https://github.com/sponsors/outline" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0", + "react-dom": "^16.0.0 || ^17.0.0", + "styled-components": "^5.0.0" + } + }, + "node_modules/rich-markdown-editor/node_modules/prosemirror-transform": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.2.5.tgz", + "integrity": "sha512-eqeIaxWtUfOnpA1ERrXCuSIMzqIJtL9Qrs5uJMCjY5RMSaH5o4pc390SAjn/IDPeIlw6auh0hCCXs3wRvGnQug==", + "dependencies": { + "prosemirror-model": "^1.0.0" + } + }, + "node_modules/rich-markdown-editor/node_modules/prosemirror-view": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.18.1.tgz", + "integrity": "sha512-TZd8byDRfdopLiokBY7T27msCSfWqqRxWs/LnBbdI030F+iI2kS+tO59/XFnpZxMLFKlJgOgGGhM9SzD1Nwdxw==", + "dependencies": { + "prosemirror-model": "^1.1.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/right-now": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", + "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, + "node_modules/rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "dependencies": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + }, + "bin": { + "rollup": "dist/bin/rollup" + } + }, + "node_modules/rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel.", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" + }, + "peerDependencies": { + "@babel/core": "7 || ^7.0.0-rc.2", + "rollup": ">=0.60.0 <3" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", + "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "dependencies": { + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^4.0.0", + "terser": "^4.6.2" + }, + "peerDependencies": { + "rollup": ">=0.66.0 <3" + } + }, + "node_modules/rollup-plugin-terser/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dependencies": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/rollup-plugin-terser/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + }, + "node_modules/rope-sequence": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz", + "integrity": "sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg==" + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "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==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", + "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==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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/sane/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=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "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==", + "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==", + "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", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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/sane/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=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "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==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/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=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "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=", + "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", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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/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=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "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=", + "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=", + "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==", + "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=", + "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=", + "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", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "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==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/sanitize.css": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", + "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + }, + "node_modules/sass": { + "version": "1.38.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.38.1.tgz", + "integrity": "sha512-Lj8nPaSYOuRhgqdyShV50fY5jKnvaRmikUNalMPmbH+tKMGgEKVkltI/lP30PEfO2T1t6R9yc2QIBLgOc3uaFw==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "bin": { + "sassgraph": "bin/sassgraph" + } + }, + "node_modules/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sass-graph/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/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/scoped-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-2.1.0.tgz", + "integrity": "sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.29", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz", + "integrity": "sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==", + "dependencies": { + "compute-scroll-into-view": "^1.0.17" + } + }, + "node_modules/scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "dependencies": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + } + }, + "node_modules/scss-tokenizer/node_modules/source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.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=" + }, + "node_modules/selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "node_modules/semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dependencies": { + "semver": "^5.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==" + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "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==", + "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=" + }, + "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==" + }, + "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==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-favicon": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", + "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", + "dependencies": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-favicon/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==" + }, + "node_modules/serve-favicon/node_modules/safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "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=", + "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==", + "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=", + "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=" + }, + "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=" + }, + "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==" + }, + "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==", + "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=" + }, + "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/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=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "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==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "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==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "optional": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "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==" + }, + "node_modules/signum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", + "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" + }, + "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=", + "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==" + }, + "node_modules/sirv": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", + "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sirv/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slugify": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", + "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/smooth-scroll-into-view-if-needed": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/smooth-scroll-into-view-if-needed/-/smooth-scroll-into-view-if-needed-1.1.33.tgz", + "integrity": "sha512-crS8NfAaoPrtVYOCMSAnO2vHRgUp22NiiDgEQ7YiaAy5xe2jmR19Jm+QdL8+97gO8ENd7PUyQIAQojJyIiyRHw==", + "dependencies": { + "scroll-into-view-if-needed": "^2.2.28" + } + }, + "node_modules/smpltmpl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/smpltmpl/-/smpltmpl-1.0.2.tgz", + "integrity": "sha512-Hq23NNgeZigOzIiX1dkb6W3gFn2/XQj43KhPxu65IMieG/gIwf/lQb1IudjYv0c/5LwJeS/mPayYzyo+8WJMxQ==", + "dependencies": { + "babel-code-frame": "^6.26.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "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==", + "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=", + "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==", + "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==", + "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==", + "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==", + "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=", + "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==", + "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=", + "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=", + "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=" + }, + "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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/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==", + "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/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "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.5.1" + } + }, + "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==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs/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.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==" + }, + "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==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.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==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "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==" + }, + "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==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "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==", + "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/spdy-transport/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/split-lines": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-2.1.0.tgz", + "integrity": "sha512-8dv+1zKgTpfTkOy8XZLFyWrfxO0NV/bj/3EaQ+hBrBxGv2DwiroljPjU8NlCr+59nLnsVm9WYT7lXKwe4TC6bw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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.js": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", + "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "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" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "node_modules/stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=", + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "dependencies": { + "escodegen": "^1.11.1" + } + }, + "node_modules/static-eval/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==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "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/static-eval/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=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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=", + "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=", + "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=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/store2": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz", + "integrity": "sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==" + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", + "dependencies": { + "debug": "2" + } + }, + "node_modules/stream-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stream-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "node_modules/string-split-by": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", + "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", + "dependencies": { + "parenthesis": "^3.1.5" + } + }, + "node_modules/string-to-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz", + "integrity": "sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q==", + "dependencies": { + "atob-lite": "^2.0.0", + "is-base64": "^0.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.padstart": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.1.4.tgz", + "integrity": "sha512-XqOHj8horGsF+zwxraBvMTkBFM28sS/jHBJajh17JtJKA92qazidiQbLosV4UA18azvLOVKYo/E3g3T9Y5826w==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.2.tgz", + "integrity": "sha512-MTxTVcEkorNtBbNpoFJPEh0kKdM6+QbMjLbaxmvaPMmayOXdr/AIVIIJX7FReUVweRBFJfZepK4A4AKgwuFpMQ==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities/node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "dependencies": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + }, + "engines": { + "node": ">=4" + } + }, + "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=", + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strongly-connected-components": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", + "integrity": "sha1-CSDitN9nyOrulsa2I0/inoc9upk=" + }, + "node_modules/style-loader": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/styled-components": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.3.tgz", + "integrity": "sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^0.8.8", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-components/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, + "node_modules/supercluster": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.4.tgz", + "integrity": "sha512-GhKkRM1jMR6WUwGPw05fs66pOFWhf59lXq+Q3J3SxPvhNcmgOtLRV6aVQPMRsmXdpaeFJGivt+t7QXUPL3ff4g==", + "dependencies": { + "kdbush": "^3.0.0" + } + }, + "node_modules/superscript-text": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", + "integrity": "sha1-58snUlZzYN9QvrBhDOjfPXHY39g=" + }, + "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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-arc-to-cubic-bezier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==" + }, + "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==" + }, + "node_modules/svg-path-bounds": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz", + "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==", + "dependencies": { + "abs-svg-path": "^0.1.1", + "is-svg-path": "^1.0.1", + "normalize-svg-path": "^1.0.0", + "parse-svg-path": "^0.1.2" + } + }, + "node_modules/svg-path-bounds/node_modules/normalize-svg-path": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", + "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", + "dependencies": { + "svg-arc-to-cubic-bezier": "^3.0.0" + } + }, + "node_modules/svg-path-sdf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", + "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", + "dependencies": { + "bitmap-sdf": "^1.0.0", + "draw-svg-path": "^1.0.0", + "is-svg-path": "^1.0.1", + "parse-svg-path": "^0.1.2", + "svg-path-bounds": "^1.0.1" + } + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "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/svgo/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "node_modules/symbol.prototype.description": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz", + "integrity": "sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-symbol-description": "^1.0.0", + "has-symbols": "^1.0.2", + "object.getownpropertydescriptors": "^2.1.2" + }, + "engines": { + "node": ">= 0.11.15" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synchronous-promise": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.16.tgz", + "integrity": "sha512-qImOD23aDfnIDNqlG1NOehdB9IYsn1V9oByPjKY1nakv2MQYCEMyX033/q+aEtYCpmYK1cv2+NTmlH+ra6GA5A==" + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "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/table/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==" + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/telejson": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-6.0.8.tgz", + "integrity": "sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==", + "dependencies": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.2", + "is-regex": "^1.1.2", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3" + } + }, + "node_modules/telejson/node_modules/isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "dependencies": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dependencies": { + "execa": "^0.7.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/term-size/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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": ">=4" + } + }, + "node_modules/term-size/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/term-size/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=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/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=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/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/term-size/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "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==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "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/terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "dependencies": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/terser-webpack-plugin/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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/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==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", + "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", + "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/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==", + "engines": { + "node": ">= 8" + } + }, + "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==" + }, + "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==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "node_modules/tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", + "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/tlds": { + "version": "1.221.1", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.221.1.tgz", + "integrity": "sha512-N1Afn/SLeOQRpxMwHBuNFJ3GvGrdtY4XPXKPFcx8he0U9Jg9ZkvTKE1k3jQDtCmlFn44UxjVtouF6PT4rEGd3Q==", + "bin": { + "tlds": "bin.js" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "node_modules/to-array-buffer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/to-array-buffer/-/to-array-buffer-3.2.0.tgz", + "integrity": "sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ==", + "dependencies": { + "flatten-vertex-data": "^1.0.2", + "is-blob": "^2.0.1", + "string-to-arraybuffer": "^1.0.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-float32": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz", + "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==" + }, + "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=", + "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=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-px": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", + "integrity": "sha1-W7rtXl1PdkRbzJA8KTojB90yRkY=", + "dependencies": { + "parse-unit": "^1.0.1" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "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==", + "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": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-uint8": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/to-uint8/-/to-uint8-1.4.1.tgz", + "integrity": "sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg==", + "dependencies": { + "arr-flatten": "^1.1.0", + "clamp": "^1.0.1", + "is-base64": "^0.1.0", + "is-float-array": "^1.0.0", + "to-array-buffer": "^3.0.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/topojson-client/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/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz", + "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "dependencies": { + "glob": "^7.1.2" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "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==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", + "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=" + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typedarray-pool": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", + "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", + "dependencies": { + "bit-twiddle": "^1.0.0", + "dup": "^1.0.0" + } + }, + "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==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typeface-roboto": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/typeface-roboto/-/typeface-roboto-1.1.13.tgz", + "integrity": "sha512-YXvbd3a1QTREoD+FJoEkl0VQNJoEjewR2H11IjVv4bp6ahuIcw0yyw/3udC4vJkHw3T3cUh85FTg8eWef3pSaw==" + }, + "node_modules/typescript": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "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==", + "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==", + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.0.tgz", + "integrity": "sha512-4U3ru/BRXYYhKbwXV6lU6bufLikoAavTwev89H5UxY8enDFaAT2VXmIXYNm6hb5oHPng/EXr77PVyDFcptbk5g==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz", + "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-random": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-random/-/unique-random-1.0.0.tgz", + "integrity": "sha1-zj4iTIJCzTOg53sNcYDXfmti0MQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-random-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-random-array/-/unique-random-array-1.0.0.tgz", + "integrity": "sha1-QrNyHFeTiNi2Z8k8Lb3j1dgakTY=", + "dependencies": { + "unique-random": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz", + "integrity": "sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "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=" + }, + "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=", + "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=", + "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=", + "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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/untildify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", + "integrity": "sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==", + "optional": true, + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "engines": { + "node": ">=4" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", + "integrity": "sha1-9RAYLYHugZ+4LDprIrYrve2ngI8=" + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/update-notifier/node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + }, + "node_modules/update-notifier/node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/update-notifier/node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "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=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/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==", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url-parse-lax/node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/url-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-5.0.0.tgz", + "integrity": "sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g==", + "dependencies": { + "ip-regex": "^4.1.0", + "tlds": "^1.203.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/url-regex/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/url/node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-callback-ref/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-memo-one": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.2.tgz", + "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/user-meta": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/user-meta/-/user-meta-1.0.0.tgz", + "integrity": "sha512-Q/opMgFhVbBkdlTs44UKzV7L5Uj2zrJ4MVPXTTzJmrU1bHb2cX6wJzBIqEf1gROTzZIH8u39WmHsa5EvfnMPrw==", + "dependencies": { + "rc": "^1.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "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==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "node_modules/utils-copy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/utils-copy/-/utils-copy-1.1.1.tgz", + "integrity": "sha1-biuXmCqozXPhGCo+b4vsPA9AWKc=", + "dependencies": { + "const-pinf-float64": "^1.0.0", + "object-keys": "^1.0.9", + "type-name": "^2.0.0", + "utils-copy-error": "^1.0.0", + "utils-indexof": "^1.0.0", + "utils-regex-from-string": "^1.0.0", + "validate.io-array": "^1.0.3", + "validate.io-buffer": "^1.0.1", + "validate.io-nonnegative-integer": "^1.0.0" + } + }, + "node_modules/utils-copy-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-copy-error/-/utils-copy-error-1.0.1.tgz", + "integrity": "sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U=", + "dependencies": { + "object-keys": "^1.0.9", + "utils-copy": "^1.1.0" + } + }, + "node_modules/utils-indexof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-indexof/-/utils-indexof-1.0.0.tgz", + "integrity": "sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w=", + "dependencies": { + "validate.io-array-like": "^1.0.1", + "validate.io-integer-primitive": "^1.0.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/utils-regex-from-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz", + "integrity": "sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk=", + "dependencies": { + "regex-regex": "^1.0.0", + "validate.io-string-primitive": "^1.0.0" + } + }, + "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==", + "devOptional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uuid-browser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid-browser/-/uuid-browser-3.1.0.tgz", + "integrity": "sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==", + "dev": true + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "node_modules/v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "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==", + "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==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha1-W1osr9j4uFq7L4hroVPy2Tond00=" + }, + "node_modules/validate.io-array-like": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz", + "integrity": "sha1-evn363tRcVvrIhVmjsXM5U+t21o=", + "dependencies": { + "const-max-uint32": "^1.0.2", + "validate.io-integer-primitive": "^1.0.0" + } + }, + "node_modules/validate.io-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz", + "integrity": "sha1-hS1nNAIZFNXROvwyUxdh43IO1E4=" + }, + "node_modules/validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg=", + "dependencies": { + "validate.io-number": "^1.0.3" + } + }, + "node_modules/validate.io-integer-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz", + "integrity": "sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY=", + "dependencies": { + "validate.io-number-primitive": "^1.0.0" + } + }, + "node_modules/validate.io-matrix-like": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz", + "integrity": "sha1-XsMqddCInaxzbepovdYUWxVe38M=" + }, + "node_modules/validate.io-ndarray-like": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz", + "integrity": "sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk=" + }, + "node_modules/validate.io-nonnegative-integer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz", + "integrity": "sha1-gGkkOgjF+Y6VQTySnf17GPP28p8=", + "dependencies": { + "validate.io-integer": "^1.0.5" + } + }, + "node_modules/validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha1-9j/+2iSL8opnqNSODjtGGhZluvg=" + }, + "node_modules/validate.io-number-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz", + "integrity": "sha1-0uAfICmJNp3PEVVElWQgOv5YTlU=" + }, + "node_modules/validate.io-positive-integer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz", + "integrity": "sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI=", + "dependencies": { + "validate.io-integer": "^1.0.5" + } + }, + "node_modules/validate.io-string-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz", + "integrity": "sha1-uBNbn7E3K94C/dU60dDM1t55j+4=" + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/vfile": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.2.0.tgz", + "integrity": "sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz", + "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "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/vue-eslint-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz", + "integrity": "sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "eslint-scope": "^5.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.0.1", + "lodash": "^4.17.15" + }, + "engines": { + "node": ">=8.10" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vue-eslint-parser/node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz", + "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==" + }, + "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==", + "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=", + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/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=", + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": 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/watchpack-chokidar2/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=", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "optional": 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/watchpack-chokidar2/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": 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/watchpack-chokidar2/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=", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "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": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/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=", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/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=", + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/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=", + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": 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/watchpack-chokidar2/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==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/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=", + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.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==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-vitals": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", + "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" + }, + "node_modules/webgl-context": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", + "integrity": "sha1-jzfXJXz23xzQpJ5qextyG5TMhqA=", + "dependencies": { + "get-canvas-context": "^1.0.1" + } + }, + "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==", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz", + "integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^6.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/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/webpack-bundle-analyzer/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", + "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", + "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" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/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=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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/webpack-dev-server/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=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "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/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/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==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/webpack-dev-server/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/webpack-dev-server/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==" + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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/webpack-dev-server/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=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "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": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/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=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "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==", + "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/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/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=", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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/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==", + "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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/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==", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "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=", + "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=", + "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==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/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==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/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==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/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=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/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==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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/webpack-dev-server/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==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-dynamic-public-path": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/webpack-dynamic-public-path/-/webpack-dynamic-public-path-1.0.8.tgz", + "integrity": "sha512-AF6onorpvmiC+I/dQ19SOi+oN66oEy9h4deam7gPs1Qa1mOQ9i7IRsOahaukohKAciys7NfX+YFboRn4rmpuKw==", + "dev": true + }, + "node_modules/webpack-filter-warnings-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz", + "integrity": "sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==", + "engines": { + "node": ">= 4.3 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/webpack-hot-middleware": { + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.3.tgz", + "integrity": "sha512-IK/0WAHs7MTu1tzLTjio73LjS3Ov+VvBKQmE8WPlJutgG5zT6Urgq/BbAdRrHTRpyzK0dvAvFh1Qg98akxgZpA==", + "dependencies": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/webpack-hot-middleware/node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "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==", + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-log/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.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "dependencies": { + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.11.5" + }, + "peerDependencies": { + "webpack": "2 || 3 || 4" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz", + "integrity": "sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==", + "dependencies": { + "debug": "^3.0.0" + } + }, + "node_modules/webpack-virtual-modules/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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/webpack/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=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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/webpack/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=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/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=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/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==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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/webpack/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack/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==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/webpack/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/webpack/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=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "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==", + "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==", + "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==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "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==" + }, + "node_modules/whatwg-url": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz", + "integrity": "sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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=" + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/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=", + "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==", + "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=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dependencies": { + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/workbox-background-sync": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", + "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", + "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-build": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", + "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", + "dependencies": { + "@babel/core": "^7.8.4", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@hapi/joi": "^15.1.0", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.1", + "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.6", + "lodash.template": "^4.5.0", + "pretty-bytes": "^5.3.0", + "rollup": "^1.31.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-terser": "^5.3.1", + "source-map": "^0.7.3", + "source-map-url": "^0.4.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "tempy": "^0.3.0", + "upath": "^1.2.0", + "workbox-background-sync": "^5.1.4", + "workbox-broadcast-update": "^5.1.4", + "workbox-cacheable-response": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-expiration": "^5.1.4", + "workbox-google-analytics": "^5.1.4", + "workbox-navigation-preload": "^5.1.4", + "workbox-precaching": "^5.1.4", + "workbox-range-requests": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4", + "workbox-streams": "^5.1.4", + "workbox-sw": "^5.1.4", + "workbox-window": "^5.1.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/workbox-build/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/workbox-build/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==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", + "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-core": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", + "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + }, + "node_modules/workbox-expiration": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", + "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-google-analytics": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", + "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "dependencies": { + "workbox-background-sync": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", + "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-precaching": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", + "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-range-requests": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", + "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-routing": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", + "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-strategies": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", + "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "dependencies": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "node_modules/workbox-streams": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", + "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "dependencies": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "node_modules/workbox-sw": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", + "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" + }, + "node_modules/workbox-webpack-plugin": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "fast-json-stable-stringify": "^2.0.0", + "source-map-url": "^0.4.0", + "upath": "^1.1.2", + "webpack-sources": "^1.3.0", + "workbox-build": "^5.1.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/workbox-window": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", + "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/worker-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", + "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + }, + "engines": { + "node": ">= 6.9.0 || >= 8.9.0" + }, + "peerDependencies": { + "webpack": "^3.0.0 || ^4.0.0-alpha.0 || ^4.0.0" + } + }, + "node_modules/worker-loader/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/worker-loader/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/worker-loader/node_modules/schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "dependencies": { + "microevent.ts": "~0.1.1" + } + }, + "node_modules/world-calendars": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", + "integrity": "sha1-slxQMrokEo/8QdCfr0pewbnBQzU=", + "dependencies": { + "object-assign": "^4.1.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "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==", + "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": "7.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", + "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/x-default-browser": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/x-default-browser/-/x-default-browser-0.4.0.tgz", + "integrity": "sha512-7LKo7RtWfoFN/rHx1UELv/2zHGMx8MkZKDq1xENmOCTkfIqZJ0zZ26NEJX8czhnPXVcqS0ARjjfJB+eJ0/5Cvw==", + "bin": { + "x-default-browser": "bin/x-default-browser.js" + }, + "optionalDependencies": { + "default-browser-id": "^1.0.4" + } + }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yup": { + "version": "0.32.9", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.9.tgz", + "integrity": "sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==", + "dependencies": { + "@babel/runtime": "^7.10.5", + "@types/lodash": "^4.14.165", + "lodash": "^4.17.20", + "lodash-es": "^4.17.15", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/zustand": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.1.1.tgz", + "integrity": "sha512-h4F3WMqsZgvvaE0n3lThx4MM81Ls9xebjvrABNzf5+jb3/03YjNTSgZXeyrvXDArMeV9untvWXRw1tY+ntPYbA==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "immer": ">=9.0", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + }, + "dependencies": { + "@aksel/structjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aksel/structjs/-/structjs-1.0.0.tgz", + "integrity": "sha512-7BuOlCj7bS09Gr/uJFrKJVWaZqTSOoK2eUuqUebAZq5cALZP6eNz5K5cbprYNX6KBFGMnR+CeSmZk/DjVo3ecg==", + "requires": { + "npm-name": "^5.0.1" + } + }, + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "requires": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "@ant-design/icons": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.0.tgz", + "integrity": "sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==", + "requires": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.9.4" + } + }, + "@ant-design/icons-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", + "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + }, + "@ant-design/react-slick": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.29.2.tgz", + "integrity": "sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==", + "requires": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "lodash": "^4.17.21", + "resize-observer-polyfill": "^1.5.1" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==" + }, + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "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": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/generator": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "requires": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "requires": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", + "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "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": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + }, + "@babel/helper-wrap-function": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==", + "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=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", + "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-decorators": "^7.12.1" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-default-from": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz", + "integrity": "sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-default-from": "^7.18.6" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@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==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz", + "integrity": "sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-default-from": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz", + "integrity": "sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", + "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@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==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", + "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", + "requires": { + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", + "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz", + "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz", + "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.5.tgz", + "integrity": "sha512-M/fmDX6n0cfHK/NLTcPmrfVAORKDhK8tyjDhyxlUjYyPYYO8FRWwuxBA3WBx8kWN/uBUuwGa3s/0+hQ9JIN3Tg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", + "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz", + "integrity": "sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.20.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.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", + "@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-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/preset-flow": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.18.6.tgz", + "integrity": "sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-flow-strip-types": "^7.18.6" + }, + "dependencies": { + "@babel/plugin-transform-flow-strip-types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz", + "integrity": "sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-flow": "^7.18.6" + } + } + } + }, + "@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==", + "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.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + } + }, + "@babel/preset-typescript": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", + "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.12.1" + } + }, + "@babel/register": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz", + "integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==", + "requires": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.5", + "source-map-support": "^0.5.16" + } + }, + "@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/runtime-corejs3": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz", + "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==", + "requires": { + "core-js-pure": "^3.15.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@base2/pretty-print-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", + "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==" + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "requires": { + "commander": "^2.15.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==" + } + } + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" + }, + "@csstools/normalize.css": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", + "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" + }, + "@ctrl/tinycolor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", + "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==" + }, + "@design-systems/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@design-systems/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-Y/d2Zzr+JJfN6u1gbuBUb1ufBuLMJJRZQk+dRmw8GaTpqKx5uf7cGUYGTwN02dIb3I+Tf+cW8jcGBTRiFxdYFg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.11.2", + "clsx": "^1.0.4", + "focus-lock": "^0.8.0", + "react-merge-refs": "^1.0.0" + } + }, + "@devtools-ds/object-inspector": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/object-inspector/-/object-inspector-1.2.0.tgz", + "integrity": "sha512-VztcwqVwScSvYdvJVZBJYsVO/2Pew3JPpFV3T9fuCHQLlHcLYOV3aU/kBS2ScuE2O1JN0ZbobLqFLa3vQF54Fw==", + "dev": true, + "requires": { + "@babel/runtime": "7.7.2", + "@devtools-ds/object-parser": "^1.2.0", + "@devtools-ds/themes": "^1.2.0", + "@devtools-ds/tree": "^1.2.0", + "clsx": "1.1.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true + } + } + }, + "@devtools-ds/object-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/object-parser/-/object-parser-1.2.0.tgz", + "integrity": "sha512-SjGGyiFFY8dtUpiWXAvRSzRT+hE11EAAysrq2PsC/GVLf2ZLyT2nHlQO5kDStywyTz+fjw7S7pyDRj1HG9YTTA==", + "dev": true, + "requires": { + "@babel/runtime": "~7.5.4" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + } + } + }, + "@devtools-ds/themes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/themes/-/themes-1.2.0.tgz", + "integrity": "sha512-LimEITorE6yWZWWuMc6OiBfLQgPrQqWbyMEmfRUDPa3PHXoAY4SpDxczfg31fgyRDUNWnZhjaJH5bBbu8VEbIw==", + "dev": true, + "requires": { + "@babel/runtime": "~7.5.4", + "@design-systems/utils": "2.12.0", + "clsx": "1.1.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true + } + } + }, + "@devtools-ds/tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@devtools-ds/tree/-/tree-1.2.0.tgz", + "integrity": "sha512-hC4g4ocuo2eg7jsnzKdauxH0sDQiPW3KSM2+uK3kRgcmr9PzpBD5Kob+Y/WFSVKswFleftOGKL4BQLuRv0sPxA==", + "dev": true, + "requires": { + "@babel/runtime": "7.7.2", + "@devtools-ds/themes": "^1.2.0", + "clsx": "1.1.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true + } + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" + }, + "@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } + } + }, + "@emotion/cache": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", + "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "requires": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "requires": { + "@emotion/memoize": "0.7.4" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + } + } + }, + "@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "requires": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + } + } + }, + "@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + }, + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==" + }, + "@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + }, + "@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + }, + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "@floating-ui/core": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz", + "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==" + }, + "@floating-ui/dom": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz", + "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==", + "requires": { + "@floating-ui/core": "^0.7.3" + } + }, + "@floating-ui/react-dom": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz", + "integrity": "sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==", + "requires": { + "@floating-ui/dom": "^0.5.3", + "use-isomorphic-layout-effect": "^1.1.1" + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@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==", + "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": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "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" + } + } + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "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==", + "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==", + "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==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "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" + } + } + } + }, + "@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==", + "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==", + "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==", + "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==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@mapbox/geojson-rewind": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz", + "integrity": "sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA==", + "requires": { + "get-stream": "^6.0.1", + "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/rehype-prism": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@mapbox/rehype-prism/-/rehype-prism-0.8.0.tgz", + "integrity": "sha512-bIz4a3oZ8g+pQBHSMMIxNpYOMX4yq4aZdpezoiCl9yJudh1Z9SRmHQqH6f+WtTBNOORzXMEGkvBze4PiH17wtA==", + "requires": { + "hast-util-to-string": "^1.0.4", + "mrm": "^3.0.9", + "refractor": "^3.4.0", + "unist-util-visit": "^2.0.3" + } + }, + "@mapbox/tiny-sdf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", + "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" + }, + "@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==" + }, + "@material-ui/core": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.2.tgz", + "integrity": "sha512-Q1npB8V73IC+eV2X6as+g71MpEGQwqKHUI2iujY62npk35V8nMx/bUXAHjv5kKG1BZ8s8XUWoG6s/VkjYPjjQA==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + } + }, + "@material-ui/icons": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", + "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", + "requires": { + "@babel/runtime": "^7.4.4" + } + }, + "@material-ui/lab": { + "version": "4.0.0-alpha.60", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.60.tgz", + "integrity": "sha512-fadlYsPJF+0fx2lRuyqAuJj7hAS1tLDdIEEdov5jlrpb5pp4b+mRDUqQTUxi4inRZHS1bEXpU8QWUhO6xX88aA==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + }, + "@material-ui/styles": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + } + }, + "@material-ui/system": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + } + }, + "@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==" + }, + "@material-ui/utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + }, + "@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "requires": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "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" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } + } + }, + "@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "dev": true + }, + "@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" + }, + "@monaco-editor/loader": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.3.2.tgz", + "integrity": "sha512-BTDbpHl3e47r3AAtpfVFTlAi7WXv4UQ/xZmz8atKl4q7epQV5e7+JbigFDViWF71VBi4IIBdcWP57Hj+OWuc9g==", + "requires": { + "state-local": "^1.0.6" + } + }, + "@monaco-editor/react": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.4.4.tgz", + "integrity": "sha512-yQsYnVkgP5RC5ZMoRVCXSBn4D4hLUOgoQK+AZJpVY57NDXmEb57OVaaYKh8/RTzxkpuLV278hKNw5DnuzlgQwg==", + "requires": { + "@monaco-editor/loader": "^1.3.1", + "prop-types": "^15.7.2" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "dependencies": { + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==" + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "@plotly/d3": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.0.tgz", + "integrity": "sha512-L10iHgzvw3uSic/nQpYehlNzxUQvImwms5U7S95pJAEhrllzkrdQNy1Mc5DW9ab881Yr4fh300gJztKXWZDfkQ==" + }, + "@plotly/d3-sankey": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", + "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", + "requires": { + "d3-array": "1", + "d3-collection": "1", + "d3-shape": "^1.2.0" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "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-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" + } + } + } + }, + "@plotly/d3-sankey-circular": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz", + "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==", + "requires": { + "d3-array": "^1.2.1", + "d3-collection": "^1.0.4", + "d3-shape": "^1.2.0", + "elementary-circuits-directed-graph": "^1.0.4" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "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-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" + } + } + } + }, + "@plotly/point-cluster": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", + "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==", + "requires": { + "array-bounds": "^1.0.1", + "binary-search-bounds": "^2.0.4", + "clamp": "^1.0.1", + "defined": "^1.0.0", + "dtype": "^2.0.0", + "flatten-vertex-data": "^1.0.2", + "is-obj": "^1.0.1", + "math-log2": "^1.0.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0" + } + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", + "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", + "requires": { + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5", + "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==" + } + } + }, + "@polka/url": { + "version": "1.0.0-next.20", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.20.tgz", + "integrity": "sha512-88p7+M0QGxKpmnkfXjS4V26AnoC/eiqZutE8GLdaI5X12NY75bXSdTY9NkmYb2Xyk1O+MmkuO6Frmsj84V6I8Q==", + "dev": true + }, + "@radix-ui/number": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", + "integrity": "sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-arrow": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.1.tgz", + "integrity": "sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/react-checkbox": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.0.1.tgz", + "integrity": "sha512-TisH0B8hWmYP3ONRduYCyN04rR9yLPIw/Rwyn1RoC1suSoGCa8Wn+YPdSSSarSszeIbcg3p2lBkDp2XXit4sZw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + } + }, + "@radix-ui/react-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.1.tgz", + "integrity": "sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1" + } + }, + "@radix-ui/react-compose-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", + "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", + "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-dialog": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.2.tgz", + "integrity": "sha512-EKxxp2WNSmUPkx4trtWNmZ4/vAYEg7JkAfa1HKBUnaubw9eHzf1Orr9B472lJYaYz327RHDrd4R95fsw7VR8DA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, + "@radix-ui/react-direction": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz", + "integrity": "sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-dismissable-layer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz", + "integrity": "sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.2" + } + }, + "@radix-ui/react-focus-guards": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", + "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-focus-scope": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.1.tgz", + "integrity": "sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0" + } + }, + "@radix-ui/react-id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", + "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + } + }, + "@radix-ui/react-popover": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.2.tgz", + "integrity": "sha512-4tqZEl9w95R5mlZ/sFdgBnfhCBOEPepLIurBA5kt/qaAhldJ1tNQd0ngr0ET0AHbPotT4mwxMPr7a+MA/wbK0g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.0.1", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, + "@radix-ui/react-popper": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.1.tgz", + "integrity": "sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + } + }, + "@radix-ui/react-portal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.1.tgz", + "integrity": "sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/react-presence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + } + }, + "@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + } + }, + "@radix-ui/react-radio-group": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.1.0.tgz", + "integrity": "sha512-7rrkZCXu0Q7oC0MxCm497X1DdV/tI78oNIGXA8sDbCkboiTkuLSe728zCCpRYHw+9PifHIx86nsbITPEq5yijg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-roving-focus": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + } + }, + "@radix-ui/react-roving-focus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.1.tgz", + "integrity": "sha512-TB76u5TIxKpqMpUAuYH2VqMhHYKa+4Vs1NHygo/llLvlffN6mLVsFhz0AnSFlSBAvTBYVHYAkHAyEt7x1gPJOA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0" + } + }, + "@radix-ui/react-separator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.1.tgz", + "integrity": "sha512-uc6Izot0D8uVz6T2nSb/HI7OaxkeaD50GgKr3W6HORnbfGVrG7LWuy+g6Fd58n8wHbrRblSYJZEfcjgymMlJjw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/react-slider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.1.0.tgz", + "integrity": "sha512-5H/QB4xD3GF9UfoSCVLBx2JjlXamMcmTyL6gr4kkd/MiAGaYB0W7Exi4MQa0tJApBFJe+KmS5InKCI56p2kmjA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.0", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", + "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + } + }, + "@radix-ui/react-switch": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.0.1.tgz", + "integrity": "sha512-tTxGluMtwrc5ffgAiOSMrYIx0r3vSTcgM4Vl8rqfpXcHt6ryB9B0OlFKUOiDpKASXlhvzfHf4Y0AYKJdpzjL8w==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" + } + }, + "@radix-ui/react-toast": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.2.tgz", + "integrity": "sha512-Kpr4BBYoP0O5A1UeDBmao87UnCMNdAKGNioQH5JzEm6OYTUVGhuDRbOwoZxPwOZ6vsjJHeIpdUrwbiHEB65CCw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.1" + } + }, + "@radix-ui/react-tooltip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.3.tgz", + "integrity": "sha512-cmc9qV4KpgqdXVTn1K8KN8MnuSXvw+E719pKwyvpCGrQ+0AA2qTjcIL3uxCj4jc4k3sDR36RF7R3H7N5hPybBQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.1.0", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.1" + }, + "dependencies": { + "@radix-ui/react-popper": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.0.tgz", + "integrity": "sha512-07U7jpI0dZcLRAxT7L9qs6HecSoPhDSJybF7mEGHJDBDv+ZoGCvIlva0s+WxMXwJEav+ckX3hAlXBtnHmuvlCQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + } + } + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + } + }, + "@radix-ui/react-use-escape-keydown": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.2.tgz", + "integrity": "sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + } + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-use-previous": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.0.tgz", + "integrity": "sha512-RG2K8z/K7InnOKpq6YLDmT49HGjNmrK+fr82UCVKT2sW0GYfVnYp4wZWBooT/EYfQ5faA9uIjvsuMMhH61rheg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-use-rect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz", + "integrity": "sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.0" + } + }, + "@radix-ui/react-use-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz", + "integrity": "sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + } + }, + "@radix-ui/react-visually-hidden": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.1.tgz", + "integrity": "sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/rect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.0.tgz", + "integrity": "sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@rc-component/portal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.0.tgz", + "integrity": "sha512-tbXM9SB1r5FOuZjRCljERFByFiEUcMmCWMXLog/NmgCzlAzreXyf23Vei3ZpSMxSMavzPnhCovfZjZdmxS3d1w==", + "requires": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + } + }, + "@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "requires": { + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + } + }, + "@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + } + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "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==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@stitches/react": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz", + "integrity": "sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==" + }, + "@storybook/addon-actions": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.5.13.tgz", + "integrity": "sha512-3Tji0gIy95havhTpSc6CsFl5lNxGn4O5Y1U9fyji+GRkKqDFOrvVLYAHPtLOpYdEI5tF0bDo+akiqfDouY8+eA==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "polished": "^4.2.2", + "prop-types": "^15.7.2", + "react-inspector": "^5.1.0", + "regenerator-runtime": "^0.13.7", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "uuid-browser": "^3.1.0" + } + }, + "@storybook/addon-backgrounds": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.13.tgz", + "integrity": "sha512-b4JX7JMY7e50y1l6g71D+2XWV3GO0TO2z1ta8J6W4OQt8f44V7sSkRQaJUzXdLjQMrA+Anojuy1ZwPjVeLC6vg==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/addon-controls": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.5.13.tgz", + "integrity": "sha512-lYq3uf2mlVevm0bi6ueL3H6TpUMRYW9s/pTNTVJT225l27kLdFR9wEKxAkCBrlKaTgDLJmzzDRsJE3NLZlR/5Q==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/node-logger": "6.5.13", + "@storybook/store": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/addon-docs": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.5.13.tgz", + "integrity": "sha512-RG/NjsheD9FixZ789RJlNyNccaR2Cuy7CtAwph4oUNi3aDFjtOI8Oe9L+FOT7qtVnZLw/YMjF+pZxoDqJNKLPw==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@jest/transform": "^26.6.2", + "@mdx-js/react": "^1.6.22", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/docs-tools": "6.5.13", + "@storybook/mdx1-csf": "^0.0.1", + "@storybook/node-logger": "6.5.13", + "@storybook/postinstall": "6.5.13", + "@storybook/preview-web": "6.5.13", + "@storybook/source-loader": "6.5.13", + "@storybook/store": "6.5.13", + "@storybook/theming": "6.5.13", + "babel-loader": "^8.0.0", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "regenerator-runtime": "^0.13.7", + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/addon-essentials": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.5.13.tgz", + "integrity": "sha512-G9FVAWV7ixjVLWeLgIX+VT90tcAk6yQxfZQegfg5ucRilGysJCDaNnoab4xuuvm1R40TfFhba3iAGZtQYsddmw==", + "dev": true, + "requires": { + "@storybook/addon-actions": "6.5.13", + "@storybook/addon-backgrounds": "6.5.13", + "@storybook/addon-controls": "6.5.13", + "@storybook/addon-docs": "6.5.13", + "@storybook/addon-measure": "6.5.13", + "@storybook/addon-outline": "6.5.13", + "@storybook/addon-toolbars": "6.5.13", + "@storybook/addon-viewport": "6.5.13", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/node-logger": "6.5.13", + "core-js": "^3.8.2", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/addon-interactions": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-6.5.13.tgz", + "integrity": "sha512-FPOeS7AT/Odxl6z7E0qYI4F0Sh06jFRttRvSgpKC5P2lYUWUstLP5TC8N+F5ijBeLfIdIsf5zBK7l5Y/cluueg==", + "dev": true, + "requires": { + "@devtools-ds/object-inspector": "^1.1.2", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/instrumenter": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "jest-mock": "^27.0.6", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + } + } + } + }, + "@storybook/addon-links": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.5.13.tgz", + "integrity": "sha512-K/LYYu9R/Xoah5h9MNh4mSHOic3q5csqjderLqr2YW/KPYiuNubgvzEbAAbzI5xq5JrtAZqnINrZUv2A4CyYbQ==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.13", + "@types/qs": "^6.9.5", + "core-js": "^3.8.2", + "global": "^4.4.0", + "prop-types": "^15.7.2", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/addon-measure": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.5.13.tgz", + "integrity": "sha512-pi5RFB9YTnESRFtYHAVRUrgEI5to0TFc4KndtwcCKt1fMJ8OFjXQeznEfdj95PFeUvW5TNUwjL38vK4LhicB+g==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/addon-outline": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.5.13.tgz", + "integrity": "sha512-8d8taPheO/tryflzXbj2QRuxHOIS8CtzRzcaglCcioqHEMhOIDOx9BdXKdheq54gdk/UN94HdGJUoVxYyXwZ4Q==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/addon-toolbars": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.5.13.tgz", + "integrity": "sha512-Qgr4wKRSP+gY1VaN7PYT4TM1um7KY341X3GHTglXLFHd8nDsCweawfV2shaX3WxCfZmVro8g4G+Oest30kLLCw==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/addon-viewport": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.5.13.tgz", + "integrity": "sha512-KSfeuCSIjncwWGnUu6cZBx8WNqYvm5gHyFvkSPKEu0+MJtgncbUy7pl53lrEEr6QmIq0GRXvS3A0XzV8RCnrSA==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "prop-types": "^15.7.2", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/addons": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.13.tgz", + "integrity": "sha512-18CqzNnrGMfeZtiKz+R/3rHtSNnfNwz6y6prIQIbWseK16jY8ELTfIFGviwO5V2OqpbHDQi5+xQQ63QAIb89YA==", + "requires": { + "@storybook/api": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.13", + "@storybook/theming": "6.5.13", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.13.tgz", + "integrity": "sha512-xVSmB7/IuFd6G7eiJjbI2MuS7SZunoUM6d+YCWpjiehfMeX47MXt1gZtOwFrgJC1ShZlefXFahq/dvxwtmWs+w==", + "requires": { + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/builder-webpack4": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.5.13.tgz", + "integrity": "sha512-Agqy3IKPv3Nl8QqdS7PjtqLp+c0BD8+/3A2ki/YfKqVz+F+J34EpbZlh3uU053avm1EoNQHSmhZok3ZlWH6O7A==", + "requires": { + "@babel/core": "^7.12.10", + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/preview-web": "6.5.13", + "@storybook/router": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.5.13", + "@storybook/theming": "6.5.13", + "@storybook/ui": "6.5.13", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/webpack": "^4.41.26", + "autoprefixer": "^9.8.6", + "babel-loader": "^8.0.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "core-js": "^3.8.2", + "css-loader": "^3.6.0", + "file-loader": "^6.2.0", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^4.1.6", + "glob": "^7.1.6", + "glob-promise": "^3.4.0", + "global": "^4.4.0", + "html-webpack-plugin": "^4.0.0", + "pnp-webpack-plugin": "1.6.4", + "postcss": "^7.0.36", + "postcss-flexbugs-fixes": "^4.2.1", + "postcss-loader": "^4.2.0", + "raw-loader": "^4.0.2", + "stable": "^0.1.8", + "style-loader": "^1.3.0", + "terser-webpack-plugin": "^4.2.3", + "ts-dedent": "^2.0.0", + "url-loader": "^4.1.1", + "util-deprecate": "^1.0.2", + "webpack": "4", + "webpack-dev-middleware": "^3.7.3", + "webpack-filter-warnings-plugin": "^1.2.1", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.2.2" + }, + "dependencies": { + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@storybook/channel-postmessage": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.5.13.tgz", + "integrity": "sha512-R79MBs0mQ7TV8M/a6x/SiTRyvZBidDfMEEthG7Cyo9p35JYiKOhj2535zhW4qlVMESBu95pwKYBibTjASoStPw==", + "requires": { + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "qs": "^6.10.0", + "telejson": "^6.0.8" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/channel-websocket": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.5.13.tgz", + "integrity": "sha512-kwh667H+tzCiNvs92GNwYOwVXdj9uHZyieRAN5rJtTBJ7XgLzGkpTEU50mWlbc0nDKhgE0qYvzyr5H393Iy5ug==", + "requires": { + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0", + "telejson": "^6.0.8" + } + }, + "@storybook/channels": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.13.tgz", + "integrity": "sha512-sGYSilE30bz0jG+HdHnkv0B4XkAv2hP+KRZr4xmnv+MOOQpRnZpJ5Z3HVU16s17cj/83NWihKj6BuKcEVzyilg==", + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-api": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.5.13.tgz", + "integrity": "sha512-uH1mAWbidPiuuTdMUVEiuaNOfrYXm+9QLSP1MMYTKULqEOZI5MSOGkEDqRfVWxbYv/iWBOPTQ+OM9TQ6ecYacg==", + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.13", + "@types/qs": "^6.9.5", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/client-logger": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.13.tgz", + "integrity": "sha512-F2SMW3LWFGXLm2ENTwTitrLWJgmMXRf3CWQXdN2EbkNCIBHy5Zcbt+91K4OX8e2e5h9gjGfrdYbyYDYOoUCEfA==", + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/components": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.5.13.tgz", + "integrity": "sha512-6Hhx70JK5pGfKCkqMU4yq/BBH+vRTmzj7tZKfPwba+f8VmTMoOr/2ysTQFRtXryiHB6Z15xBYgfq5x2pIwQzLQ==", + "requires": { + "@storybook/client-logger": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/core": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.5.13.tgz", + "integrity": "sha512-kw1lCgbsxzUimGww6t5rmuWJmFPe9kGGyzIqvj4RC4BBcEsP40LEu9XhSfvnb8vTOLIULFZeZpdRFfJs4TYbUw==", + "requires": { + "@storybook/core-client": "6.5.13", + "@storybook/core-server": "6.5.13" + } + }, + "@storybook/core-client": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.5.13.tgz", + "integrity": "sha512-YuELbRokTBdqjbx/R4/7O4rou9kvbBIOJjlUkor9hdLLuJ3P0yGianERGNkZFfvcfMBAxU0p52o7QvDldSR3kA==", + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/channel-websocket": "6.5.13", + "@storybook/client-api": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/preview-web": "6.5.13", + "@storybook/store": "6.5.13", + "@storybook/ui": "6.5.13", + "airbnb-js-shims": "^2.2.1", + "ansi-to-html": "^0.6.11", + "core-js": "^3.8.2", + "global": "^4.4.0", + "lodash": "^4.17.21", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "unfetch": "^4.2.0", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/core-common": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.5.13.tgz", + "integrity": "sha512-+DVZrRsteE9pw0X5MNffkdBgejQnbnL+UOG3qXkE9xxUamQALnuqS/w1BzpHE9WmOHuf7RWMKflyQEW3OLKAJg==", + "requires": { + "@babel/core": "^7.12.10", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-decorators": "^7.12.12", + "@babel/plugin-proposal-export-default-from": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-private-property-in-object": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.12", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/preset-env": "^7.12.11", + "@babel/preset-react": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@babel/register": "^7.12.1", + "@storybook/node-logger": "6.5.13", + "@storybook/semver": "^7.3.2", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/pretty-hrtime": "^1.0.0", + "babel-loader": "^8.0.0", + "babel-plugin-macros": "^3.0.1", + "babel-plugin-polyfill-corejs3": "^0.1.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "express": "^4.17.1", + "file-system-cache": "^1.0.5", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.0.4", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "handlebars": "^4.7.7", + "interpret": "^2.2.0", + "json5": "^2.1.3", + "lazy-universal-dotenv": "^3.0.1", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "webpack": "4" + }, + "dependencies": { + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@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==", + "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": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.2.tgz", + "integrity": "sha512-nkBH96IBmgKnbHQ5gXFrcmez+Z9S2EIDKDQGp005ROqBigc88Tky4rzCnlP/lnlj245dCEQl4/YyV0V1kYh5dw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.20.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/plugin-syntax-decorators": "^7.19.0" + } + }, + "@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + } + }, + "@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "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==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.1.5", + "core-js-compat": "^3.8.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "requires": { + "find-up": "^5.0.0" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.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==" + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "@storybook/core-events": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.13.tgz", + "integrity": "sha512-kL745tPpRKejzHToA3/CoBNbI+NPRVk186vGxXBmk95OEg0TlwgQExP8BnqEtLlRZMbW08e4+6kilc1M1M4N5w==", + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/core-server": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.5.13.tgz", + "integrity": "sha512-vs7tu3kAnFwuINio1p87WyqDNlFyZESmeh9s7vvrZVbe/xS/ElqDscr9DT5seW+jbtxufAaHsx+JUTver1dheQ==", + "requires": { + "@discoveryjs/json-ext": "^0.5.3", + "@storybook/builder-webpack4": "6.5.13", + "@storybook/core-client": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/csf-tools": "6.5.13", + "@storybook/manager-webpack4": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.5.13", + "@storybook/telemetry": "6.5.13", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/node-fetch": "^2.5.7", + "@types/pretty-hrtime": "^1.0.0", + "@types/webpack": "^4.41.26", + "better-opn": "^2.1.1", + "boxen": "^5.1.2", + "chalk": "^4.1.0", + "cli-table3": "^0.6.1", + "commander": "^6.2.1", + "compression": "^1.7.4", + "core-js": "^3.8.2", + "cpy": "^8.1.2", + "detect-port": "^1.3.0", + "express": "^4.17.1", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "globby": "^11.0.2", + "ip": "^2.0.0", + "lodash": "^4.17.21", + "node-fetch": "^2.6.7", + "open": "^8.4.0", + "pretty-hrtime": "^1.0.3", + "prompts": "^2.4.0", + "regenerator-runtime": "^0.13.7", + "serve-favicon": "^2.5.0", + "slash": "^3.0.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "watchpack": "^2.2.0", + "webpack": "4", + "ws": "^8.2.3", + "x-default-browser": "^0.4.0" + }, + "dependencies": { + "@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "requires": { + "string-width": "^4.1.0" + } + }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==" + } + } + }, + "@storybook/csf": { + "version": "0.0.2--canary.4566f4d.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", + "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", + "requires": { + "lodash": "^4.17.15" + } + }, + "@storybook/csf-tools": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.5.13.tgz", + "integrity": "sha512-63Ev+VmBqzwSwfUzbuXOLKBD5dMTK2zBYLQ9anTVw70FuTikwTsGIbPgb098K0vsxRCgxl7KM7NpivHqtZtdjw==", + "requires": { + "@babel/core": "^7.12.10", + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@babel/traverse": "^7.12.11", + "@babel/types": "^7.12.11", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/mdx1-csf": "^0.0.1", + "core-js": "^3.8.2", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@storybook/docs-tools": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-6.5.13.tgz", + "integrity": "sha512-hB+hk+895ny4SW84j3X5iV55DHs3bCfTOp7cDdcZJdQrlm0wuDb4A6d4ffNC7ZLh9VkUjU6ST4VEV5Bb0Cptow==", + "requires": { + "@babel/core": "^7.12.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.13", + "core-js": "^3.8.2", + "doctrine": "^3.0.0", + "lodash": "^4.17.21", + "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@storybook/instrumenter": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-6.5.13.tgz", + "integrity": "sha512-izRF64BU+gGCP7qE1N3kOVLSv5Xk4M0OWcRmFIXoIS46qNDzmd8hmbkkx3M9wrvw0kcQ97kIyADF+UInbcr/dQ==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/manager-webpack4": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.5.13.tgz", + "integrity": "sha512-pURzS5W3XM0F7bCBWzpl7TRsuy+OXFwLXiWLaexuvo0POZe31Ueo2A1R4rx3MT5Iee8O9mYvG2XTmvK9MlLefQ==", + "requires": { + "@babel/core": "^7.12.10", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/preset-react": "^7.12.10", + "@storybook/addons": "6.5.13", + "@storybook/core-client": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/theming": "6.5.13", + "@storybook/ui": "6.5.13", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/webpack": "^4.41.26", + "babel-loader": "^8.0.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "css-loader": "^3.6.0", + "express": "^4.17.1", + "file-loader": "^6.2.0", + "find-up": "^5.0.0", + "fs-extra": "^9.0.1", + "html-webpack-plugin": "^4.0.0", + "node-fetch": "^2.6.7", + "pnp-webpack-plugin": "1.6.4", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7", + "resolve-from": "^5.0.0", + "style-loader": "^1.3.0", + "telejson": "^6.0.8", + "terser-webpack-plugin": "^4.2.3", + "ts-dedent": "^2.0.0", + "url-loader": "^4.1.1", + "util-deprecate": "^1.0.2", + "webpack": "4", + "webpack-dev-middleware": "^3.7.3", + "webpack-virtual-modules": "^0.2.2" + }, + "dependencies": { + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.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==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@storybook/mdx1-csf": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@storybook/mdx1-csf/-/mdx1-csf-0.0.1.tgz", + "integrity": "sha512-4biZIWWzoWlCarMZmTpqcJNgo/RBesYZwGFbQeXiGYsswuvfWARZnW9RE9aUEMZ4XPn7B1N3EKkWcdcWe/K2tg==", + "requires": { + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/preset-env": "^7.12.11", + "@babel/types": "^7.12.11", + "@mdx-js/mdx": "^1.6.22", + "@types/lodash": "^4.14.167", + "js-string-escape": "^1.0.1", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==" + } + } + }, + "@storybook/node-logger": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.5.13.tgz", + "integrity": "sha512-/r5aVZAqZRoy5FyNk/G4pj7yKJd3lJfPbAaOHVROv2IF7PJP/vtRaDkcfh0g2U6zwuDxGIqSn80j+qoEli9m5A==", + "requires": { + "@types/npmlog": "^4.1.2", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "npmlog": "^5.0.1", + "pretty-hrtime": "^1.0.3" + }, + "dependencies": { + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "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" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "@storybook/postinstall": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.5.13.tgz", + "integrity": "sha512-qmqP39FGIP5NdhXC5IpAs9cFoYx9fg1psoQKwb9snYb98eVQU31uHc1W2MBUh3lG4AjAm7pQaXJci7ti4jOh3g==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/preset-create-react-app": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@storybook/preset-create-react-app/-/preset-create-react-app-3.2.0.tgz", + "integrity": "sha512-lLoWCGr5cV+JNDRKYHC2gD+P2eyBqdN8qhmBa+PxDgPSNKfgUf9Wnoh+C7WTG5q2DEeR9SvUpQpZomX9DDQa4Q==", + "dev": true, + "requires": { + "@pmmmwh/react-refresh-webpack-plugin": "^0.4.3", + "@types/babel__core": "^7.1.7", + "@types/webpack": "^4.41.13", + "babel-plugin-react-docgen": "^4.1.0", + "pnp-webpack-plugin": "^1.6.4", + "react-docgen-typescript-plugin": "^1.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@storybook/preview-web": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.5.13.tgz", + "integrity": "sha512-GNNYVzw4SmRua3dOc52Ye6Us4iQbq5GKQ56U3iwnzZM3TBdJB+Rft94Fn1/pypHujEHS8hl5Xgp9td6C1lLCow==", + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/channel-postmessage": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.13", + "ansi-to-html": "^0.6.11", + "core-js": "^3.8.2", + "global": "^4.4.0", + "lodash": "^4.17.21", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "unfetch": "^4.2.0", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/react": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-6.5.13.tgz", + "integrity": "sha512-4gO8qihEkVZ8RNm9iQd7G2iZz4rRAHizJ6T5m58Sn21fxfyg9zAMzhgd0JzXuPXR8lTTj4AvRyPv1Qx7b43smg==", + "requires": { + "@babel/preset-flow": "^7.12.1", + "@babel/preset-react": "^7.12.10", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core": "6.5.13", + "@storybook/core-common": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/docs-tools": "6.5.13", + "@storybook/node-logger": "6.5.13", + "@storybook/react-docgen-typescript-plugin": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.5.13", + "@types/estree": "^0.0.51", + "@types/node": "^14.14.20 || ^16.0.0", + "@types/webpack-env": "^1.16.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "babel-plugin-add-react-displayname": "^0.0.5", + "babel-plugin-react-docgen": "^4.2.1", + "core-js": "^3.8.2", + "escodegen": "^2.0.0", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^14.3.4", + "react-refresh": "^0.11.0", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "webpack": ">=4.43.0 <6.0.0" + }, + "dependencies": { + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", + "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "requires": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + } + }, + "@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + } + } + }, + "@storybook/react-docgen-typescript-plugin": { + "version": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", + "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0.tgz", + "integrity": "sha512-eVg3BxlOm2P+chijHBTByr90IZVUtgRW56qEOLX7xlww2NBuKrcavBlcmn+HH7GIUktquWkMPtvy6e0W0NgA5w==", + "requires": { + "debug": "^4.1.1", + "endent": "^2.0.1", + "find-cache-dir": "^3.3.1", + "flat-cache": "^3.0.4", + "micromatch": "^4.0.2", + "react-docgen-typescript": "^2.1.1", + "tslib": "^2.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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==", + "requires": { + "semver": "^6.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==", + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "@storybook/router": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.13.tgz", + "integrity": "sha512-sf5aogfirH5ucD0d0hc2mKf2iyWsZsvXhr5kjxUQmgkcoflkGUWhc34sbSQVRQ1i8K5lkLIDH/q2s1Zr2SbzhQ==", + "requires": { + "@storybook/client-logger": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/source-loader": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.5.13.tgz", + "integrity": "sha512-tHuM8PfeB/0m+JigbaFp+Ld0euFH+fgOObH2W9rjEXy5vnwmaeex/JAdCprv4oL+LcDQEERqNULUUNIvbcTPAg==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "estraverse": "^5.2.0", + "global": "^4.4.0", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", + "dev": true + } + } + }, + "@storybook/store": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.5.13.tgz", + "integrity": "sha512-GG6lm+8fBX1tNUnX7x3raBOjYhhf14bPWLtYiPlxDTFEMs3sJte7zWKZq6NQ79MoBLL6jjzTeolBfDCBw6fiWQ==", + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "slash": "^3.0.0", + "stable": "^0.1.8", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/telemetry": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-6.5.13.tgz", + "integrity": "sha512-PFJEfGbunmfFWabD3rdCF8EHH+45578OHOkMPpXJjqXl94vPQxUH2XTVKQgEQJbYrgX0Vx9Z4tSkdMHuzYDbWQ==", + "requires": { + "@storybook/client-logger": "6.5.13", + "@storybook/core-common": "6.5.13", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "detect-package-manager": "^2.0.1", + "fetch-retry": "^5.0.2", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "isomorphic-unfetch": "^3.1.0", + "nanoid": "^3.3.1", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@storybook/testing-library": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@storybook/testing-library/-/testing-library-0.0.13.tgz", + "integrity": "sha512-vRMeIGer4EjJkTgI8sQyK9W431ekPWYCWL//OmSDJ64IT3h7FnW7Xg6p+eqM3oII98/O5pcya5049GxnjaPtxw==", + "dev": true, + "requires": { + "@storybook/client-logger": "^6.4.0", + "@storybook/instrumenter": "^6.4.0", + "@testing-library/dom": "^8.3.0", + "@testing-library/user-event": "^13.2.1", + "ts-dedent": "^2.2.0" + }, + "dependencies": { + "@testing-library/dom": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz", + "integrity": "sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" + } + }, + "@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "deep-equal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.1.0.tgz", + "integrity": "sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.8" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + } + } + }, + "@storybook/theming": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.13.tgz", + "integrity": "sha512-oif5NGFAUQhizo50r+ctw2hZNLWV4dPHai+L/gFvbaSeRBeHSNkIcMoZ2FlrO566HdGZTDutYXcR+xus8rI28g==", + "requires": { + "@storybook/client-logger": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/ui": { + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.5.13.tgz", + "integrity": "sha512-MklJuSg4Bc+MWjwhZVmZhJaucaeEBUMMa2V9oRWbIgZOdRHqdW72S2vCbaarDAYfBQdnfaoq1GkSQiw+EnWOzA==", + "requires": { + "@storybook/addons": "6.5.13", + "@storybook/api": "6.5.13", + "@storybook/channels": "6.5.13", + "@storybook/client-logger": "6.5.13", + "@storybook/components": "6.5.13", + "@storybook/core-events": "6.5.13", + "@storybook/router": "6.5.13", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.13", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", + "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", + "requires": { + "ejs": "^2.6.1", + "magic-string": "^0.25.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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==", + "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==", + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + } + }, + "@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==", + "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==", + "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==", + "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==", + "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" + } + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@tabler/icons": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.7.0.tgz", + "integrity": "sha512-mSjUKhwN5fJHI9yITqFn9GXGnsJ4gBAyQDWyP4Ev5fk6hD78G7u6cHEF1KARr5FOOdiIKSZWCzNzUzyLhiNPrg==" + }, + "@tabler/icons-react": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-2.7.0.tgz", + "integrity": "sha512-WV2ZwMUuZN9QcCX4RPg9+G+ycUgoItzOWVCCQYVWbYKV581fH8szM2KVaQHQhMbttL4JYtOgf4ColJIDwsIgdw==", + "requires": { + "@tabler/icons": "2.7.0", + "prop-types": "^15.7.2" + } + }, + "@testing-library/dom": { + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", + "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^4.2.2", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.6", + "lz-string": "^1.4.4", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@testing-library/jest-dom": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz", + "integrity": "sha512-dfB7HVIgTNCxH22M1+KU6viG5of2ldoA5ly8Ar8xkezKHKXjRvznCdbMbqjYGgO2xjRbwnR+rR8MLUIqF3kKbQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^4.2.2", + "chalk": "^3.0.0", + "css": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + } + }, + "@testing-library/react": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz", + "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^7.28.1" + } + }, + "@testing-library/react-hooks": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-7.0.2.tgz", + "integrity": "sha512-dYxpz8u9m4q1TuzfcUApqi8iFfR6R0FaMbr2hjZJy1uC8z+bO/K4v8Gs9eogGKYQop7QsrBTFkv/BCF7MzD2Cg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@types/react": ">=16.9.0", + "@types/react-dom": ">=16.9.0", + "@types/react-test-renderer": ">=16.9.0", + "react-error-boundary": "^3.1.0" + } + }, + "@testing-library/user-event": { + "version": "12.8.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", + "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "@turf/area": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", + "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/bbox": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", + "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/centroid": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", + "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/helpers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", + "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==" + }, + "@turf/meta": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", + "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", + "requires": { + "@turf/helpers": "^6.5.0" + } + }, + "@types/aria-query": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz", + "integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "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==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/bs58check": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/bs58check/-/bs58check-2.1.0.tgz", + "integrity": "sha512-OxsysnJQh82vy9DRbOcw9m2j/WiyqZLn0YBhKxdQ+aCwoHj+tWzyCgpwAkr79IfDXZKxc6h7k89T9pwS78CqTQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/d3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.0.0.tgz", + "integrity": "sha512-7rMMuS5unvbvFCJXAkQXIxWTo2OUlmVXN5q7sfQFesuVICY55PSP6hhbUhWjTTNpfTTB3iLALsIYDFe7KUNABw==", + "dev": true, + "requires": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "@types/d3-array": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.1.tgz", + "integrity": "sha512-D/G7oG0czeszALrkdUiV68CDiHDxXf+M2mLVqAyKktGd12VKQQljj1sHJGBKjcK4jRH1biBd6ZPQPHpJ0mNa0w==", + "dev": true + }, + "@types/d3-axis": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.1.tgz", + "integrity": "sha512-zji/iIbdd49g9WN0aIsGcwcTBUkgLsCSwB+uH+LPVDAiKWENMtI3cJEWt+7/YYwelMoZmbBfzA3qCdrZ2XFNnw==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-brush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.1.tgz", + "integrity": "sha512-B532DozsiTuQMHu2YChdZU0qsFJSio3Q6jmBYGYNp3gMDzBmuFFgPt9qKA4VYuLZMp4qc6eX7IUFUEsvHiXZAw==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-eQfcxIHrg7V++W8Qxn6QkqBNBokyhdWSAS73AbkbMzvLQmVVBviknoz2SRS/ZJdIOmhcmmdCRE/NFOm28Z1AMw==", + "dev": true + }, + "@types/d3-color": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-vcuR/rrvuoX6q0Rqe+gOScvYkTV7i6KZsfQozvThtAZ4CfuEM22OnZfiKP62nXHqRnIHXpBMy3JSha95qdYAxA==", + "dev": true + }, + "@types/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-C3zfBrhHZvrpAAK3YXqLWVAGo87A4SvJ83Q/zVJ8rFWJdKejUnDYaWZPkA8K84kb2vDA/g90LTQAz7etXcgoQQ==", + "dev": true, + "requires": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "@types/d3-delaunay": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.0.tgz", + "integrity": "sha512-iGm7ZaGLq11RK3e69VeMM6Oqj2SjKUB9Qhcyd1zIcqn2uE8w9GFB445yCY46NOQO3ByaNyktX1DK+Etz7ZaX+w==", + "dev": true + }, + "@types/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-NhxMn3bAkqhjoxabVJWKryhnZXXYYVQxaBnbANu0O94+O/nX9qSjrA1P1jbAQJxJf+VC72TxDX/YJcKue5bRqw==", + "dev": true + }, + "@types/d3-drag": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.1.tgz", + "integrity": "sha512-o1Va7bLwwk6h03+nSM8dpaGEYnoIG19P0lKqlic8Un36ymh9NSkNFX1yiXMKNMx8rJ0Kfnn2eovuFaL6Jvj0zA==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-dsv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.0.tgz", + "integrity": "sha512-o0/7RlMl9p5n6FQDptuJVMxDf/7EDEv2SYEO/CwdG2tr1hTfUVi0Iavkk2ax+VpaQ/1jVhpnj5rq1nj8vwhn2A==", + "dev": true + }, + "@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true + }, + "@types/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-toZJNOwrOIqz7Oh6Q7l2zkaNfXkfR7mFSJvGvlD/Ciq/+SQ39d5gynHJZ/0fjt83ec3WL7+u3ssqIijQtBISsw==", + "dev": true, + "requires": { + "@types/d3-dsv": "*" + } + }, + "@types/d3-force": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.1.tgz", + "integrity": "sha512-fY9fXELktloC4MospE1AMYk67p7zxbW1K79rdzZJ6oB2pddltiTelE9bz6YnZf9GboHhe9k0gwVjP7bOc7wjvg==", + "dev": true + }, + "@types/d3-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.0.tgz", + "integrity": "sha512-bbaJJs3Aye+C44aVbWW7qEgWNJQMtFNGsKq2L0OzjID2ewEUwb0Au8WF+b5PUrPkAqRKmtm4znYJadrYJMivYQ==", + "dev": true + }, + "@types/d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-EFXzqJH7VFbnx6LJ3PBSYNCrxrjl6tFplmnJ9J4k7ICvL3QXSxG6APfKGe0A29sYkk7UV08avGkmfd/EqS5WbA==", + "dev": true, + "requires": { + "@types/geojson": "*" + } + }, + "@types/d3-hierarchy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.0.1.tgz", + "integrity": "sha512-bXAS5udAD5RXfM/FsWMP9ggCl9cWXH0417Mwpw6ytSDP+Oez+XP0SLFPG5oPQc3m7ZToKg3/b4UW8hC/F6Qddw==", + "dev": true + }, + "@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dev": true, + "requires": { + "@types/d3-color": "*" + } + }, + "@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true + }, + "@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true + }, + "@types/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-U+OiWUxoH2jFsznlQHLgP48dUgkvtkFpjqW9Y9w8W9z3lo1OyQC1gdbKDfH1CxRUOWMY9fSYEYWc2ErNieyVew==", + "dev": true + }, + "@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true + }, + "@types/d3-scale": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.1.tgz", + "integrity": "sha512-GDuXcRcR6mKcpUVMhPNttpOzHi2dP6YcDqLZYSZHgwTZ+sfCa8e9q0VEBwZomblAPNMYpVqxojnSyIEb4s/Pwg==", + "dev": true, + "requires": { + "@types/d3-time": "*" + } + }, + "@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true + }, + "@types/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-SZsDWFG1dLV9ivX2wGDPFWgLUf71tF4aupfEMTYMrbArHwEMLhmv3TS1CZECLQgoTttdpM1g5Z6JwRP7zoInWg==", + "dev": true + }, + "@types/d3-shape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.0.0.tgz", + "integrity": "sha512-c1Wu/JwJJHSeY/M26pzNfuaybLCcTOkn1xxxVH7riuYObpvI8SfyDD30F8mqG+NHZuZTeIdKj4lej1USZ0V5vQ==", + "dev": true, + "requires": { + "@types/d3-path": "*" + } + }, + "@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "dev": true + }, + "@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "dev": true + }, + "@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true + }, + "@types/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-Sv4qEI9uq3bnZwlOANvYK853zvpdKEm1yz9rcc8ZTsxvRklcs9Fx4YFuGA3gXoQN/c/1T6QkVNjhaRO/cWj94g==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-zoom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.1.tgz", + "integrity": "sha512-7s5L9TjfqIYQmQQEUcpMAcBOahem7TRoSO/+Gkz02GbMVuULiZzjF2BOdw291dbO2aNon4m2OdFsRGaCq2caLQ==", + "dev": true, + "requires": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "@types/dot-object": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/dot-object/-/dot-object-2.1.2.tgz", + "integrity": "sha512-mARrpJofLNe6yhlukeBcznBe8ssZo5ZJ/CJWc3JKmG9L9151s0OHK+mealnkqSgO6cSn1219vND2wgL67Cuqiw==", + "dev": true + }, + "@types/eslint": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", + "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "@types/file-saver": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.3.tgz", + "integrity": "sha512-MBIou8pd/41jkff7s97B47bc9+p0BszqqDJsO51yDm49uUxeKzrfuNl5fSLC6BpLEWKA8zlwyqALVmXrFwoBHQ==", + "dev": true + }, + "@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==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "requires": { + "@types/node": "*" + } + }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, + "@types/history": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/history/-/history-5.0.0.tgz", + "integrity": "sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==", + "dev": true, + "requires": { + "history": "*" + } + }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@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==" + }, + "@types/humanize-duration": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/@types/humanize-duration/-/humanize-duration-3.25.1.tgz", + "integrity": "sha512-WZU/4bb+lvzyDmZzjJtp++9mfKy6B3lH6gGISgkcz6SU8hMILKRM0vi08TxIsb0dQB4Gzo68MWLmctu6xqUi9g==", + "dev": true + }, + "@types/is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==" + }, + "@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==" + }, + "@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==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz", + "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/js-cookie": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", + "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + }, + "@types/lodash": { + "version": "4.14.170", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz", + "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==" + }, + "@types/lodash-es": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.4.tgz", + "integrity": "sha512-BBz79DCJbD2CVYZH67MBeHZRX++HF+5p8Mo5MzjZi64Wac39S3diedJYHZtScbRVf4DjZyN6LzA0SB0zy+HSSQ==", + "dev": true, + "requires": { + "@types/lodash": "*" + } + }, + "@types/marked": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.7.tgz", + "integrity": "sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==", + "dev": true + }, + "@types/md5": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.1.tgz", + "integrity": "sha512-OK3oe+ALIoPSo262lnhAYwpqFNXbiwH2a+0+Z5YBnkQEwWD8fk5+PIeRhYA48PzvX9I4SGNpWy+9bLj8qz92RQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "requires": { + "@types/unist": "*" + } + }, + "@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/node": { + "version": "12.20.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.15.tgz", + "integrity": "sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==" + }, + "@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "@types/node-sass": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@types/node-sass/-/node-sass-4.11.2.tgz", + "integrity": "sha512-pOFlTw/OtZda4e+yMjq6/QYuvY0RDMQ+mxXdWj7rfSyf18V8hS4SfgurO+MasAkQsv6Wt6edOGlwh5QqJml9gw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, + "@types/npmlog": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.4.tgz", + "integrity": "sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==" + }, + "@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==" + }, + "@types/parse5": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.2.tgz", + "integrity": "sha512-+hQX+WyJAOne7Fh3zF5CxPemILIbuhNcqHHodzK9caYOLnC8pD5efmPleRnw0z++LfKUC/sVNMwk0Gap+B0baA==" + }, + "@types/plotly.js": { + "version": "1.54.17", + "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-1.54.17.tgz", + "integrity": "sha512-2nk1jEDQ85Ix6SQsC7M7Otl5M8OoYwTl7V/x2ptyX373slUJAj+vQ3njYGy/h9p/rxTq7W0fn3JvXjuxXuA0Qg==", + "dev": true, + "requires": { + "@types/d3": "^3" + }, + "dependencies": { + "@types/d3": { + "version": "3.5.46", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.46.tgz", + "integrity": "sha512-jNHfiGd41+JUV43LTMzQNidyp4Hn0XfhoSmy8baE0d/N5pGYpD+yX03JacY/MH+smFxYOQGXlz4HxkRZOuRNOQ==", + "dev": true + } + } + }, + "@types/prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==" + }, + "@types/pretty-hrtime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz", + "integrity": "sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==" + }, + "@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==" + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/react": { + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.11.tgz", + "integrity": "sha512-yFRQbD+whVonItSk7ZzP/L+gPTJVBkL/7shLEF+i9GC/1cV3JmUxEQz6+9ylhUpWSDuqo1N9qEvqS6vTj4USUA==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + } + } + }, + "@types/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-1lBBxVSutE8CQM37Jq7KvJwuA94qaEEqsx+G0dnwzG6Sfwf6JGcNeFk5jjjhJli1q2naeMZm+D/dvT/zyX4QPw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-dom": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.8.tgz", + "integrity": "sha512-0ohAiJAx1DAUEcY9UopnfwCE9sSMDGnY/oXjWMax6g3RpzmTt2GMyMVAXcbn0mo8XAff0SbQJl2/SBU+hjSZ1A==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-plotly.js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@types/react-plotly.js/-/react-plotly.js-2.5.0.tgz", + "integrity": "sha512-bda7N/Y65d1x0FfwhgUXAugGeG9CRIxmkW/yBL8PVFUMvZGpfEnw4bXKjDozBYlOskVfxj6UQ9IKmZI6CZ7/QQ==", + "dev": true, + "requires": { + "@types/plotly.js": "*", + "@types/react": "*" + } + }, + "@types/react-redux": { + "version": "7.1.18", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.18.tgz", + "integrity": "sha512-9iwAsPyJ9DLTRH+OFeIrm9cAbIj1i2ANL3sKQFATqnPWRbg+jEFXyZOKHiQK/N86pNRXbb4HRxAxo0SIX1XwzQ==", + "requires": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "@types/react-router": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.15.tgz", + "integrity": "sha512-z3UlMG/x91SFEVmmvykk9FLTliDvfdIUky4k2rCfXWQ0NKbrP8o9BTCaCTPuYsB8gDkUnUmkcA2vYlm2DR+HAA==", + "dev": true, + "requires": { + "@types/history": "*", + "@types/react": "*" + } + }, + "@types/react-router-dom": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", + "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "dev": true, + "requires": { + "@types/history": "*", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "@types/react-test-renderer": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz", + "integrity": "sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-window": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.4.tgz", + "integrity": "sha512-rFJ0h1nYffFBNi6N80CFORAQNNr+440RtGCAmKyn81U99pXRoxS2goi/fkYnUJtk+LcvWCp8cmP16M8loJJsjw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "@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==" + }, + "@types/storybook__react": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@types/storybook__react/-/storybook__react-5.2.1.tgz", + "integrity": "sha512-p4QGO+VjEO3YxyWVHpPylNheA0JhStzoCg6RBTmdobrC0ZqLPEIIWu0pFkHlNkmGIiEKW2yDGFJooBe8M4Df0Q==", + "dev": true, + "requires": { + "@storybook/react": "*" + } + }, + "@types/styled-components": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.15.tgz", + "integrity": "sha512-4evch8BRI3AKgb0GAZ/sn+mSeB+Dq7meYtMi7J/0Mg98Dt1+r8fySOek7Sjw1W+Wskyjc93565o5xWAT/FdY0Q==", + "dev": true, + "requires": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", + "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==", + "dev": true + } + } + }, + "@types/tapable": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", + "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==" + }, + "@types/testing-library__jest-dom": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.0.tgz", + "integrity": "sha512-l2P2GO+hFF4Liye+fAajT1qBqvZOiL79YMpEvgGs1xTK7hECxBI8Wz4J7ntACJNiJ9r0vXQqYovroXRLPDja6A==", + "dev": true, + "requires": { + "@types/jest": "*" + } + }, + "@types/uglify-js": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", + "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "requires": { + "source-map": "^0.6.1" + } + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "@types/webpack": { + "version": "4.41.29", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz", + "integrity": "sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q==", + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "@types/webpack-env": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz", + "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==" + }, + "@types/webpack-sources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "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==" + } + } + }, + "@types/yargs": { + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.0.tgz", + "integrity": "sha512-KcF6p3zWhf1f8xO84tuBailV5cN92vhS+VT7UJsPzGBm9VnQqfI9AsiMUFUCYHTYPg1uCCo+HyiDnpDuvkAMfQ==", + "requires": { + "@typescript-eslint/experimental-utils": "4.28.0", + "@typescript-eslint/scope-manager": "4.28.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz", + "integrity": "sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==", + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/typescript-estree": "4.28.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.0.tgz", + "integrity": "sha512-7x4D22oPY8fDaOCvkuXtYYTQ6mTMmkivwEzS+7iml9F9VkHGbbZ3x4fHRwxAb5KeuSkLqfnYjs46tGx2Nour4A==", + "requires": { + "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/typescript-estree": "4.28.0", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz", + "integrity": "sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==", + "requires": { + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/visitor-keys": "4.28.0" + } + }, + "@typescript-eslint/types": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.0.tgz", + "integrity": "sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==" + }, + "@typescript-eslint/typescript-estree": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz", + "integrity": "sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==", + "requires": { + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/visitor-keys": "4.28.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz", + "integrity": "sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==", + "requires": { + "@typescript-eslint/types": "4.28.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@uiw/react-textarea-code-editor": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@uiw/react-textarea-code-editor/-/react-textarea-code-editor-1.4.14.tgz", + "integrity": "sha512-OCOyRY48JdA0SooXQWpEls2ZyFXyv+hR61SW4wLH+kdKnAeR72MSgehuU2R3k455+k8QLtsk0MVyctBJ8HLvVw==", + "requires": { + "@babel/runtime": "7.15.4", + "@mapbox/rehype-prism": "0.8.0", + "rehype": "12.0.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@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==" + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "abs-svg-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", + "integrity": "sha1-32Acjo0roQ1KdtYl4japo5wnI78=" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "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==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" + }, + "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==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "adjust-sourcemap-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "airbnb-js-shims": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz", + "integrity": "sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==", + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "array.prototype.flatmap": "^1.2.1", + "es5-shim": "^4.5.13", + "es6-shim": "^0.35.5", + "function.prototype.name": "^1.1.0", + "globalthis": "^1.0.0", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0 || ^1.0.0", + "object.getownpropertydescriptors": "^2.0.3", + "object.values": "^1.1.0", + "promise.allsettled": "^1.0.0", + "promise.prototype.finally": "^3.1.0", + "string.prototype.matchall": "^4.0.0 || ^3.0.1", + "string.prototype.padend": "^3.0.0", + "string.prototype.padstart": "^3.0.0", + "symbol.prototype.description": "^1.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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==" + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "almost-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", + "integrity": "sha1-+FHGMROHV5lCdqou++jfowZszN0=" + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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==" + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "ansi-to-html": { + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.15.tgz", + "integrity": "sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==", + "requires": { + "entities": "^2.0.0" + } + }, + "antd": { + "version": "4.24.8", + "resolved": "https://registry.npmjs.org/antd/-/antd-4.24.8.tgz", + "integrity": "sha512-wrNy2Hi27uM3948okG3n2GwzQKBFUn1Qn5mn2I/ALcR28rC6cTjHYOuA248Zl9ECzz3jo4TY2R0SIa+5GZ/zGA==", + "requires": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons": "^4.7.0", + "@ant-design/react-slick": "~0.29.1", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.4.0", + "classnames": "^2.2.6", + "copy-to-clipboard": "^3.2.0", + "lodash": "^4.17.21", + "moment": "^2.29.2", + "rc-cascader": "~3.7.0", + "rc-checkbox": "~2.3.0", + "rc-collapse": "~3.4.2", + "rc-dialog": "~9.0.2", + "rc-drawer": "~6.1.0", + "rc-dropdown": "~4.0.0", + "rc-field-form": "~1.27.0", + "rc-image": "~5.13.0", + "rc-input": "~0.1.4", + "rc-input-number": "~7.3.9", + "rc-mentions": "~1.13.1", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.1", + "rc-notification": "~4.6.0", + "rc-pagination": "~3.2.0", + "rc-picker": "~2.7.0", + "rc-progress": "~3.4.1", + "rc-rate": "~2.9.0", + "rc-resize-observer": "^1.2.0", + "rc-segmented": "~2.1.0", + "rc-select": "~14.1.13", + "rc-slider": "~10.0.0", + "rc-steps": "~5.0.0-alpha.2", + "rc-switch": "~3.2.0", + "rc-table": "~7.26.0", + "rc-tabs": "~12.5.6", + "rc-textarea": "~0.4.5", + "rc-tooltip": "~5.2.0", + "rc-tree": "~5.7.0", + "rc-tree-select": "~5.5.0", + "rc-trigger": "^5.2.10", + "rc-upload": "~4.3.0", + "rc-util": "^5.22.5", + "scroll-into-view-if-needed": "^2.2.25" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-root-dir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", + "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "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" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-hidden": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.2.tgz", + "integrity": "sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "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==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-bounds": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", + "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "array-normalize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", + "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", + "requires": { + "array-bounds": "^1.0.0" + } + }, + "array-range": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", + "integrity": "sha1-9W5GWRhDYRxqVvd+8C7afFAIm/w=" + }, + "array-rearrange": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz", + "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==" + }, + "array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, + "array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + } + }, + "array.prototype.map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", + "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "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" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "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=" + }, + "ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "requires": { + "tslib": "^2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "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==" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "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==" + }, + "async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "atob-lite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=" + }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "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 + }, + "axe-core": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.3.tgz", + "integrity": "sha512-pXnVMfJKSIWU2Ml4JHP7pZEPIrgBO1Fd3WGx+fPBsS+KRGhE4vxooD8XBGWbQOIVSZsVK7pUDBBkCicNu80yzQ==" + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "requires": { + "babylon": "^6.18.0" + } + }, + "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==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "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==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "babel-plugin-add-react-displayname": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz", + "integrity": "sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==" + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "dependencies": { + "@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==" + } + } + }, + "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==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "dependencies": { + "@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==" + } + } + }, + "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==", + "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==", + "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-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "requires": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + } + } + }, + "babel-plugin-named-asset-import": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", + "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, + "babel-plugin-react-docgen": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz", + "integrity": "sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==", + "requires": { + "ast-types": "^0.14.2", + "lodash": "^4.17.15", + "react-docgen": "^5.0.0" + } + }, + "babel-plugin-styled-components": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.3.tgz", + "integrity": "sha512-meGStRGv+VuKA/q0/jXxrPNWEm4LPfYIqxooDTdmh8kFsP/Ph7jJG5rUPwUPX3QHUvggwdbgdGpo88P/rRYsVw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-module-imports": "^7.15.4", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "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==", + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-preset-react-app": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", + "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", + "requires": { + "@babel/core": "7.12.3", + "@babel/plugin-proposal-class-properties": "7.12.1", + "@babel/plugin-proposal-decorators": "7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", + "@babel/plugin-proposal-numeric-separator": "7.12.1", + "@babel/plugin-proposal-optional-chaining": "7.12.1", + "@babel/plugin-transform-flow-strip-types": "7.12.1", + "@babel/plugin-transform-react-display-name": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.12.1", + "@babel/preset-typescript": "7.12.1", + "@babel/runtime": "7.12.1", + "babel-plugin-macros": "2.8.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + }, + "dependencies": { + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "requires": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" + } + }, + "@babel/preset-react": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", + "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.1", + "@babel/plugin-transform-react-jsx-development": "^7.12.1", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + } + }, + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "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=", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "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" + } + }, + "better-opn": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", + "integrity": "sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==", + "requires": { + "open": "^7.0.3" + } + }, + "bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "requires": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "optional": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "binary-search-bounds": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bit-twiddle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", + "integrity": "sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4=" + }, + "bitmap-sdf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz", + "integrity": "sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg==", + "requires": { + "clamp": "^1.0.1" + } + }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "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==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "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=" + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==", + "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=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "bplist-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", + "integrity": "sha512-2AEM0FXy8ZxVLBuqX0hqt1gDwcnz2zygEkQ6zaD5Wko/sB9paUNwlpawrFtKeHUAQUOzjVy9AO4oeonqIHKA9Q==", + "optional": true, + "requires": { + "big-integer": "^1.6.7" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "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==" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "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" + } + }, + "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==" + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "dependencies": { + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + } + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "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==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "c8": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", + "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "cacache": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "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" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "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==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001434", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", + "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==" + }, + "canvas-fit": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", + "integrity": "sha1-rhO+Zq3kL1vg5IfjRfzjCl5bXl8=", + "requires": { + "element-size": "^1.1.1" + } + }, + "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==", + "requires": { + "rsvp": "^4.8.4" + } + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==" + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + }, + "check-types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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==" + }, + "clamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", + "integrity": "sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ=" + }, + "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==", + "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=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "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==", + "requires": { + "source-map": "~0.6.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "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==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==", + "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=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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 + }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + }, + "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==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "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==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + }, + "dependencies": { + "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==", + "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=" + } + } + }, + "color-alpha": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", + "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==", + "requires": { + "color-parse": "^1.3.8" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", + "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", + "requires": { + "clamp": "^1.0.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==" + }, + "color-normalize": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz", + "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==", + "requires": { + "clamp": "^1.0.1", + "color-rgba": "^2.1.1", + "dtype": "^2.0.0" + } + }, + "color-parse": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.3.8.tgz", + "integrity": "sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA==", + "requires": { + "color-name": "^1.0.0", + "defined": "^1.0.0", + "is-plain-obj": "^1.1.0" + } + }, + "color-rgba": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.1.1.tgz", + "integrity": "sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==", + "requires": { + "clamp": "^1.0.1", + "color-parse": "^1.3.8", + "color-space": "^1.14.6" + } + }, + "color-space": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.16.0.tgz", + "integrity": "sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==", + "requires": { + "hsluv": "^0.0.3", + "mumath": "^3.3.4" + } + }, + "color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "comlink": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.3.1.tgz", + "integrity": "sha512-+YbhUdNrpBZggBAHWcgQMLPLH1KDF3wJpeqrCKieWQ8RL7atmgsgTQko1XEBK6PsecfopWNntopJ+ByYG1lRaA==" + }, + "comlink-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/comlink-loader/-/comlink-loader-2.0.0.tgz", + "integrity": "sha512-106/k0JSssSCo2QO4ucbgbyWsb2zAEOSXFAVH2A+EO8kOz3n2BkvmkToxsoo+SWKUIKy8qubhAOLCS5mpFUvHw==", + "dev": true, + "requires": { + "comlink": "^4.2.0", + "loader-utils": "^1.1.0", + "slash": "^3.0.0", + "worker-loader": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + } + } + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "comment-json": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-2.4.2.tgz", + "integrity": "sha512-T+iXox779qsqneMYx/x5BZyz4xjCeQRmuNVzz8tko7qZUs3MlzpA3RAs+O1XsgcKToNBMIvfVzafGOeiU7RggA==", + "requires": { + "core-util-is": "^1.0.2", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + } + }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "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==" + }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "requires": { + "arity-n": "^1.0.4" + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "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==", + "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==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "compute-dims": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/compute-dims/-/compute-dims-1.1.0.tgz", + "integrity": "sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg==", + "requires": { + "utils-copy": "^1.0.0", + "validate.io-array": "^1.0.6", + "validate.io-matrix-like": "^1.0.2", + "validate.io-ndarray-like": "^1.0.0", + "validate.io-positive-integer": "^1.0.0" + } + }, + "compute-scroll-into-view": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", + "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "requires": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" + }, + "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==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "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=" + }, + "const-max-uint32": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/const-max-uint32/-/const-max-uint32-1.0.2.tgz", + "integrity": "sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY=" + }, + "const-pinf-float64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz", + "integrity": "sha1-9u+w15+cCYbT558pI6v5twtj1yY=" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-to-clipboard": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, + "core-js": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.0.tgz", + "integrity": "sha512-GUbtPllXMYRzIgHNZ4dTYTcUemls2cni83Q4Q/TrFONHfhcg9oEGOtaGHfb0cpzec60P96UKPvMkjX1jET8rUw==" + }, + "core-js-compat": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.0.tgz", + "integrity": "sha512-8X6lWsG+s7IfOKzV93a7fRYfWRZobOfjw5V5rrq43Vh/W+V6qYxl7Akalsvgab4PFT/4L/pjQbdBUEM36NXKrw==", + "requires": { + "browserslist": "^4.16.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "core-js-pure": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", + "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==" + }, + "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=" + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "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" + } + }, + "country-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", + "integrity": "sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY=" + }, + "cp-file": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz", + "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==", + "requires": { + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "nested-error-stacks": "^2.0.0", + "p-event": "^4.1.0" + }, + "dependencies": { + "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==", + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "cpy": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/cpy/-/cpy-8.1.2.tgz", + "integrity": "sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==", + "requires": { + "arrify": "^2.0.1", + "cp-file": "^7.0.0", + "globby": "^9.2.0", + "has-glob": "^1.0.0", + "junk": "^3.1.0", + "nested-error-stacks": "^2.1.0", + "p-all": "^2.1.0", + "p-filter": "^2.1.0", + "p-map": "^3.0.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "requires": { + "path-type": "^3.0.0" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "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": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + } + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "requires": { + "tiny-invariant": "^1.0.6" + } + }, + "css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=" + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-font": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", + "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==", + "requires": { + "css-font-size-keywords": "^1.0.0", + "css-font-stretch-keywords": "^1.0.1", + "css-font-style-keywords": "^1.0.1", + "css-font-weight-keywords": "^1.0.0", + "css-global-keywords": "^1.0.1", + "css-system-font-keywords": "^1.0.0", + "pick-by-alias": "^1.2.0", + "string-split-by": "^1.0.0", + "unquote": "^1.1.0" + } + }, + "css-font-size-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", + "integrity": "sha1-hUh1rOmspqjS7g00WkSq6btttss=" + }, + "css-font-stretch-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", + "integrity": "sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA=" + }, + "css-font-style-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", + "integrity": "sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ=" + }, + "css-font-weight-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", + "integrity": "sha1-m8BGcayFvHJLV07106yWsNYE/Zc=" + }, + "css-global-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", + "integrity": "sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk=" + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "css-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "requires": { + "camelcase": "^6.0.0", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "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==" + }, + "css-system-font-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", + "integrity": "sha1-hcbwhquk6zLFcaMIav/ENLhII+0=" + }, + "css-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "requires": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "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==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + } + }, + "css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "requires": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^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==" + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=", + "dev": true + }, + "csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs=" + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssfontparser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", + "integrity": "sha1-9AIvyPlwDGgCnVQghK+69CWj8+M=", + "dev": true + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "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==" + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "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==" + } + } + }, + "csstype": { + "version": "2.6.17", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", + "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "optional": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "d3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.0.0.tgz", + "integrity": "sha512-t+jEKGO2jQiSBLJYYq6RFc500tsCeXBB4x41oQaSnZD3Som95nQrlw9XJGrFTMUOQOkwSMauWy9+8Tz1qm9UZw==", + "requires": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + } + }, + "d3-array": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.0.1.tgz", + "integrity": "sha512-l3Bh5o8RSoC3SBm5ix6ogaFW+J6rOUm42yOtZ2sQPCEvCqUMepeX7zgrlLLGIemxgOyo9s2CsWEidnLv5PwwRw==", + "requires": { + "internmap": "1 - 2" + } + }, + "d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" + }, + "d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + } + }, + "d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "requires": { + "d3-path": "1 - 3" + } + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==" + }, + "d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "requires": { + "delaunator": "5" + } + }, + "d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" + }, + "d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + } + }, + "d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "requires": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" + }, + "d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "requires": { + "d3-dsv": "1 - 3" + } + }, + "d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-hdL7+HBIohpgfolhBxr1KX47VMD6+vVD/oEFrxk5yhmzV2prk99EkFKYpXuhVkFpTgHdJ6/4bYcjdLPPXV4tIA==" + }, + "d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", + "requires": { + "d3-array": "2.5.0 - 3" + } + }, + "d3-geo-projection": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz", + "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==", + "requires": { + "commander": "2", + "d3-array": "1", + "d3-geo": "^1.12.0", + "resolve": "^1.1.10" + }, + "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-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.0.1.tgz", + "integrity": "sha512-RlLTaofEoOrMK1JoXYIGhKTkJFI/6rFrYPgxy6QlZo2BcVc4HGTqEU0rPpzuMq5T/5XcMtAzv1XiLA3zRTfygw==" + }, + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "1 - 3" + } + }, + "d3-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==" + }, + "d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" + }, + "d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" + }, + "d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" + }, + "d3-scale": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.0.tgz", + "integrity": "sha512-foHQYKpWQcyndH1CGoHdUC4PECxTxonzwwBXGT8qu+Drb1FIc6ON6dG2P5f4hRRMkLiIKeWK7iFtdznDUrnuPQ==", + "requires": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + } + }, + "d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "requires": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + } + }, + "d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + }, + "d3-shape": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.0.1.tgz", + "integrity": "sha512-HNZNEQoDhuCrDWEc/BMbF/hKtzMZVoe64TvisFLDp2Iyj0UShB/E6/lBsLlJTfBMbYgftHj90cXJ0SEitlE6Xw==", + "requires": { + "d3-path": "1 - 3" + } + }, + "d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-nzaCwlj+ZVBIlFuVOT1RmU+6xb/7D5IcnhHzHQcBgS/aTa5K9fWZNN5LCXA27LgF5WxoSNJqKBbLcGMtM6Ca6A==", + "requires": { + "d3-time": "1 - 3" + } + }, + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" + }, + "d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "requires": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + } + }, + "damerau-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" + }, + "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==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + }, + "dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "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==" + }, + "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=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "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==", + "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==" + }, + "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=" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-browser-id": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-1.0.4.tgz", + "integrity": "sha512-qPy925qewwul9Hifs+3sx1ZYn14obHxpkX+mPD369w4Rzg+YkJBgi3SOvwUq81nWSjqGUegIgEPwD8u+HUnxlw==", + "optional": true, + "requires": { + "bplist-parser": "^0.1.0", + "meow": "^3.1.0", + "untildify": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "optional": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "optional": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "optional": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "optional": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "optional": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "optional": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "optional": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "optional": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "optional": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "optional": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "optional": 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==", + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "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==", + "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" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "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=", + "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=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "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=" + }, + "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" + } + } + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "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" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "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=" + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "requires": { + "robust-predicates": "^3.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "requires": { + "repeat-string": "^1.5.4" + } + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" + }, + "detect-kerning": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz", + "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==" + }, + "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==" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "detect-package-manager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", + "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", + "requires": { + "execa": "^5.1.1" + } + }, + "detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "requires": { + "address": "^1.0.1", + "debug": "4" + } + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "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==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "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=" + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "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=", + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-accessibility-api": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", + "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", + "dev": true + }, + "dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + } + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "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==" + } + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "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==" + } + } + }, + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "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==" + } + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "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==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "dot-object": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-2.1.4.tgz", + "integrity": "sha512-7FXnyyCLFawNYJ+NhkqyP9Wd2yzuo+7n9pGiYpkmXCTYa8Ci2U0eUNDVg5OuO5Pm6aFXI2SWN8/N/w7SJWu1WA==", + "requires": { + "commander": "^4.0.0", + "glob": "^7.1.5" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + } + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + }, + "dependencies": { + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + } + } + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "draw-svg-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", + "integrity": "sha1-bxFtli3TFLmepTTW9Y3WbNvWk3k=", + "requires": { + "abs-svg-path": "~0.1.1", + "normalize-svg-path": "~0.1.0" + } + }, + "dtype": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", + "integrity": "sha1-zQUjI84GFETs0uj1dI9popvihDQ=" + }, + "dup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", + "integrity": "sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk=" + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "earcut": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.3.tgz", + "integrity": "sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug==" + }, + "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" + } + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.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==" + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + }, + "element-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", + "integrity": "sha1-ZOXxWdlxIWMYRby67K8nnDm1404=" + }, + "elementary-circuits-directed-graph": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz", + "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==", + "requires": { + "strongly-connected-components": "^1.0.1" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==" + }, + "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==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "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==", + "requires": { + "once": "^1.4.0" + } + }, + "endent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", + "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", + "requires": { + "dedent": "^0.7.0", + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.5" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "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==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "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==" + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "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==", + "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==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es5-shim": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.7.tgz", + "integrity": "sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==" + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-shim": { + "version": "0.35.6", + "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.6.tgz", + "integrity": "sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==" + }, + "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==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "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=" + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "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" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==", + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true + }, + "eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "requires": { + "confusing-browser-globals": "^1.0.10" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", + "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "requires": { + "debug": "^3.2.7", + "find-up": "^2.1.0", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.7.2.tgz", + "integrity": "sha512-7Oq/N0+3nijBnYWQYzz/Mp/7ZCpwxYvClRyW/PLAmimY9uLCBvoXsNsERcJdkKceyOjgRbFhhxs058KTrne9Mg==", + "requires": { + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz", + "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==", + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.0", + "has": "^1.0.3", + "is-core-module": "^2.7.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "dependencies": { + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-jest": { + "version": "24.3.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz", + "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==", + "requires": { + "@typescript-eslint/experimental-utils": "^4.0.1" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "requires": { + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + }, + "dependencies": { + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + } + } + }, + "eslint-plugin-prettier": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==" + }, + "eslint-plugin-testing-library": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", + "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", + "requires": { + "@typescript-eslint/experimental-utils": "^3.10.1" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==" + }, + "@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "requires": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "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==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "eslint-webpack-plugin": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", + "requires": { + "@types/eslint": "^7.2.6", + "arrify": "^2.0.1", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "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==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "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==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "estree-to-babel": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/estree-to-babel/-/estree-to-babel-3.2.1.tgz", + "integrity": "sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==", + "requires": { + "@babel/traverse": "^7.1.6", + "@babel/types": "^7.2.0", + "c8": "^7.6.0" + } + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "eventsource": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", + "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "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" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "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==", + "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=", + "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=", + "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=" + } + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "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" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "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=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "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=" + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "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==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "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=", + "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=", + "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==", + "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==", + "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==", + "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 + }, + "falafel": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz", + "integrity": "sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==", + "requires": { + "acorn": "^7.1.1", + "foreach": "^2.0.5", + "isarray": "^2.0.1", + "object-keys": "^1.0.6" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "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==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-isnumeric": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz", + "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==", + "requires": { + "is-string-blank": "^1.0.1" + } + }, + "fast-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==" + }, + "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==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "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==", + "requires": { + "bser": "2.1.1" + } + }, + "fetch-retry": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.3.tgz", + "integrity": "sha512-uJQyMrX5IJZkhoEUBQ3EjxkeiZkppBd5jS/fMTJmfZxLSiaQjv2zD0kTvuvkSH89uFvgSlB6ueGpjD3HWN7Bxw==" + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "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==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "file-system-cache": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.1.0.tgz", + "integrity": "sha512-IzF5MBq+5CR0jXx5RxPe4BICl/oEhBSXKaL9fLhAXrIfIUS77Hr4vzrYyqYMHN6uTt+BOqi3fDCTjjEBCjERKw==", + "requires": { + "fs-extra": "^10.1.0", + "ramda": "^0.28.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" + }, + "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==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "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==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + }, + "flatten-vertex-data": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", + "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", + "requires": { + "dtype": "^2.0.0" + } + }, + "flip-pixels": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flip-pixels/-/flip-pixels-1.0.2.tgz", + "integrity": "sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "focus-lock": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.8.1.tgz", + "integrity": "sha512-/LFZOIo82WDsyyv7h7oc0MJF9ACOvDRdx9rWPZ2pgMfNWu/z8hQDBtOchuB/0BVLmuFOZjV02YwUVzNsWx/EzA==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + }, + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" + }, + "font-atlas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz", + "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==", + "requires": { + "css-font": "^1.0.0" + } + }, + "font-measure": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", + "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", + "requires": { + "css-font": "^1.2.0" + } + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==", + "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=" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.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=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formik": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", + "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==", + "requires": { + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "react-fast-compare": "^2.0.1", + "tiny-warning": "^1.0.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" + } + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "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=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "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" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "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", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "fuzzy-search": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/fuzzy-search/-/fuzzy-search-3.2.1.tgz", + "integrity": "sha512-vAcPiyomt1ioKAsAL2uxSABHJ4Ju/e4UeDM+g1OlR0vV4YhLGMNsdLNvZTpEDY4JCSt0E4hASCNM5t2ETtsbyg==" + }, + "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": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "gemoji": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-6.1.0.tgz", + "integrity": "sha512-MOlX3doQ1fsfzxQX8Y+u6bC5Ssc1pBUBIPVyrS69EzKt+5LIZAOm0G5XGVNhwXFgkBF3r+Yk88ONyrFHo8iNFA==" + }, + "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==" + }, + "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==" + }, + "get-canvas-context": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", + "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "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==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "devOptional": 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==" + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "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" + } + }, + "git-config-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", + "integrity": "sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ=", + "requires": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "homedir-polyfill": "^1.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "git-username": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/git-username/-/git-username-1.0.0.tgz", + "integrity": "sha512-xm45KwBR6Eu1jO4umx/o2M84v9TC7tdOBuzLx8ayhdR9H1FBiiG9azz31uC0esDvaWVBTDINpJ5USomk+ja8OQ==", + "requires": { + "parse-github-url": "^1.0.2", + "remote-origin-url": "^1.0.0" + } + }, + "github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "dev": true + }, + "gl-mat4": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", + "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" + }, + "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==" + }, + "gl-text": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.3.1.tgz", + "integrity": "sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w==", + "requires": { + "bit-twiddle": "^1.0.2", + "color-normalize": "^1.5.0", + "css-font": "^1.2.0", + "detect-kerning": "^2.1.2", + "es6-weak-map": "^2.0.3", + "flatten-vertex-data": "^1.0.2", + "font-atlas": "^2.1.0", + "font-measure": "^1.2.2", + "gl-util": "^3.1.2", + "is-plain-obj": "^1.1.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "parse-unit": "^1.0.1", + "pick-by-alias": "^1.2.0", + "regl": "^2.0.0", + "to-px": "^1.0.1", + "typedarray-pool": "^1.1.0" + } + }, + "gl-util": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz", + "integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==", + "requires": { + "is-browser": "^2.0.1", + "is-firefox": "^1.0.3", + "is-plain-obj": "^1.1.0", + "number-is-integer": "^1.0.1", + "object-assign": "^4.1.0", + "pick-by-alias": "^1.2.0", + "weak-map": "^1.0.5" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-promise": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", + "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "requires": { + "@types/glob": "*" + } + }, + "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==" + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "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", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "globule": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", + "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "glsl-inject-defines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", + "integrity": "sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q=", + "requires": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha1-iUvvc5ENeSyBtRQxgANdCnivdtM=", + "requires": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + }, + "dependencies": { + "resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha1-3ZV5gufnNt699TtYpN2RdUV13UY=" + }, + "xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=" + } + } + }, + "glsl-token-assignments": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8=" + }, + "glsl-token-defines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha1-y4kqqVmTYjFyhHDU90AySJaX+p0=", + "requires": { + "glsl-tokenizer": "^2.0.0" + } + }, + "glsl-token-depth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha1-I8XjDuK9JViEtKKLyFC495HpXYQ=" + }, + "glsl-token-descope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY=", + "requires": { + "glsl-token-assignments": "^2.0.0", + "glsl-token-depth": "^1.1.0", + "glsl-token-properties": "^1.0.0", + "glsl-token-scope": "^1.1.0" + } + }, + "glsl-token-inject-block": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", + "integrity": "sha1-4QFfWYDBCRgkraomJfHf3ovQADQ=" + }, + "glsl-token-properties": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4=" + }, + "glsl-token-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", + "integrity": "sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E=" + }, + "glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha1-WUQdL4V958NEnJRWZgIezjWOSOw=" + }, + "glsl-token-whitespace-trim": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", + "integrity": "sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA=" + }, + "glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "requires": { + "through2": "^0.6.3" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glslify": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", + "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", + "requires": { + "bl": "^2.2.1", + "concat-stream": "^1.5.2", + "duplexify": "^3.4.5", + "falafel": "^2.1.0", + "from2": "^2.3.0", + "glsl-resolve": "0.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glslify-bundle": "^5.0.0", + "glslify-deps": "^1.2.5", + "minimist": "^1.2.5", + "resolve": "^1.1.5", + "stack-trace": "0.0.9", + "static-eval": "^2.0.5", + "through2": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "requires": { + "glsl-inject-defines": "^1.0.1", + "glsl-token-defines": "^1.0.0", + "glsl-token-depth": "^1.1.1", + "glsl-token-descope": "^1.0.2", + "glsl-token-scope": "^1.1.1", + "glsl-token-string": "^1.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glsl-tokenizer": "^2.0.2", + "murmurhash-js": "^1.0.0", + "shallow-copy": "0.0.1" + } + }, + "glslify-deps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "requires": { + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "^2.0.0", + "graceful-fs": "^4.1.2", + "inherits": "^2.0.1", + "map-limit": "0.0.1", + "resolve": "^1.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.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==", + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "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=", + "optional": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "gzipper": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gzipper/-/gzipper-5.0.1.tgz", + "integrity": "sha512-dGrx0KGY3pycpw1ecbQN35zA0SfJERJjwO2rN8F3zgtbNXdlgB1DlbUl4BnmyRrIjioN2g1o91lIDpMzXb95JQ==", + "dev": true, + "requires": { + "commander": "^7.2.0", + "deep-equal": "^2.0.5", + "uuid": "^8.3.2" + }, + "dependencies": { + "deep-equal": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", + "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "es-get-iterator": "^1.1.1", + "get-intrinsic": "^1.0.1", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.1.1", + "isarray": "^2.0.5", + "object-is": "^1.1.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.3", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": 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==" + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, + "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" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "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=" + } + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", + "integrity": "sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g==", + "requires": { + "is-glob": "^3.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "has-hover": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", + "integrity": "sha1-PZdDeusZnGK4rAisvcU9O8UsF/c=", + "requires": { + "is-browser": "^2.0.1" + } + }, + "has-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==" + }, + "has-passive-events": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", + "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", + "requires": { + "is-browser": "^2.0.1" + } + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "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=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "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" + } + }, + "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==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "requires": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "dependencies": { + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + } + } + }, + "hast-util-from-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz", + "integrity": "sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==", + "requires": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "dependencies": { + "comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==" + }, + "hast-util-parse-selector": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz", + "integrity": "sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==", + "requires": { + "@types/hast": "^2.0.0" + } + }, + "hastscript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.0.2.tgz", + "integrity": "sha512-uA8ooUY4ipaBvKcMuPehTAB/YfFLSSzCwFSwT6ltJbocFUKH/GDHLN+tflq7lSRf9H86uOuxOFkh1KgIy3Gg2g==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + } + }, + "property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==" + }, + "space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==" + } + } + }, + "hast-util-is-element": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.1.tgz", + "integrity": "sha512-ag0fiZfRWsPiR1udvnSbaazJLGv8qd8E+/e3rW8rUZhbKG4HNJmFL4QkEceN+22BgE+uozXY30z/s+2dL6Z++g==", + "requires": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + } + }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + }, + "hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "dependencies": { + "@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "requires": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + } + }, + "html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + } + } + }, + "hast-util-to-html": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.3.tgz", + "integrity": "sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A==", + "requires": { + "@types/hast": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.2", + "unist-util-is": "^5.0.0" + }, + "dependencies": { + "comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==" + }, + "property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==" + }, + "space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==" + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==" + } + } + }, + "hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "requires": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "dependencies": { + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + } + } + }, + "hast-util-to-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz", + "integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==" + }, + "hast-util-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", + "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==" + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "highcharts": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-9.3.2.tgz", + "integrity": "sha512-I/48gNMvs3hZxZnPRUqLbnlrGZJJ7YPPVr1+fYeZ35p4pSZAOwTmAGbptrjBr7JlF52HmJH9zMbt/I4TPLu9Pg==" + }, + "highcharts-react-official": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/highcharts-react-official/-/highcharts-react-official-3.1.0.tgz", + "integrity": "sha512-CkWJHrVMOc6CT8KFu1dR+a0w5OxCVKKgZUNWtEi5TmR0xqBDIDe+RyM652MAN/jBYppxMo6TCUVlRObCyWAn0Q==" + }, + "history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "requires": { + "@babel/runtime": "^7.7.6" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "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==" + } + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, + "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==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "hsluv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", + "integrity": "sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw=" + }, + "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==", + "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==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "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==", + "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": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + } + } + }, + "html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==" + }, + "html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==" + }, + "html-webpack-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "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==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "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==", + "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==" + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + } + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "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==", + "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=" + } + } + }, + "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==" + }, + "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==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "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==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "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" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "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==" + }, + "humanize-duration": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.27.0.tgz", + "integrity": "sha512-qLo/08cNc3Tb0uD7jK0jAcU5cnqCM0n568918E7R2XhMr/+7F37p4EY062W/stg7tmzvknNn9b/1+UhVRzsYrQ==" + }, + "husky": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", + "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "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": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "requires": { + "postcss": "^7.0.14" + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + }, + "image-palette": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/image-palette/-/image-palette-2.1.0.tgz", + "integrity": "sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ==", + "requires": { + "color-id": "^1.1.0", + "pxls": "^2.0.0", + "quantize": "^1.0.2" + } + }, + "immer": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz", + "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "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==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "dependencies": { + "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==", + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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==" + }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "internmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.1.tgz", + "integrity": "sha512-Ujwccrj9FkGqjbY3iVoxD1VV+KdZZeENx0rphrtzmRXbFvkFO88L80BL/zeSIguX/7T+y8k04xqtgWgS5vxwxw==" + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "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==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^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=" + }, + "is-base64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-base64/-/is-base64-0.1.0.tgz", + "integrity": "sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg==" + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-blob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz", + "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==" + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", + "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "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==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-dom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.1.0.tgz", + "integrity": "sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ==", + "dev": true, + "requires": { + "is-object": "^1.0.1", + "is-window": "^1.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=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-firefox": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", + "integrity": "sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI=" + }, + "is-float-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-float-array/-/is-float-array-1.0.0.tgz", + "integrity": "sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "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==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "is-iexplorer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", + "integrity": "sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY=" + }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "dependencies": { + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "^1.0.1" + } + } + } + }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" + }, + "is-mobile": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.2.tgz", + "integrity": "sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg==" + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "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==" + }, + "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==", + "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==", + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "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==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-scoped": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-2.1.0.tgz", + "integrity": "sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==", + "requires": { + "scoped-regex": "^2.0.0" + } + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.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==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-string-blank": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", + "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==" + }, + "is-svg-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz", + "integrity": "sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA=" + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-url-superb": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-3.0.0.tgz", + "integrity": "sha512-3faQP+wHCGDQT1qReM5zCPx2mxoal6DzbzquFlCYJLWyy4WPTved33ea2xFbX37z4NoriEwZGIYhFtx8RUB5wQ==", + "requires": { + "url-regex": "^5.0.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "optional": true + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "dev": true + }, + "is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" + }, + "is-window": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-window/-/is-window-1.0.2.tgz", + "integrity": "sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg==", + "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==" + }, + "is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "requires": { + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" + }, + "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==", + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "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==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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==", + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "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==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==" + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, + "jest": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "requires": { + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.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==", + "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" + } + }, + "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==", + "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==", + "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==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "jest-canvas-mock": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.3.1.tgz", + "integrity": "sha512-5FnSZPrX3Q2ZfsbYNE3wqKR3+XorN8qFzDzB5o0golWgt6EOX1+emBnpOc9IAQ+NXFj8Nzm3h7ZdE/9H0ylBcg==", + "dev": true, + "requires": { + "cssfontparser": "^1.2.1", + "moo-color": "^1.0.2" + } + }, + "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==", + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "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==", + "requires": { + "pump": "^3.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==" + } + } + }, + "jest-circus": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", + "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "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" + } + } + } + }, + "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==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "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==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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==", + "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==", + "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-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==" + }, + "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==", + "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" + } + }, + "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==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "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==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "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==" + }, + "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==" + }, + "jest-resolve": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", + "requires": { + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "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==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "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" + } + } + } + }, + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "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": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "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==", + "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" + } + }, + "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==" + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "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" + } + } + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "jest-watch-typeahead": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", + "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", + "requires": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^26.0.0", + "jest-watcher": "^26.3.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "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": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==" + }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "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.6.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", + "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "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.5.0", + "ws": "^7.4.5", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz", + "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==" + } + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "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 + }, + "json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "requires": { + "string-convert": "^0.2.0" + } + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "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" + } + }, + "jss": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.7.1.tgz", + "integrity": "sha512-5QN8JSVZR6cxpZNeGfzIjqPEP+ZJwJJfZbXmeABNdxiExyO+eJJDy6WDtqTf8SDKnbL5kZllEpAP71E/Lt7PXg==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + } + } + }, + "jss-plugin-camel-case": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.7.1.tgz", + "integrity": "sha512-+ioIyWvmAfgDCWXsQcW1NMnLBvRinOVFkSYJUgewQ6TynOcSj5F1bSU23B7z0p1iqK0PPHIU62xY1iNJD33WGA==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.7.1" + } + }, + "jss-plugin-default-unit": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.7.1.tgz", + "integrity": "sha512-tW+dfYVNARBQb/ONzBwd8uyImigyzMiAEDai+AbH5rcHg5h3TtqhAkxx06iuZiT/dZUiFdSKlbe3q9jZGAPIwA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "jss-plugin-global": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.7.1.tgz", + "integrity": "sha512-FbxCnu44IkK/bw8X3CwZKmcAnJqjAb9LujlAc/aP0bMSdVa3/MugKQRyeQSu00uGL44feJJDoeXXiHOakBr/Zw==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "jss-plugin-nested": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.7.1.tgz", + "integrity": "sha512-RNbICk7FlYKaJyv9tkMl7s6FFfeLA3ubNIFKvPqaWtADK0KUaPsPXVYBkAu4x1ItgsWx67xvReMrkcKA0jSXfA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.7.1.tgz", + "integrity": "sha512-eyd5FhA+J0QrpqXxO7YNF/HMSXXl4pB0EmUdY4vSJI4QG22F59vQ6AHtP6fSwhmBdQ98Qd9gjfO+RMxcE39P1A==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.7.1.tgz", + "integrity": "sha512-fGAAImlbaHD3fXAHI3ooX6aRESOl5iBt3LjpVjxs9II5u9tzam7pqFUmgTcrip9VpRqYHn8J3gA7kCtm8xKwHg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-template": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-template/-/jss-plugin-template-10.7.1.tgz", + "integrity": "sha512-FHQdbo5Yf13XOm9k7A+iJyUisY5yj6LGuLHOt3VR3yWRt6x/AzJ3q/znRKSNqZBaDFpNdxjIFZNAFFaVDd2cjQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.7.1.tgz", + "integrity": "sha512-1UHFmBn7hZNsHXTkLLOL8abRl8vi+D1EVzWD4WmLFj55vawHZfnH1oEz6TUf5Y61XHv0smdHabdXds6BgOXe3A==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.7.1" + } + }, + "jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "requires": { + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" + } + }, + "junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==" + }, + "kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "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==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==" + }, + "language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-universal-dotenv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz", + "integrity": "sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==", + "requires": { + "@babel/runtime": "^7.5.0", + "app-root-dir": "^1.0.2", + "core-js": "^3.0.4", + "dotenv": "^8.0.0", + "dotenv-expand": "^5.1.0" + } + }, + "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==" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "libnpx": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/libnpx/-/libnpx-10.2.4.tgz", + "integrity": "sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA==", + "requires": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^14.2.3" + }, + "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==" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "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==", + "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=" + }, + "dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "requires": { + "ci-info": "^1.5.0" + } + }, + "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=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "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==", + "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=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "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==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "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" + } + }, + "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==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.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": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", + "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "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=" + }, + "linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "lint-staged": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", + "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", + "dev": true, + "requires": { + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "listify": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/listify/-/listify-1.0.3.tgz", + "integrity": "sha512-083swF7iH7bx8666zdzBColpgEuy46HjN3r1isD4zV6Ix7FuHfb/2/WVnl4CH8hjuoWeFF7P5KkKNXUnJCFEJg==" + }, + "listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "optional": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "optional": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "optional": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "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==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "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==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.findindex": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", + "integrity": "sha512-9er6Ccz6sEST3bHFtUrCFWk14nE8cdL/RoW1RRDV1BxqN3qsmsT56L14jhfctAqhVPVcdJw4MRxEaVoAK+JVvw==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=" + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.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" + } + } + } + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" + }, + "loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha1-akAhj9x64V/HbD0PPmdsRlOIYD4=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + }, + "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-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.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" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=" + }, + "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" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "optional": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.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==", + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", + "dev": true + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "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=" + }, + "map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha1-63lhAxwPDo0AG/LVb6toXViCLzg=", + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1" + } + } + } + }, + "map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", + "dev": true + }, + "map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "mapbox-gl": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.10.1.tgz", + "integrity": "sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg==", + "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.0.0", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.1" + } + }, + "markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" + }, + "markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "requires": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + } + } + }, + "markdown-it-container": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-3.0.0.tgz", + "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==" + }, + "markdown-it-emoji": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz", + "integrity": "sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ==" + }, + "marked": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", + "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==" + }, + "material-icons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-0.1.0.tgz", + "integrity": "sha512-xDTXrjrt03EiA+LL3nHttQs3DTGft/mV+JHSiVhQyl0Nk8SEwnNqB/fyu6REAz9mYoYCdr4vnhQzkTsGbx0BPg==" + }, + "material-ui-audio-player": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/material-ui-audio-player/-/material-ui-audio-player-1.7.1.tgz", + "integrity": "sha512-5MGudB9K82Txm6cRoRaXS2AypPS3/kJvwPW5B+Gll8T6WIT6wPkX/NYpoOupasxuJKXXcSR+vNmCLh06QWdHbA==", + "requires": { + "classnames": "^2.2.6" + } + }, + "math-log2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", + "integrity": "sha1-+4lBvl9evol55xjmJzsXjlhpRWU=" + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "requires": { + "unist-util-remove": "^2.0.0" + } + }, + "mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", + "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", + "dev": true + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memfs": { + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", + "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "requires": { + "map-or-similar": "^1.5.0" + } + }, + "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=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.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" + } + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "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==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "middleearth-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/middleearth-names/-/middleearth-names-1.1.0.tgz", + "integrity": "sha1-wdXuSN77NoEo+66/686IR80Y3f8=", + "requires": { + "unique-random-array": "1.0.0" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "requires": { + "mime-db": "1.48.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "requires": { + "dom-walk": "^0.1.0" + } + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + }, + "mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "requires": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + } + }, + "mini-css-extract-plugin": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", + "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "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==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "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==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.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==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "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" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "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" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "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==", + "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==", + "requires": { + "minimist": "^1.2.5" + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "monaco-editor": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", + "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==" + }, + "moo-color": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.2.tgz", + "integrity": "sha512-5iXz5n9LWQzx/C2WesGFfpE6RLamzdHwsn3KpfzShwbfIqs7stnoEpaNErf/7+3mbxwZ4s8Foq7I0tPxw7BWHg==", + "dev": true, + "requires": { + "color-name": "^1.1.4" + } + }, + "mouse-change": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", + "integrity": "sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8=", + "requires": { + "mouse-event": "^1.0.0" + } + }, + "mouse-event": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", + "integrity": "sha1-s3ie23EJmX1aky0dAdqhVDpQFzI=" + }, + "mouse-event-offset": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", + "integrity": "sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ=" + }, + "mouse-wheel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", + "integrity": "sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w=", + "requires": { + "right-now": "^1.0.0", + "signum": "^1.0.0", + "to-px": "^1.0.1" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "mrm": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/mrm/-/mrm-3.0.10.tgz", + "integrity": "sha512-aRByZsPXMM8W0NHNH9afkKyk5OW4bB5pYNRIN+8iSVfpMAzqeMejmj/yIYcdFNJTksXmdPMfTaucm2NYdh4xIw==", + "requires": { + "git-username": "^1.0.0", + "glob": "^7.1.6", + "inquirer": "^7.0.4", + "is-directory": "^0.3.1", + "kleur": "^3.0.3", + "libnpx": "^10.2.4", + "listify": "^1.0.0", + "lodash": "^4.17.15", + "longest": "^2.0.1", + "middleearth-names": "^1.1.0", + "minimist": "^1.2.0", + "mrm-core": "^6.1.7", + "semver-utils": "^1.1.4", + "update-notifier": "^4.1.0", + "user-home": "^2.0.0", + "user-meta": "^1.0.0", + "which": "^2.0.2" + } + }, + "mrm-core": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/mrm-core/-/mrm-core-6.1.7.tgz", + "integrity": "sha512-jLGWrkupcgGIsLerrI/xmM/dFHbaoehRsuVbgYBrxYKXNMRBHN3Mgkd8cw+/ZCCoiZEXF8/SaZol0GCp6oBQ9g==", + "requires": { + "babel-code-frame": "^6.26.0", + "comment-json": "^2.2.0", + "detect-indent": "^6.0.0", + "editorconfig": "^0.15.3", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "kleur": "^3.0.3", + "listify": "^1.0.0", + "lodash": "^4.17.15", + "minimist": "^1.2.0", + "prop-ini": "^0.0.2", + "rc": "^1.2.8", + "readme-badger": "^0.3.0", + "semver": "^6.3.0", + "smpltmpl": "^1.0.2", + "split-lines": "^2.0.0", + "strip-bom": "^4.0.0", + "validate-npm-package-name": "^3.0.0", + "webpack-merge": "^4.2.2", + "yaml": "^2.0.0-1" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "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==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "yaml": { + "version": "2.0.0-9", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-9.tgz", + "integrity": "sha512-Bf2KowHjyVkIIiGMt7+fbhmlvKOaE8DWuD07bnL4+FQ9sPmEl/5IzGpBpoxPqOaHuyasBjJhyXDcISpJWfhCGw==" + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "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=" + }, + "mumath": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/mumath/-/mumath-3.3.4.tgz", + "integrity": "sha1-SNSg8P2MrU57Mglu6JsWGmPTC78=", + "requires": { + "almost-equal": "^1.1.0" + } + }, + "murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "devOptional": true + }, + "nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "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" + } + }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" + }, + "native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", + "requires": { + "querystring": "^0.2.0" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "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==" + }, + "nested-error-stacks": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "requires": { + "minimatch": "^3.0.2" + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "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" + } + }, + "node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" + }, + "node-sass": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tgz", + "integrity": "sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "meow": "^9.0.0", + "nan": "^2.13.2", + "node-gyp": "^7.1.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "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-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.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" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "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==", + "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==" + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-svg-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", + "integrity": "sha1-RWNg5g7Odfvve11+FgSA5//Rb+U=" + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-name": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/npm-name/-/npm-name-5.5.0.tgz", + "integrity": "sha512-l7/uyVfEi2e3ho+ovaJZC0xlbwzXNUz3RxkxpfcnLuoGKAuYoo9YoJ/uy18PsTD8IziugGHks4t/mGmBJEZ4Qg==", + "requires": { + "got": "^9.6.0", + "is-scoped": "^2.1.0", + "is-url-superb": "^3.0.0", + "lodash.zip": "^4.2.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.1.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "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==", + "requires": { + "path-key": "^3.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==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-integer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz", + "integrity": "sha1-5ZvKFy/+0nMY55x862y3LAlbIVI=", + "requires": { + "is-finite": "^1.0.1" + } + }, + "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==" + }, + "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=", + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "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==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + } + }, + "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==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "objectorarray": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", + "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==" + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "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==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "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==", + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "orderedmap": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.5.tgz", + "integrity": "sha512-/fzlCGKRmfayGoI9UUXvJfc2nMZlJHW30QqEvwPvlg8tsX7jyiUSomYie6mYqx7Z9bOMGoag0H/q1PS/0PjYkg==" + }, + "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==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "outline-icons": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/outline-icons/-/outline-icons-1.42.0.tgz", + "integrity": "sha512-px2wNGrzTDCU0pxUO2pKs5dgE3fdz3bQ3lpLA9CgzBpkcadpOQgRxxxyBQ12fyOXyKC0L4evAJeomoAtvMWISQ==" + }, + "p-all": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-all/-/p-all-2.1.0.tgz", + "integrity": "sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==", + "requires": { + "p-map": "^2.0.0" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + } + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==" + }, + "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==", + "requires": { + "p-timeout": "^3.1.0" + } + }, + "p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "requires": { + "p-map": "^2.0.0" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + } + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "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==", + "requires": { + "retry": "^0.12.0" + } + }, + "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==", + "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", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "^1.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" + } + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parenthesis": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz", + "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==" + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-git-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz", + "integrity": "sha1-06mYQxcTL1c5hxK7pDjhKVkN34w=", + "requires": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "git-config-path": "^1.0.1", + "ini": "^1.3.4" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==" + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "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-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "parse-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", + "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", + "requires": { + "pick-by-alias": "^1.2.0" + } + }, + "parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha1-en7A0esG+lMlx9PgCbhZoJtdSes=" + }, + "parse-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", + "integrity": "sha1-fhu21b7zh0wo45JSaiVBFwKR7s8=" + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "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==" + }, + "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=" + }, + "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=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "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" + } + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pick-by-alias": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", + "integrity": "sha1-X3yysfIabh6ISgyHhVqko3NhEHs=" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" + }, + "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==", + "requires": { + "find-up": "^3.0.0" + }, + "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==", + "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==", + "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==", + "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=" + } + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "plotly.js": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.8.0.tgz", + "integrity": "sha512-bYuLdTlQEWMs/u3nNqV/jwERj9tw8qMDKBV8NBP1BucfapLoYIM9w4ARc3W9m93r6OYvP5I6ykUztiDmDcvA9Q==", + "requires": { + "@plotly/d3": "3.8.0", + "@plotly/d3-sankey": "0.7.2", + "@plotly/d3-sankey-circular": "0.33.1", + "@turf/area": "^6.4.0", + "@turf/bbox": "^6.4.0", + "@turf/centroid": "^6.0.2", + "canvas-fit": "^1.5.0", + "color-alpha": "1.0.4", + "color-normalize": "1.5.0", + "color-parse": "1.3.8", + "color-rgba": "2.1.1", + "country-regex": "^1.1.0", + "d3-force": "^1.2.1", + "d3-format": "^1.4.5", + "d3-geo": "^1.12.1", + "d3-geo-projection": "^2.9.0", + "d3-hierarchy": "^1.1.9", + "d3-interpolate": "^1.4.0", + "d3-time": "^1.1.0", + "d3-time-format": "^2.2.3", + "fast-isnumeric": "^1.1.4", + "gl-mat4": "^1.2.0", + "gl-text": "^1.3.1", + "glslify": "^7.1.1", + "has-hover": "^1.0.1", + "has-passive-events": "^1.0.0", + "is-mobile": "^2.2.2", + "mapbox-gl": "1.10.1", + "mouse-change": "^1.4.0", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.2.0", + "native-promise-only": "^0.8.1", + "parse-svg-path": "^0.1.2", + "polybooljs": "^1.2.0", + "probe-image-size": "^7.2.2", + "regl": "^2.1.0", + "regl-error2d": "^2.0.12", + "regl-line2d": "^3.1.2", + "regl-scatter2d": "^3.2.8", + "regl-splom": "^1.0.14", + "strongly-connected-components": "^1.0.1", + "superscript-text": "^1.0.0", + "svg-path-sdf": "^1.1.3", + "tinycolor2": "^1.4.2", + "to-px": "1.0.1", + "topojson-client": "^3.1.0", + "webgl-context": "^2.2.0", + "world-calendars": "^1.0.3" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "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-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "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==" + } + } + }, + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "polished": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", + "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.17.8" + } + }, + "polybooljs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.0.tgz", + "integrity": "sha1-tDkMLgedTCYtOyUExiiNlbp6R1g=" + }, + "popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "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==", + "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=" + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "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==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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==", + "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=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "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==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-browser-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", + "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", + "requires": { + "postcss": "^7" + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-flexbugs-fixes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", + "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", + "requires": { + "postcss": "^7.0.26" + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "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==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "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==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-normalize": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", + "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", + "requires": { + "@csstools/normalize.css": "^10.1.0", + "browserslist": "^4.6.2", + "postcss": "^7.0.17", + "postcss-browser-comments": "^3.0.0", + "sanitize.css": "^10.0.0" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-safe-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", + "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", + "requires": { + "postcss": "^8.1.0" + }, + "dependencies": { + "postcss": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + } + } + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "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==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "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==" + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "dev": true + }, + "prettier-eslint": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-12.0.0.tgz", + "integrity": "sha512-N8SGGQwAosISXTNl1E57sBbtnqUGlyRWjcfIUxyD3HF4ynehA9GZ8IfJgiep/OfYvCof/JEpy9ZqSl250Wia7A==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "^3.0.0", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^7.9.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^2.0.0", + "pretty-format": "^23.0.1", + "require-relative": "^0.8.7", + "typescript": "^3.9.3", + "vue-eslint-parser": "~7.1.0" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", + "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "3.10.1", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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" + } + }, + "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 + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true + } + } + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "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==", + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==" + }, + "prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, + "probe-image-size": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.2.tgz", + "integrity": "sha512-QUm+w1S9WTsT5GZB830u0BHExrUmF0J4fyRm5kbLUMEP3fl9UVYXc3xOBVqZNnH9tnvVEJO8vDk3PMtsLqjxug==", + "requires": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "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==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "progress-bar-webpack-plugin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-2.1.0.tgz", + "integrity": "sha512-UtlZbnxpYk1wufEWfhIjRn2U52zlY38uvnzFhs8rRxJxC1hSqw88JNR2Mbpqq9Kix8L1nGb3uQ+/1BiUWbigAg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "progress": "^2.0.3" + } + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "requires": { + "asap": "~2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "promise.allsettled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", + "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", + "requires": { + "array.prototype.map": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "iterate-value": "^1.0.2" + } + }, + "promise.prototype.finally": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.4.tgz", + "integrity": "sha512-nNc3YbgMfLzqtqvO/q5DP6RR0SiHI9pUPGzyDf1q+usTwCN2kjvAnJkBb7bHe3o+fFSBPpsGMoYtaSi+LTNqng==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-ini": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/prop-ini/-/prop-ini-0.0.2.tgz", + "integrity": "sha1-ZzOny1JCrKsr5C5gdYPYEksXKls=", + "requires": { + "extend": "^3.0.0" + } + }, + "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" + }, + "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==" + } + } + }, + "property-expr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz", + "integrity": "sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==" + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "prosemirror-commands": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.2.2.tgz", + "integrity": "sha512-TX+KpWudMon06frryfpO/u7hsQv2hu8L4VSVbCpi3/7wXHBgl+35mV85qfa3RpT8xD2f3MdeoTqH0vy5JdbXPg==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-dropcursor": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.4.0.tgz", + "integrity": "sha512-6+YwTjmqDwlA/Dm+5wK67ezgqgjA/MhSDgaNxKUzH97SmeuWFXyLeDRxxOPZeSo7yTxcDGUCWTEjmQZsVBuMrQ==", + "requires": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "prosemirror-gapcursor": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.2.2.tgz", + "integrity": "sha512-7YzuRBbu9W7HGQde84kCHfIjaRLNcAdeijbgqrm/R9dsdTWkV+rrdcmic/sCc+bptiNpvjCEE+R6hrbT8zFQeQ==", + "requires": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "prosemirror-history": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.2.0.tgz", + "integrity": "sha512-B9v9xtf4fYbKxQwIr+3wtTDNLDZcmMMmGiI3TAPShnUzvo+Rmv1GiUrsQChY1meetHl7rhML2cppF3FTs7f7UQ==", + "requires": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "rope-sequence": "^1.3.0" + } + }, + "prosemirror-inputrules": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.1.3.tgz", + "integrity": "sha512-ZaHCLyBtvbyIHv0f5p6boQTIJjlD6o2NPZiEaZWT2DA+j591zS29QQEMT4lBqwcLW3qRSf7ZvoKNbf05YrsStw==", + "requires": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-keymap": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.1.5.tgz", + "integrity": "sha512-8SZgPH3K+GLsHL2wKuwBD9rxhsbnVBTwpHCO4VUO5GmqUQlxd/2GtBVWTsyLq4Dp3N9nGgPd3+lZFKUDuVp+Vw==", + "requires": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "prosemirror-markdown": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.8.0.tgz", + "integrity": "sha512-RxGyM8dqdmlkYpM3PY/C5JBputv2xeKLNRqFpN04TtFlR9McN9Tmpf8DaP6HblfaZ8RofdUtQW+ghdArjANLvQ==", + "requires": { + "markdown-it": "^12.0.0", + "prosemirror-model": "^1.0.0" + } + }, + "prosemirror-model": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.16.1.tgz", + "integrity": "sha512-r1/w0HDU40TtkXp0DyKBnFPYwd8FSlUSJmGCGFv4DeynfeSlyQF2FD0RQbVEMOe6P3PpUSXM6LZBV7W/YNZ4mA==", + "requires": { + "orderedmap": "^1.1.0" + } + }, + "prosemirror-schema-list": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.1.6.tgz", + "integrity": "sha512-aFGEdaCWmJzouZ8DwedmvSsL50JpRkqhQ6tcpThwJONVVmCgI36LJHtoQ4VGZbusMavaBhXXr33zyD2IVsTlkw==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-state": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.4.tgz", + "integrity": "sha512-Xkkrpd1y/TQ6HKzN3agsQIGRcLckUMA9u3j207L04mt8ToRgpGeyhbVv0HI7omDORIBHjR29b7AwlATFFf2GLA==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-tables": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.1.1.tgz", + "integrity": "sha512-LmCz4jrlqQZRsYRDzCRYf/pQ5CUcSOyqZlAj5kv67ZWBH1SVLP2U9WJEvQfimWgeRlIz0y0PQVqO1arRm1+woA==", + "requires": { + "prosemirror-keymap": "^1.1.2", + "prosemirror-model": "^1.8.1", + "prosemirror-state": "^1.3.1", + "prosemirror-transform": "^1.2.1", + "prosemirror-view": "^1.13.3" + } + }, + "prosemirror-transform": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.4.2.tgz", + "integrity": "sha512-bcIsf3uRZhfab0xRfyyxOEh6eqSszq/hJbDbmUumFnbHBoWhB/uXbpz6vvUxfk0XiEvrZDJ+5pXRrNDc1Hu3vQ==", + "requires": { + "prosemirror-model": "^1.0.0" + } + }, + "prosemirror-utils": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/prosemirror-utils/-/prosemirror-utils-0.9.6.tgz", + "integrity": "sha512-UC+j9hQQ1POYfMc5p7UFxBTptRiGPR7Kkmbl3jVvU8VgQbkI89tR/GK+3QYC8n+VvBZrtAoCrJItNhWSxX3slA==" + }, + "prosemirror-view": { + "version": "1.23.12", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.23.12.tgz", + "integrity": "sha512-uvw9ZVz5dNDD9w1bzHkU2r4NWFlpFz85v9rCD8NAhQBau6LYhwM/crjry+C4JgeR8gy6pMXS5eJ1zhNLcK4ctQ==", + "requires": { + "prosemirror-model": "^1.16.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "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=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "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==" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "pxls": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/pxls/-/pxls-2.3.2.tgz", + "integrity": "sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw==", + "requires": { + "arr-flatten": "^1.1.0", + "compute-dims": "^1.1.0", + "flip-pixels": "^1.0.2", + "is-browser": "^2.1.0", + "is-buffer": "^2.0.3", + "to-uint8": "^1.4.1" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + } + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "quantize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz", + "integrity": "sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4=" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, + "ramda": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz", + "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "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==" + }, + "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==", + "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==" + } + } + }, + "raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "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=" + } + } + }, + "rc-align": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", + "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-cascader": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.7.0.tgz", + "integrity": "sha512-SFtGpwmYN7RaWEAGTS4Rkc62ZV/qmQGg/tajr/7mfIkleuu8ro9Hlk6J+aA0x1YS4zlaZBtTcSaXM01QMiEV/A==", + "requires": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.6.1" + } + }, + "rc-checkbox": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz", + "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + } + }, + "rc-collapse": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.4.2.tgz", + "integrity": "sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.2.1", + "shallowequal": "^1.1.0" + } + }, + "rc-dialog": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.2.tgz", + "integrity": "sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==", + "requires": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + } + }, + "rc-drawer": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.1.4.tgz", + "integrity": "sha512-tuRk2Hzecczt4zSH09ZQkAPzvi28HxvTgsTJtqUHgPPezhE+UBypyNls1hLVehD8fpFbsA12flophT2rKT/W8Q==", + "requires": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-6", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.21.2" + } + }, + "rc-dropdown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", + "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-trigger": "^5.3.1", + "rc-util": "^5.17.0" + } + }, + "rc-field-form": { + "version": "1.27.4", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.27.4.tgz", + "integrity": "sha512-PQColQnZimGKArnOh8V2907+VzDCXcqtFvHgevDLtqWc/P7YASb/FqntSmdS8q3VND5SHX3Y1vgMIzY22/f/0Q==", + "requires": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.8.0" + } + }, + "rc-image": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.13.0.tgz", + "integrity": "sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==", + "requires": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.0.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.0.6" + } + }, + "rc-input": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.1.4.tgz", + "integrity": "sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + } + }, + "rc-input-number": { + "version": "7.3.11", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.3.11.tgz", + "integrity": "sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.23.0" + } + }, + "rc-mentions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.13.1.tgz", + "integrity": "sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-menu": "~9.8.0", + "rc-textarea": "^0.4.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.22.5" + } + }, + "rc-menu": { + "version": "9.8.2", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.2.tgz", + "integrity": "sha512-EahOJVjLuEnJsThoPN+mGnVm431RzVzDLZWHRS/YnXTQULa7OsgdJa/Y7qXxc3Z5sz8mgT6xYtgpmBXLxrZFaQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.8", + "rc-trigger": "^5.1.2", + "rc-util": "^5.27.0" + } + }, + "rc-motion": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.3.tgz", + "integrity": "sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + } + }, + "rc-notification": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.6.1.tgz", + "integrity": "sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.2.0", + "rc-util": "^5.20.1" + } + }, + "rc-overflow": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.8.tgz", + "integrity": "sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.19.2" + } + }, + "rc-pagination": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz", + "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + } + }, + "rc-picker": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.7.0.tgz", + "integrity": "sha512-oZH6FZ3j4iuBxHB4NvQ6ABRsS2If/Kpty1YFFsji7/aej6ruGmfM7WnJWQ88AoPfpJ++ya5z+nVEA8yCRYGKyw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "date-fns": "2.x", + "dayjs": "1.x", + "moment": "^2.24.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.4.0", + "shallowequal": "^1.1.0" + } + }, + "rc-progress": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.1.tgz", + "integrity": "sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + } + }, + "rc-rate": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.2.tgz", + "integrity": "sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + } + }, + "rc-resize-observer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz", + "integrity": "sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==", + "requires": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.27.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-segmented": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.1.2.tgz", + "integrity": "sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + } + }, + "rc-select": { + "version": "14.1.16", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.1.16.tgz", + "integrity": "sha512-71XLHleuZmufpdV2vis5oituRkhg2WNvLpVMJBGWRar6WGAVOHXaY9DR5HvwWry3EGTn19BqnL6Xbybje6f8YA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.2.0" + } + }, + "rc-slider": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.0.1.tgz", + "integrity": "sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.18.1", + "shallowequal": "^1.1.0" + } + }, + "rc-steps": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-5.0.0.tgz", + "integrity": "sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==", + "requires": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + } + }, + "rc-switch": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz", + "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.0.1" + } + }, + "rc-table": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.26.0.tgz", + "integrity": "sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.22.5", + "shallowequal": "^1.1.0" + } + }, + "rc-tabs": { + "version": "12.5.10", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.5.10.tgz", + "integrity": "sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.0.0", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.16.0" + } + }, + "rc-textarea": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.4.7.tgz", + "integrity": "sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.24.4", + "shallowequal": "^1.1.0" + } + }, + "rc-tooltip": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.2.2.tgz", + "integrity": "sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.3.1", + "rc-trigger": "^5.0.0" + } + }, + "rc-tree": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.3.tgz", + "integrity": "sha512-Oql2S9+ZmT+mfTp5SNo1XM0QvkENjc0mPRFsHWRFSPuKird0OYMZZKmLznUJ+0aGDeFFWN42wiUZJtMFhrLgLw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.4.8" + } + }, + "rc-tree-select": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.5.5.tgz", + "integrity": "sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.16.1" + } + }, + "rc-trigger": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz", + "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.19.2" + } + }, + "rc-upload": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz", + "integrity": "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + } + }, + "rc-util": { + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.29.2.tgz", + "integrity": "sha512-xHT9Dr3RD6tyvCibnH10l3mudC6TJjWNr9UDy3CrOGZqTY354OfdwP87ahKNe0b3A1dsysDldvx0SBuswhlOeA==", + "requires": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + }, + "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==" + } + } + }, + "rc-virtual-list": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.4.13.tgz", + "integrity": "sha512-cPOVDmcNM7rH6ANotanMDilW/55XnFPw0Jh/GQYtrzZSy3AmWvCnqVNyNC/pgg3lfVmX2994dlzAhuUrd4jG7w==", + "requires": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.15.0" + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-accessible-dropdown-menu-hook": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-accessible-dropdown-menu-hook/-/react-accessible-dropdown-menu-hook-3.1.0.tgz", + "integrity": "sha512-XOvct2l9Q1V5u29gdGHZhBYh3hUX3+syIwWC/uqBmmzJDttFMZKPug+Ut/oAsXTCeGn3+HcT1iqzLAFRtVrrJg==" + }, + "react-app-polyfill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", + "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", + "requires": { + "core-js": "^3.6.5", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "whatwg-fetch": "^3.4.1" + } + }, + "react-app-rewired": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.1.8.tgz", + "integrity": "sha512-wjXPdKPLscA7mn0I1de1NHrbfWdXz4S1ladaGgHVKdn1hTgKK5N6EdGIJM0KrS6bKnJBj7WuqJroDTsPKKr66Q==", + "dev": true, + "requires": { + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "react-beautiful-dnd": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz", + "integrity": "sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA==", + "requires": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + } + }, + "react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "requires": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "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==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "requires": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "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=" + } + } + }, + "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==", + "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=" + }, + "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==" + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "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==", + "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=" + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "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==", + "requires": { + "locate-path": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "react-docgen": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.3.tgz", + "integrity": "sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA==", + "requires": { + "@babel/core": "^7.7.5", + "@babel/generator": "^7.12.11", + "@babel/runtime": "^7.7.6", + "ast-types": "^0.14.2", + "commander": "^2.19.0", + "doctrine": "^3.0.0", + "estree-to-babel": "^3.1.0", + "neo-async": "^2.6.1", + "node-dir": "^0.1.10", + "strip-indent": "^3.0.0" + }, + "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==" + } + } + }, + "react-docgen-typescript": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", + "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==" + }, + "react-docgen-typescript-plugin": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2.tgz", + "integrity": "sha512-/8OKrPRDTAGDnOkumGvDWixfrNPrRWhEMGLZnJr1NiJtRwdvNRGqGA2J/SeSvWerawqSPxNyXK+EfERCir6mMw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "endent": "^2.0.1", + "find-cache-dir": "^3.3.1", + "flat-cache": "^3.0.4", + "micromatch": "^4.0.2", + "react-docgen-typescript": "^2.2.2", + "tslib": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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" + } + }, + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + } + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-element-to-jsx-string": { + "version": "14.3.4", + "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.4.tgz", + "integrity": "sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg==", + "requires": { + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "17.0.2" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + } + } + }, + "react-error-boundary": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", + "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + }, + "react-fast-compare": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", + "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" + }, + "react-inspector": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-5.1.1.tgz", + "integrity": "sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "is-dom": "^1.0.0", + "prop-types": "^15.0.0" + } + }, + "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==" + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-medium-image-zoom": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/react-medium-image-zoom/-/react-medium-image-zoom-3.1.3.tgz", + "integrity": "sha512-5CoU8whSCz5Xz2xNeGD34dDfZ6jaf/pybdfZh8HNUmA9mbXbLfj0n6bQWfEUwkq9lsNg1sEkyeIJq2tcvZY8bw==" + }, + "react-merge-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-1.1.0.tgz", + "integrity": "sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==", + "dev": true + }, + "react-plotly.js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.5.1.tgz", + "integrity": "sha512-Oya14whSHvPsYXdI0nHOGs1pZhMzV2edV7HAW1xFHD58Y73m/LbG2Encvyz1tztL0vfjph0JNhiwO8cGBJnlhg==", + "requires": { + "prop-types": "^15.7.2" + } + }, + "react-portal": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-4.2.2.tgz", + "integrity": "sha512-vS18idTmevQxyQpnde0Td6ZcUlv+pD8GTyR42n3CHUQq9OHi1C4jDE4ZWEbEsrbrLRhSECYiao58cvocwMtP7Q==", + "requires": { + "prop-types": "^15.5.8" + } + }, + "react-redux": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", + "integrity": "sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA==", + "requires": { + "@babel/runtime": "^7.12.1", + "@types/react-redux": "^7.1.16", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^16.13.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==" + } + } + }, + "react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" + }, + "react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "requires": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "requires": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "react-router": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.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-router-dom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + } + } + }, + "react-scripts": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", + "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", + "requires": { + "@babel/core": "7.12.3", + "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", + "@svgr/webpack": "5.5.0", + "@typescript-eslint/eslint-plugin": "^4.5.0", + "@typescript-eslint/parser": "^4.5.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^26.6.0", + "babel-loader": "8.1.0", + "babel-plugin-named-asset-import": "^0.3.7", + "babel-preset-react-app": "^10.0.0", + "bfj": "^7.0.2", + "camelcase": "^6.1.0", + "case-sensitive-paths-webpack-plugin": "2.3.0", + "css-loader": "4.3.0", + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0", + "eslint": "^7.11.0", + "eslint-config-react-app": "^6.0.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jest": "^24.1.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-testing-library": "^3.9.2", + "eslint-webpack-plugin": "^2.5.2", + "file-loader": "6.1.1", + "fs-extra": "^9.0.1", + "fsevents": "^2.1.3", + "html-webpack-plugin": "4.5.0", + "identity-obj-proxy": "3.0.0", + "jest": "26.6.0", + "jest-circus": "26.6.0", + "jest-resolve": "26.6.0", + "jest-watch-typeahead": "0.6.1", + "mini-css-extract-plugin": "0.11.3", + "optimize-css-assets-webpack-plugin": "5.0.4", + "pnp-webpack-plugin": "1.6.4", + "postcss-flexbugs-fixes": "4.2.1", + "postcss-loader": "3.0.0", + "postcss-normalize": "8.0.1", + "postcss-preset-env": "6.7.0", + "postcss-safe-parser": "5.0.2", + "prompts": "2.4.0", + "react-app-polyfill": "^2.0.0", + "react-dev-utils": "^11.0.3", + "react-refresh": "^0.8.3", + "resolve": "1.18.1", + "resolve-url-loader": "^3.1.2", + "sass-loader": "^10.0.5", + "semver": "7.3.2", + "style-loader": "1.3.0", + "terser-webpack-plugin": "4.2.3", + "ts-pnp": "1.2.0", + "url-loader": "4.1.1", + "webpack": "4.44.2", + "webpack-dev-server": "3.11.1", + "webpack-manifest-plugin": "2.2.0", + "workbox-webpack-plugin": "5.1.4" + }, + "dependencies": { + "sass-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "react-select": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.1.tgz", + "integrity": "sha512-u/brzm3B6vgI+PtxNyE4/18kXgaf6bn5sOAjKhaQ54EItBfW41SRLH1AJC5fefPnGM4JmMcM51t/HAVCi5GrpQ==", + "requires": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "dependencies": { + "@floating-ui/core": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.4.tgz", + "integrity": "sha512-SQOeVbMwb1di+mVWWJLpsUTToKfqVNioXys011beCAhyOIFtS+GQoW4EQSneuxzmQKddExDwQ+X0hLl4lJJaSQ==" + }, + "@floating-ui/dom": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.5.tgz", + "integrity": "sha512-+sAUfpQ3Frz+VCbPCqj+cZzvEESy3fjSeT/pDWkYCWOBXYNNKZfuVsHuv8/JO2zze8+Eb/Q7a6hZVgzS81fLbQ==", + "requires": { + "@floating-ui/core": "^1.2.4" + } + }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + } + } + }, + "react-split": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/react-split/-/react-split-2.0.14.tgz", + "integrity": "sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA==", + "requires": { + "prop-types": "^15.5.7", + "split.js": "^1.6.0" + } + }, + "react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "requires": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "react-virtualized": { + "version": "9.22.3", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz", + "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==", + "requires": { + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + } + }, + "react-virtualized-auto-sizer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.5.tgz", + "integrity": "sha512-kivjYVWX15TX2IUrm8F1jaCEX8EXrpy3DD+u41WGqJ1ZqbljWpiwscV+VxOM1l7sSIM1jwi2LADjhhAJkJ9dxA==" + }, + "react-virtualized-tree": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/react-virtualized-tree/-/react-virtualized-tree-3.4.1.tgz", + "integrity": "sha512-MolDiG9XgmflPPX9uPzf7iSWLqOHDlCZEiyA4FVYjv2pHfu6zV6/SIEFVyHdurWD80IjUuZ3Er12gq2bQQak2Q==", + "requires": { + "classnames": "^2.2.5", + "lodash": "^4.17.4", + "lodash.debounce": "^4.0.8", + "lodash.findindex": "^4.6.0", + "lodash.isequal": "^4.5.0", + "lodash.omit": "^4.5.0", + "material-icons": "^0.1.0", + "react-lifecycles-compat": "^3.0.4", + "reselect": "^3.0.1" + } + }, + "react-window": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", + "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "requires": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "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==" + } + } + }, + "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==", + "requires": { + "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==" + } + } + }, + "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==", + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "readme-badger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/readme-badger/-/readme-badger-0.3.0.tgz", + "integrity": "sha512-+sMOLSs1imZUISZ2Rhz7qqVd77QtpcAPbGeIraFdgJmijb04YtdlPjGNBvDChTNtLbeQ6JNGQy3pOgslWfaP3g==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "requires": { + "minimatch": "3.0.4" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "redux": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz", + "integrity": "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "refractor": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.5.0.tgz", + "integrity": "sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==", + "requires": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.25.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==" + }, + "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==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "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==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + }, + "regex-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regex-regex/-/regex-regex-1.0.0.tgz", + "integrity": "sha1-kEih6uuHD01IDavHb8Qs3MC8OnI=" + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "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" + } + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "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=" + } + } + }, + "regl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/regl/-/regl-2.1.0.tgz", + "integrity": "sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==" + }, + "regl-error2d": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz", + "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==", + "requires": { + "array-bounds": "^1.0.1", + "color-normalize": "^1.5.0", + "flatten-vertex-data": "^1.0.2", + "object-assign": "^4.1.1", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0", + "update-diff": "^1.1.0" + } + }, + "regl-line2d": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.2.tgz", + "integrity": "sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ==", + "requires": { + "array-bounds": "^1.0.1", + "array-find-index": "^1.0.2", + "array-normalize": "^1.1.4", + "color-normalize": "^1.5.0", + "earcut": "^2.1.5", + "es6-weak-map": "^2.0.3", + "flatten-vertex-data": "^1.0.2", + "glslify": "^7.0.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0" + } + }, + "regl-scatter2d": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.2.8.tgz", + "integrity": "sha512-bqrqJyeHkGBa9mEfuBnRd7FUtdtZ1l+gsM2C5Ugr1U3vJG5K3mdWdVWtOAllZ5FHHyWJV/vgjVvftgFUg6CDig==", + "requires": { + "@plotly/point-cluster": "^3.1.9", + "array-range": "^1.0.1", + "array-rearrange": "^2.2.2", + "clamp": "^1.0.1", + "color-id": "^1.1.0", + "color-normalize": "^1.5.0", + "color-rgba": "^2.1.1", + "flatten-vertex-data": "^1.0.2", + "glslify": "^7.0.0", + "image-palette": "^2.1.0", + "is-iexplorer": "^1.0.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0", + "update-diff": "^1.1.0" + } + }, + "regl-splom": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz", + "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==", + "requires": { + "array-bounds": "^1.0.1", + "array-range": "^1.0.1", + "color-alpha": "^1.0.4", + "flatten-vertex-data": "^1.0.2", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "raf": "^3.4.1", + "regl-scatter2d": "^3.2.3" + } + }, + "rehype": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.0.tgz", + "integrity": "sha512-gZcttmf9R5IYHb8AlI1rlmWqXS1yX0rSB/S5ZGJs8atfYZy2DobvH3Ic/gSzB+HL/+oOHPtBguw1TprfhxXBgQ==", + "requires": { + "@types/hast": "^2.0.0", + "rehype-parse": "^8.0.0", + "rehype-stringify": "^9.0.0", + "unified": "^10.0.0" + } + }, + "rehype-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.3.tgz", + "integrity": "sha512-RGw0CVt+0S6KdvpE8bbP2Db9WXclQcIX7A0ufM3QFqAhTo/ddJMQrrI2j3cijlRPZlGK8R3pRgC8U5HyV76IDw==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^6.0.0", + "unified": "^10.0.0" + } + }, + "rehype-stringify": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.2.tgz", + "integrity": "sha512-BuVA6lAEYtOpXO2xuHLohAzz8UNoQAxAqYRqh4QEEtU39Co+P1JBZhw6wXA9hMWp+JLcmrxWH8+UKcNSr443Fw==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remark-external-links": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz", + "integrity": "sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "is-absolute-url": "^3.0.0", + "mdast-util-definitions": "^4.0.0", + "space-separated-tokens": "^1.0.0", + "unist-util-visit": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" + }, + "remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "requires": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "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" + } + }, + "@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==" + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } + } + }, + "remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "requires": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" + }, + "vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + } + } + }, + "remark-slug": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", + "integrity": "sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==", + "dev": true, + "requires": { + "github-slugger": "^1.0.0", + "mdast-util-to-string": "^1.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "requires": { + "mdast-squeeze-paragraphs": "^4.0.0" + } + }, + "remote-origin-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-1.0.0.tgz", + "integrity": "sha512-xHDM6IBqivpiQ1e4WOuFpM/T6rbzA/WBsu+3WLtgPOhHyjA0nYlijV3NprlTb4FcXlQ5+Q+z174sQ1NnUF5FwA==", + "requires": { + "parse-git-config": "^1.1.1" + } + }, + "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=" + }, + "renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "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.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "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==" + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "requires": { + "boolbase": "^1.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=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "optional": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "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" + } + }, + "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": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "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==" + }, + "require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "reselect": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", + "integrity": "sha512-b/6tFZCmRhtBMa4xGqiiRp9jh9Aqi2A687Lo265cN0/QohJQEBPiQ52f4QB6i0eF3yp3hmLL21LSGBcML2dlxA==" + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "requires": { + "is-core-module": "^2.0.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==", + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "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==" + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "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=" + }, + "resolve-url-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", + "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", + "requires": { + "adjust-sourcemap-loader": "3.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.36", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "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==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + } + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.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==", + "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" + } + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "rich-markdown-editor": { + "version": "11.21.3", + "resolved": "https://registry.npmjs.org/rich-markdown-editor/-/rich-markdown-editor-11.21.3.tgz", + "integrity": "sha512-XqVDfwDiGMVVtb+HUY35FQvfo97ECAe+Pgo1veFiYiL5f9Jfp9zuF6fOK5eze9h8rApBsgD9iVHEsA8/gyv5Jg==", + "requires": { + "copy-to-clipboard": "^3.0.8", + "fuzzy-search": "^3.2.1", + "gemoji": "6.x", + "lodash": "^4.17.11", + "markdown-it": "^12.2.0", + "markdown-it-container": "^3.0.0", + "markdown-it-emoji": "^2.0.0", + "outline-icons": "^1.38.1", + "prosemirror-commands": "^1.1.6", + "prosemirror-dropcursor": "^1.3.3", + "prosemirror-gapcursor": "^1.1.5", + "prosemirror-history": "^1.1.3", + "prosemirror-inputrules": "^1.1.3", + "prosemirror-keymap": "^1.1.4", + "prosemirror-markdown": "^1.5.2", + "prosemirror-model": "^1.13.3", + "prosemirror-schema-list": "^1.1.2", + "prosemirror-state": "^1.3.4", + "prosemirror-tables": "^1.1.1", + "prosemirror-transform": "1.2.5", + "prosemirror-utils": "^0.9.6", + "prosemirror-view": "1.18.1", + "react-medium-image-zoom": "^3.1.3", + "react-portal": "^4.2.1", + "refractor": "^3.3.1", + "resize-observer-polyfill": "^1.5.1", + "slugify": "^1.4.0", + "smooth-scroll-into-view-if-needed": "^1.1.29" + }, + "dependencies": { + "prosemirror-transform": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.2.5.tgz", + "integrity": "sha512-eqeIaxWtUfOnpA1ERrXCuSIMzqIJtL9Qrs5uJMCjY5RMSaH5o4pc390SAjn/IDPeIlw6auh0hCCXs3wRvGnQug==", + "requires": { + "prosemirror-model": "^1.0.0" + } + }, + "prosemirror-view": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.18.1.tgz", + "integrity": "sha512-TZd8byDRfdopLiokBY7T27msCSfWqqRxWs/LnBbdI030F+iI2kS+tO59/XFnpZxMLFKlJgOgGGhM9SzD1Nwdxw==", + "requires": { + "prosemirror-model": "^1.1.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + } + } + }, + "right-now": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", + "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, + "rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "requires": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + } + }, + "rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-terser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", + "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "requires": { + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^4.0.0", + "terser": "^4.6.2" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.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==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + } + } + }, + "rope-sequence": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz", + "integrity": "sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg==" + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "requires": { + "tslib": "^1.9.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==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "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==", + "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==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "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==", + "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", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "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=", + "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=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "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=" + }, + "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=", + "requires": { + "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==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "sanitize.css": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", + "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + }, + "sass": { + "version": "1.38.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.38.1.tgz", + "integrity": "sha512-Lj8nPaSYOuRhgqdyShV50fY5jKnvaRmikUNalMPmbH+tKMGgEKVkltI/lP30PEfO2T1t6R9yc2QIBLgOc3uaFw==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0" + } + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "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 + }, + "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" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "scoped-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-2.1.0.tgz", + "integrity": "sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==" + }, + "scroll-into-view-if-needed": { + "version": "2.2.29", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz", + "integrity": "sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==", + "requires": { + "compute-scroll-into-view": "^1.0.17" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "^5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "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==", + "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=" + } + } + }, + "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==" + } + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-favicon": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", + "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", + "requires": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "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==" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "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==", + "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=", + "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=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "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==", + "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=" + }, + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "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==", + "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==" + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "optional": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "signum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", + "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "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==" + } + } + }, + "sirv": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", + "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "slugify": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", + "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==" + }, + "smooth-scroll-into-view-if-needed": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/smooth-scroll-into-view-if-needed/-/smooth-scroll-into-view-if-needed-1.1.33.tgz", + "integrity": "sha512-crS8NfAaoPrtVYOCMSAnO2vHRgUp22NiiDgEQ7YiaAy5xe2jmR19Jm+QdL8+97gO8ENd7PUyQIAQojJyIiyRHw==", + "requires": { + "scroll-into-view-if-needed": "^2.2.28" + } + }, + "smpltmpl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/smpltmpl/-/smpltmpl-1.0.2.tgz", + "integrity": "sha512-Hq23NNgeZigOzIiX1dkb6W3gFn2/XQj43KhPxu65IMieG/gIwf/lQb1IudjYv0c/5LwJeS/mPayYzyo+8WJMxQ==", + "requires": { + "babel-code-frame": "^6.26.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "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==", + "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=", + "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=", + "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=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "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==", + "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" + } + } + } + }, + "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==", + "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=", + "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==", + "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==", + "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==", + "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==", + "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=", + "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==", + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "sockjs-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "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.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "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==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "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==" + }, + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.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==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "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==" + }, + "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==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "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==", + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "split-lines": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-2.1.0.tgz", + "integrity": "sha512-8dv+1zKgTpfTkOy8XZLFyWrfxO0NV/bj/3EaQ+hBrBxGv2DwiroljPjU8NlCr+59nLnsVm9WYT7lXKwe4TC6bw==" + }, + "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" + } + }, + "split.js": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", + "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "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" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "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==" + } + } + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + }, + "state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" + }, + "state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" + }, + "static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "requires": { + "escodegen": "^1.11.1" + }, + "dependencies": { + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "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" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "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=", + "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=" + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "store2": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz", + "integrity": "sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", + "requires": { + "debug": "2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "string-split-by": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", + "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", + "requires": { + "parenthesis": "^3.1.5" + } + }, + "string-to-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz", + "integrity": "sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q==", + "requires": { + "atob-lite": "^2.0.0", + "is-base64": "^0.1.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.padstart": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.1.4.tgz", + "integrity": "sha512-XqOHj8horGsF+zwxraBvMTkBFM28sS/jHBJajh17JtJKA92qazidiQbLosV4UA18azvLOVKYo/E3g3T9Y5826w==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "stringify-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.2.tgz", + "integrity": "sha512-MTxTVcEkorNtBbNpoFJPEh0kKdM6+QbMjLbaxmvaPMmayOXdr/AIVIIJX7FReUVweRBFJfZepK4A4AKgwuFpMQ==", + "requires": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "dependencies": { + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" + } + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.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==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "requires": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "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==" + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "strongly-connected-components": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", + "integrity": "sha1-CSDitN9nyOrulsa2I0/inoc9upk=" + }, + "style-loader": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" + } + }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, + "styled-components": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.3.tgz", + "integrity": "sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^0.8.8", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, + "supercluster": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.4.tgz", + "integrity": "sha512-GhKkRM1jMR6WUwGPw05fs66pOFWhf59lXq+Q3J3SxPvhNcmgOtLRV6aVQPMRsmXdpaeFJGivt+t7QXUPL3ff4g==", + "requires": { + "kdbush": "^3.0.0" + } + }, + "superscript-text": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", + "integrity": "sha1-58snUlZzYN9QvrBhDOjfPXHY39g=" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "svg-arc-to-cubic-bezier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==" + }, + "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==" + }, + "svg-path-bounds": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz", + "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==", + "requires": { + "abs-svg-path": "^0.1.1", + "is-svg-path": "^1.0.1", + "normalize-svg-path": "^1.0.0", + "parse-svg-path": "^0.1.2" + }, + "dependencies": { + "normalize-svg-path": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", + "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", + "requires": { + "svg-arc-to-cubic-bezier": "^3.0.0" + } + } + } + }, + "svg-path-sdf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", + "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", + "requires": { + "bitmap-sdf": "^1.0.0", + "draw-svg-path": "^1.0.0", + "is-svg-path": "^1.0.1", + "parse-svg-path": "^0.1.2", + "svg-path-bounds": "^1.0.1" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "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" + }, + "dependencies": { + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==", + "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=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.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==" + }, + "symbol.prototype.description": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz", + "integrity": "sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ==", + "requires": { + "call-bind": "^1.0.2", + "get-symbol-description": "^1.0.0", + "has-symbols": "^1.0.2", + "object.getownpropertydescriptors": "^2.1.2" + } + }, + "synchronous-promise": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.16.tgz", + "integrity": "sha512-qImOD23aDfnIDNqlG1NOehdB9IYsn1V9oByPjKY1nakv2MQYCEMyX033/q+aEtYCpmYK1cv2+NTmlH+ra6GA5A==" + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "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==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "telejson": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-6.0.8.tgz", + "integrity": "sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==", + "requires": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.2", + "is-regex": "^1.1.2", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3" + }, + "dependencies": { + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==" + } + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + }, + "tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "requires": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + } + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "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=", + "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=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "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=" + }, + "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" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "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==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "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==" + } + } + }, + "terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "requires": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "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==" + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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==", + "requires": { + "semver": "^6.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.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==", + "requires": { + "find-up": "^4.0.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==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "terser": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", + "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "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==" + } + } + } + } + }, + "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==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" + }, + "tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, + "tlds": { + "version": "1.221.1", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.221.1.tgz", + "integrity": "sha512-N1Afn/SLeOQRpxMwHBuNFJ3GvGrdtY4XPXKPFcx8he0U9Jg9ZkvTKE1k3jQDtCmlFn44UxjVtouF6PT4rEGd3Q==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-array-buffer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/to-array-buffer/-/to-array-buffer-3.2.0.tgz", + "integrity": "sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ==", + "requires": { + "flatten-vertex-data": "^1.0.2", + "is-blob": "^2.0.1", + "string-to-arraybuffer": "^1.0.0" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "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=" + }, + "to-float32": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz", + "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==" + }, + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-px": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", + "integrity": "sha1-W7rtXl1PdkRbzJA8KTojB90yRkY=", + "requires": { + "parse-unit": "^1.0.1" + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "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": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "to-uint8": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/to-uint8/-/to-uint8-1.4.1.tgz", + "integrity": "sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg==", + "requires": { + "arr-flatten": "^1.1.0", + "clamp": "^1.0.1", + "is-base64": "^0.1.0", + "is-float-array": "^1.0.0", + "to-array-buffer": "^3.0.0" + } + }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "requires": { + "commander": "2" + }, + "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==" + } + } + }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true + }, + "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==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "dependencies": { + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" + }, + "trough": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz", + "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==" + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + }, + "tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "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==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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==" + }, + "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==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "type-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", + "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-pool": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", + "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", + "requires": { + "bit-twiddle": "^1.0.0", + "dup": "^1.0.0" + } + }, + "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==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typeface-roboto": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/typeface-roboto/-/typeface-roboto-1.1.13.tgz", + "integrity": "sha512-YXvbd3a1QTREoD+FJoEkl0VQNJoEjewR2H11IjVv4bp6ahuIcw0yyw/3udC4vJkHw3T3cUh85FTg8eWef3pSaw==" + }, + "typescript": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "dev": true + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "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==" + }, + "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==", + "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==" + }, + "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==" + }, + "unified": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.0.tgz", + "integrity": "sha512-4U3ru/BRXYYhKbwXV6lU6bufLikoAavTwev89H5UxY8enDFaAT2VXmIXYNm6hb5oHPng/EXr77PVyDFcptbk5g==", + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "is-plain-obj": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz", + "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==" + } + } + }, + "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" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-random": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-random/-/unique-random-1.0.0.tgz", + "integrity": "sha1-zj4iTIJCzTOg53sNcYDXfmti0MQ=" + }, + "unique-random-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-random-array/-/unique-random-array-1.0.0.tgz", + "integrity": "sha1-QrNyHFeTiNi2Z8k8Lb3j1dgakTY=", + "requires": { + "unique-random": "^1.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" + }, + "unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + }, + "unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + }, + "unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz", + "integrity": "sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "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=", + "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=", + "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=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "untildify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", + "integrity": "sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==", + "optional": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "update-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", + "integrity": "sha1-9RAYLYHugZ+4LDprIrYrve2ngI8=" + }, + "update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "requires": { + "string-width": "^4.1.0" + } + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "requires": { + "ini": "1.3.7" + } + }, + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "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==", + "requires": { + "semver": "^6.0.0" + } + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + } + }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "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=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "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=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + } + } + }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "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==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + } + } + }, + "url-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-5.0.0.tgz", + "integrity": "sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g==", + "requires": { + "ip-regex": "^4.1.0", + "tlds": "^1.203.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==" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==" + }, + "use-memo-one": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.2.tgz", + "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==" + }, + "use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "requires": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==" + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "requires": { + "os-homedir": "^1.0.0" + } + }, + "user-meta": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/user-meta/-/user-meta-1.0.0.tgz", + "integrity": "sha512-Q/opMgFhVbBkdlTs44UKzV7L5Uj2zrJ4MVPXTTzJmrU1bHb2cX6wJzBIqEf1gROTzZIH8u39WmHsa5EvfnMPrw==", + "requires": { + "rc": "^1.2.1" + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "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==", + "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=" + }, + "utils-copy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/utils-copy/-/utils-copy-1.1.1.tgz", + "integrity": "sha1-biuXmCqozXPhGCo+b4vsPA9AWKc=", + "requires": { + "const-pinf-float64": "^1.0.0", + "object-keys": "^1.0.9", + "type-name": "^2.0.0", + "utils-copy-error": "^1.0.0", + "utils-indexof": "^1.0.0", + "utils-regex-from-string": "^1.0.0", + "validate.io-array": "^1.0.3", + "validate.io-buffer": "^1.0.1", + "validate.io-nonnegative-integer": "^1.0.0" + } + }, + "utils-copy-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-copy-error/-/utils-copy-error-1.0.1.tgz", + "integrity": "sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U=", + "requires": { + "object-keys": "^1.0.9", + "utils-copy": "^1.1.0" + } + }, + "utils-indexof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-indexof/-/utils-indexof-1.0.0.tgz", + "integrity": "sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w=", + "requires": { + "validate.io-array-like": "^1.0.1", + "validate.io-integer-primitive": "^1.0.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "utils-regex-from-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz", + "integrity": "sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk=", + "requires": { + "regex-regex": "^1.0.0", + "validate.io-string-primitive": "^1.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==", + "devOptional": true + }, + "uuid-browser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid-browser/-/uuid-browser-3.1.0.tgz", + "integrity": "sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "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==" + } + } + }, + "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==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "requires": { + "builtins": "^1.0.3" + } + }, + "validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha1-W1osr9j4uFq7L4hroVPy2Tond00=" + }, + "validate.io-array-like": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz", + "integrity": "sha1-evn363tRcVvrIhVmjsXM5U+t21o=", + "requires": { + "const-max-uint32": "^1.0.2", + "validate.io-integer-primitive": "^1.0.0" + } + }, + "validate.io-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz", + "integrity": "sha1-hS1nNAIZFNXROvwyUxdh43IO1E4=" + }, + "validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg=", + "requires": { + "validate.io-number": "^1.0.3" + } + }, + "validate.io-integer-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz", + "integrity": "sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY=", + "requires": { + "validate.io-number-primitive": "^1.0.0" + } + }, + "validate.io-matrix-like": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz", + "integrity": "sha1-XsMqddCInaxzbepovdYUWxVe38M=" + }, + "validate.io-ndarray-like": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz", + "integrity": "sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk=" + }, + "validate.io-nonnegative-integer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz", + "integrity": "sha1-gGkkOgjF+Y6VQTySnf17GPP28p8=", + "requires": { + "validate.io-integer": "^1.0.5" + } + }, + "validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha1-9j/+2iSL8opnqNSODjtGGhZluvg=" + }, + "validate.io-number-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz", + "integrity": "sha1-0uAfICmJNp3PEVVElWQgOv5YTlU=" + }, + "validate.io-positive-integer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz", + "integrity": "sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI=", + "requires": { + "validate.io-integer": "^1.0.5" + } + }, + "validate.io-string-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz", + "integrity": "sha1-uBNbn7E3K94C/dU60dDM1t55j+4=" + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" + }, + "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" + } + }, + "vfile": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.2.0.tgz", + "integrity": "sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + } + } + }, + "vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "requires": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + } + }, + "vfile-message": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz", + "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "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" + } + }, + "vue-eslint-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz", + "integrity": "sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.0.1", + "lodash": "^4.17.15" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + } + } + }, + "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==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-keyname": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz", + "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==" + }, + "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==", + "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=", + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": 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=", + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": 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=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": 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" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": 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=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": 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=", + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "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=", + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": 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=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": 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" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.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=", + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" + }, + "web-vitals": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", + "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" + }, + "webgl-context": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", + "integrity": "sha1-jzfXJXz23xzQpJ5qextyG5TMhqA=", + "requires": { + "get-canvas-context": "^1.0.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "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==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.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==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.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=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "webpack-bundle-analyzer": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz", + "integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==", + "dev": true, + "requires": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^6.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "requires": { + "duplexer": "^0.1.2" + } + } + } + }, + "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==", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + } + } + }, + "webpack-dev-server": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", + "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", + "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": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "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=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "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" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "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==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "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==", + "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=" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "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=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "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==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "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==" + }, + "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=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "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=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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" + } + }, + "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==", + "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=" + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "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=" + }, + "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==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "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==", + "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==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.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==", + "requires": { + "has-flag": "^3.0.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=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "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==", + "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==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-dynamic-public-path": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/webpack-dynamic-public-path/-/webpack-dynamic-public-path-1.0.8.tgz", + "integrity": "sha512-AF6onorpvmiC+I/dQ19SOi+oN66oEy9h4deam7gPs1Qa1mOQ9i7IRsOahaukohKAciys7NfX+YFboRn4rmpuKw==", + "dev": true + }, + "webpack-filter-warnings-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz", + "integrity": "sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==" + }, + "webpack-hot-middleware": { + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.3.tgz", + "integrity": "sha512-IK/0WAHs7MTu1tzLTjio73LjS3Ov+VvBKQmE8WPlJutgG5zT6Urgq/BbAdRrHTRpyzK0dvAvFh1Qg98akxgZpA==", + "requires": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "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==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "webpack-manifest-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "requires": { + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "webpack-virtual-modules": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz", + "integrity": "sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==", + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "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==" + }, + "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==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "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==" + }, + "whatwg-url": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz", + "integrity": "sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "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==", + "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-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "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=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "requires": { + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "workbox-background-sync": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", + "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-broadcast-update": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", + "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-build": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", + "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", + "requires": { + "@babel/core": "^7.8.4", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@hapi/joi": "^15.1.0", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.1", + "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.6", + "lodash.template": "^4.5.0", + "pretty-bytes": "^5.3.0", + "rollup": "^1.31.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-terser": "^5.3.1", + "source-map": "^0.7.3", + "source-map-url": "^0.4.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "tempy": "^0.3.0", + "upath": "^1.2.0", + "workbox-background-sync": "^5.1.4", + "workbox-broadcast-update": "^5.1.4", + "workbox-cacheable-response": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-expiration": "^5.1.4", + "workbox-google-analytics": "^5.1.4", + "workbox-navigation-preload": "^5.1.4", + "workbox-precaching": "^5.1.4", + "workbox-range-requests": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4", + "workbox-streams": "^5.1.4", + "workbox-sw": "^5.1.4", + "workbox-window": "^5.1.4" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "workbox-cacheable-response": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", + "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-core": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", + "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + }, + "workbox-expiration": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", + "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-google-analytics": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", + "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "requires": { + "workbox-background-sync": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4" + } + }, + "workbox-navigation-preload": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", + "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-precaching": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", + "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-range-requests": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", + "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-routing": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", + "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-strategies": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", + "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "requires": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "workbox-streams": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", + "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "requires": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "workbox-sw": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", + "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" + }, + "workbox-webpack-plugin": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", + "requires": { + "@babel/runtime": "^7.5.5", + "fast-json-stable-stringify": "^2.0.0", + "source-map-url": "^0.4.0", + "upath": "^1.1.2", + "webpack-sources": "^1.3.0", + "workbox-build": "^5.1.4" + } + }, + "workbox-window": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", + "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "worker-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", + "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", + "dev": true, + "requires": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "world-calendars": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", + "integrity": "sha1-slxQMrokEo/8QdCfr0pewbnBQzU=", + "requires": { + "object-assign": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "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==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", + "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==" + }, + "x-default-browser": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/x-default-browser/-/x-default-browser-0.4.0.tgz", + "integrity": "sha512-7LKo7RtWfoFN/rHx1UELv/2zHGMx8MkZKDq1xENmOCTkfIqZJ0zZ26NEJX8czhnPXVcqS0ARjjfJB+eJ0/5Cvw==", + "requires": { + "default-browser-id": "^1.0.4" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, + "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==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + } + } + }, + "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==" + }, + "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==" + }, + "yup": { + "version": "0.32.9", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.9.tgz", + "integrity": "sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==", + "requires": { + "@babel/runtime": "^7.10.5", + "@types/lodash": "^4.14.165", + "lodash": "^4.17.20", + "lodash-es": "^4.17.15", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + } + }, + "zustand": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.1.1.tgz", + "integrity": "sha512-h4F3WMqsZgvvaE0n3lThx4MM81Ls9xebjvrABNzf5+jb3/03YjNTSgZXeyrvXDArMeV9untvWXRw1tY+ntPYbA==", + "requires": { + "use-sync-external-store": "1.2.0" + } + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + } + } +} diff --git a/src/package.json b/src/package.json new file mode 100644 index 00000000..f12efe1a --- /dev/null +++ b/src/package.json @@ -0,0 +1,183 @@ +{ + "name": "ui_v2", + "version": "3.19.3", + "private": true, + "dependencies": { + "@aksel/structjs": "^1.0.0", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^4.0.0-alpha.60", + "@monaco-editor/react": "4.4.4", + "@radix-ui/primitive": "^1.0.0", + "@radix-ui/react-checkbox": "^1.0.1", + "@radix-ui/react-dialog": "^1.0.2", + "@radix-ui/react-popover": "^1.0.2", + "@radix-ui/react-radio-group": "^1.1.0", + "@radix-ui/react-separator": "^1.0.1", + "@radix-ui/react-slider": "^1.1.0", + "@radix-ui/react-slot": "^1.0.1", + "@radix-ui/react-switch": "^1.0.1", + "@radix-ui/react-toast": "^1.1.2", + "@radix-ui/react-tooltip": "^1.0.3", + "@stitches/react": "^1.2.8", + "@storybook/react": "^6.5.12", + "@tabler/icons-react": "^2.2.0", + "@uiw/react-textarea-code-editor": "^1.4.14", + "antd": "^4.23.6", + "bs58check": "^2.1.2", + "classnames": "^2.3.1", + "comlink": "^4.3.1", + "d3": "^7.0.0", + "dot-object": "^2.1.4", + "file-saver": "^2.0.5", + "formik": "^2.2.9", + "highcharts": "^9.3.1", + "highcharts-react-official": "^3.1.0", + "history": "^5.3.0", + "humanize-duration": "^3.27.0", + "immer": "^9.0.16", + "js-cookie": "^3.0.5", + "lodash-es": "^4.17.21", + "marked": "^4.1.1", + "material-ui-audio-player": "^1.7.1", + "md5": "^2.3.0", + "memoize-one": "^5.2.1", + "moment": "^2.29.4", + "monaco-editor": "^0.33.0", + "plotly.js": "^2.7.0", + "prop-types": "^15.7.2", + "prosemirror-tables": "^1.1.1", + "react": "^17.0.2", + "react-accessible-dropdown-menu-hook": "^3.1.0", + "react-beautiful-dnd": "^13.1.0", + "react-dom": "^17.0.2", + "react-plotly.js": "^2.5.1", + "react-router-dom": "^5.3.0", + "react-scripts": "4.0.3", + "react-select": "^5.5.4", + "react-split": "^2.0.14", + "react-virtualized": "^9.22.3", + "react-virtualized-auto-sizer": "^1.0.5", + "react-virtualized-tree": "^3.4.1", + "react-window": "^1.8.6", + "rich-markdown-editor": "^11.21.3", + "styled-components": "^5.3.3", + "typeface-roboto": "^1.1.13", + "web-vitals": "^1.0.1", + "yup": "^0.32.9", + "zustand": "^4.1.1" + }, + "scripts": { + "start": "react-app-rewired --max_old_space_size=4096 start", + "build": "react-app-rewired --max_old_space_size=4096 build && gzipper c -i js,css,html ./build && node tasks/index-html-template-generator.js", + "test": "react-app-rewired test ", + "test:coverage": "react-app-rewired test --collectCoverage", + "test:watch": "react-app-rewired test --watchAll", + "eject": "react-scripts eject", + "lint": "eslint src/. --ext .js,.jsx,.ts,.tsx", + "format:fix": "eslint src/. --ext .js,.jsx,.ts,.tsx --quiet --fix", + "preinstall": "rimraf public/vs", + "postinstall": "cp -R node_modules/monaco-editor/min/vs public/vs", + "analyze-bundles": "node tasks/bundle-analyzer.js", + "crc-kit": "func() { node tasks/cli/index.js create-component --name=\"$1\" --path=./src/components/kit/ --lint; }; func", + "crc": "func() { node tasks/cli/index.js create-component --name=\"$1\" --path=./src/components/ --lint; }; func", + "storybook": "start-storybook -p 6006 -s public", + "build-storybook": "build-storybook -s public" + }, + "homepage": "/static-files/", + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "src/**/*.{js,jsx,ts,tsx,json,css,scss,md}": [ + "prettier --write" + ] + }, + "devDependencies": { + "@storybook/addon-actions": "^6.5.12", + "@storybook/addon-essentials": "^6.5.12", + "@storybook/addon-interactions": "^6.5.12", + "@storybook/addon-links": "^6.5.12", + "@storybook/builder-webpack4": "^6.5.12", + "@storybook/manager-webpack4": "^6.5.12", + "@storybook/node-logger": "^6.5.12", + "@storybook/preset-create-react-app": "^3.2.0", + "@storybook/testing-library": "^0.0.13", + "@testing-library/jest-dom": "^5.11.4", + "@testing-library/react": "^11.1.0", + "@testing-library/react-hooks": "^7.0.2", + "@testing-library/user-event": "^12.1.10", + "@types/bs58check": "^2.1.0", + "@types/d3": "^7.0.0", + "@types/dot-object": "^2.1.2", + "@types/file-saver": "^2.0.3", + "@types/history": "^5.0.0", + "@types/humanize-duration": "^3.25.1", + "@types/jest": "^26.0.15", + "@types/js-cookie": "^3.0.6", + "@types/lodash-es": "^4.17.4", + "@types/marked": "^4.0.7", + "@types/md5": "^2.3.1", + "@types/node": "^12.0.0", + "@types/node-sass": "^4.11.2", + "@types/react": "^17.0.0", + "@types/react-beautiful-dnd": "^13.1.1", + "@types/react-dom": "^17.0.0", + "@types/react-plotly.js": "^2.5.0", + "@types/react-router-dom": "^5.1.7", + "@types/react-virtualized-auto-sizer": "^1.0.1", + "@types/react-window": "^1.8.4", + "@types/storybook__react": "^5.2.1", + "@types/styled-components": "^5.1.15", + "@typescript-eslint/eslint-plugin": "^4.28.0", + "@typescript-eslint/parser": "^4.28.0", + "comlink-loader": "^2.0.0", + "eslint": "^7.29.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-react": "^7.24.0", + "eslint-plugin-react-hooks": "^4.2.0", + "gzipper": "^5.0.1", + "husky": "^6.0.0", + "jest-canvas-mock": "^2.3.1", + "jss-plugin-template": "^10.7.1", + "lint-staged": "^11.0.0", + "node-sass": "^6.0.1", + "prettier": "2.3.1", + "prettier-eslint": "^12.0.0", + "progress-bar-webpack-plugin": "^2.1.0", + "react-app-rewired": "^2.1.8", + "sass": "^1.38.1", + "typescript": "^4.3.4", + "webpack-bundle-analyzer": "^4.4.2", + "webpack-dynamic-public-path": "^1.0.8", + "yargs": "^17.2.1" + }, + "eslintConfig": { + "overrides": [ + { + "files": [ + "**/*.stories.*" + ], + "rules": { + "import/no-anonymous-default-export": "off" + } + } + ] + } +} diff --git a/src/public/assets/icomoon/fonts/icomoon.eot b/src/public/assets/icomoon/fonts/icomoon.eot new file mode 100644 index 0000000000000000000000000000000000000000..9217028371f7bddc1fb161a705635343bfd80c95 GIT binary patch literal 41164 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%0AQ`?ZVh?zSr!XT6NEbuA;iMpQN%|Dr8fxZC!* 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 literal 0 HcmV?d00001 diff --git a/src/public/assets/icomoon/fonts/icomoon.svg b/src/public/assets/icomoon/fonts/icomoon.svg new file mode 100644 index 00000000..5b196f09 --- /dev/null +++ b/src/public/assets/icomoon/fonts/icomoon.svg @@ -0,0 +1,150 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/public/assets/icomoon/fonts/icomoon.ttf b/src/public/assets/icomoon/fonts/icomoon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b4871d49f2d079f01d4212f7209283a065949766 GIT binary patch literal 41000 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 literal 0 HcmV?d00001 diff --git a/src/public/assets/icomoon/icomoonIcons.css b/src/public/assets/icomoon/icomoonIcons.css new file mode 100644 index 00000000..f538cd16 --- /dev/null +++ b/src/public/assets/icomoon/icomoonIcons.css @@ -0,0 +1,447 @@ +@font-face { + font-family: 'icomoon'; + src: url('./fonts/icomoon.eot?30x89n'); + src: url('./fonts/icomoon.eot?30x89n#iefix') format('embedded-opentype'), + url('./fonts/icomoon.ttf?30x89n') format('truetype'), + url('./fonts/icomoon.woff?30x89n') format('woff'), + url('./fonts/icomoon.svg?30x89n#icomoon') format('svg'); + font-weight: normal; + font-style: normal; + font-display: block; +} + +[class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'icomoon' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-metric-value:before { + content: "\e987"; +} +.icon-audios:before { + content: "\e98b"; +} +.icon-chart-legends:before { + content: "\e98a"; +} +.icon-dashboard:before { + content: "\e989"; +} +.icon-distributions:before { + content: "\e988"; +} +.icon-pin-to-top:before { + content: "\e984"; +} +.icon-pin-to-bottom:before { + content: "\e985"; +} +.icon-flexible:before { + content: "\e986"; +} +.icon-arrow-left-contained:before { + content: "\e980"; +} +.icon-arrow-up-contained:before { + content: "\e981"; +} +.icon-arrow-right-contained:before { + content: "\e982"; +} +.icon-arrow-down-contained:before { + content: "\e983"; +} +.icon-figures:before { + content: "\e97e"; +} +.icon-box-settings:before { + content: "\e97d"; +} +.icon-full-screen:before { + content: "\e97b"; +} +.icon-new-tab:before { + content: "\e97c"; +} +.icon-compare:before { + content: "\e97a"; +} +.icon-axes-props:before { + content: "\e979"; +} +.icon-info-circle-outline:before { + content: "\e978"; +} +.icon-update-time:before { + content: "\e977"; +} +.icon-minus:before { + content: "\e976"; +} +.icon-color-scale-on:before { + content: "\e973"; +} +.icon-color-scale-off:before { + content: "\e974"; +} +.icon-avatar:before { + content: "\e972"; +} +.icon-branch:before { + content: "\e975"; +} +.icon-circle-question:before { + content: "\e96c"; +} +.icon-hide-system-metrics:before { + content: "\e96a"; +} +.icon-show-system-metrics:before { + content: "\e96b"; +} +.icon-images-stacking:before { + content: "\e969"; +} +.icon-case-sensitive:before { + content: "\e966"; +} +.icon-word-match:before { + content: "\e967"; +} +.icon-regex:before { + content: "\e968"; +} +.icon-archive:before { + content: "\e94f"; +} +.icon-unarchive:before { + content: "\e965"; +} +.icon-partially-selected:before { + content: "\e964"; +} +.icon-trendline:before { + content: "\e95f"; +} +.icon-slack:before { + content: "\e960"; +} +.icon-success-icon:before { + content: "\e961"; +} +.icon-circle-info:before { + content: "\e94e"; +} +.icon-warning-outline:before { + content: "\e962"; +} +.icon-warning-contained:before { + content: "\e95e"; +} +.icon-voice-on:before { + content: "\e95a"; +} +.icon-voice-off:before { + content: "\e95b"; +} +.icon-pause:before { + content: "\e95c"; +} +.icon-play:before { + content: "\e95d"; +} +.icon-image-properties:before { + content: "\e959"; +} +.icon-y-axis:before { + content: "\e957"; +} +.icon-image-group:before { + content: "\e958"; +} +.icon-group-column:before { + content: "\e97f"; +} +.icon-scatterplot:before { + content: "\e955"; +} +.icon-image-explorer:before { + content: "\e956"; +} +.icon-full-docs:before { + content: "\e952"; +} +.icon-live-demo:before { + content: "\e953"; +} +.icon-co:before { + content: "\e954"; +} +.icon-sort-arrow-down:before { + content: "\e91b"; +} +.icon-sort-arrow-up:before { + content: "\e951"; +} +.icon-images:before { + content: "\e950"; +} +.icon-link:before { + content: "\e93e"; +} +.icon-close-rectangle:before { + content: "\e900"; +} +.icon-close:before { + content: "\e901"; +} +.icon-close-circle:before { + content: "\e902"; +} +.icon-eye-fill-show:before { + content: "\e903"; +} +.icon-eye-outline-hide:before { + content: "\e904"; +} +.icon-eye-show-outline:before { + content: "\e905"; +} +.icon-eye-fill-hide:before { + content: "\e906"; +} +.icon-row-height-down:before { + content: "\e907"; +} +.icon-reset-width-outside:before { + content: "\e908"; +} +.icon-reset-width-inside:before { + content: "\e909"; +} +.icon-row-height-up:before { + content: "\e90a"; +} +.icon-pin-right:before { + content: "\e90b"; +} +.icon-pin-left:before { + content: "\e90c"; +} +.icon-pin:before { + content: "\e90d"; +} +.icon-expand-horizontal:before { + content: "\e90e"; +} +.icon-expand-vertical:before { + content: "\e90f"; +} +.icon-arrow-up:before { + content: "\e910"; +} +.icon-arrow-left:before { + content: "\e911"; +} +.icon-arrow-down:before { + content: "\e912"; +} +.icon-arrow-right:before { + content: "\e913"; +} +.icon-manage-column:before { + content: "\e914"; +} +.icon-long-arrow-right:before { + content: "\e915"; +} +.icon-long-arrow-left:before { + content: "\e916"; +} +.icon-cursor:before { + content: "\e917"; +} +.icon-delete:before { + content: "\e918"; +} +.icon-sort-inside:before { + content: "\e919"; +} +.icon-sort-outside:before { + content: "\e91a"; +} +.icon-metrics:before { + content: "\e91c"; +} +.icon-tags:before { + content: "\e91d"; +} +.icon-bookmarks:before { + content: "\e91e"; +} +.icon-runs:before { + content: "\e91f"; +} +.icon-back-left:before { + content: "\e920"; +} +.icon-back-down:before { + content: "\e921"; +} +.icon-back-up:before { + content: "\e922"; +} +.icon-back-right:before { + content: "\e923"; +} +.icon-back-up-right:before { + content: "\e924"; +} +.icon-back-up-left:before { + content: "\e925"; +} +.icon-back-down-left:before { + content: "\e926"; +} +.icon-back-down-right:before { + content: "\e927"; +} +.icon-more-horizontal:before { + content: "\e928"; +} +.icon-more-vertical:before { + content: "\e929"; +} +.icon-drag:before { + content: "\e92a"; +} +.icon-move-to-left:before { + content: "\e92b"; +} +.icon-move-to-right:before { + content: "\e92c"; +} +.icon-reset:before { + content: "\e92d"; +} +.icon-line-style:before { + content: "\e92e"; +} +.icon-chart-group:before { + content: "\e92f"; +} +.icon-coloring:before { + content: "\e930"; +} +.icon-zoom-in:before { + content: "\e931"; +} +.icon-ignore-outliers:before { + content: "\e932"; +} +.icon-smoothing:before { + content: "\e933"; +} +.icon-highlight-mode:before { + content: "\e934"; +} +.icon-axes-scale:before { + content: "\e935"; +} +.icon-x-axis:before { + content: "\e936"; +} +.icon-indicator:before { + content: "\e937"; +} +.icon-aggregation:before { + content: "\e938"; +} +.icon-zoom-out:before { + content: "\e939"; +} +.icon-collapse-inside:before { + content: "\e93a"; +} +.icon-collapse-outside:before { + content: "\e93b"; +} +.icon-arrow-bidirectional-close:before { + content: "\e93c"; +} +.icon-arrow-bidirectional-open:before { + content: "\e93d"; +} +.icon-row-height:before { + content: "\e93f"; +} +.icon-copy:before { + content: "\e941"; +} +.icon-menu:before { + content: "\e942"; +} +.icon-download:before { + content: "\e943"; +} +.icon-upload:before { + content: "\e944"; +} +.icon-edit:before { + content: "\e945"; +} +.icon-search-info:before { + content: "\e946"; +} +.icon-search:before { + content: "\e947"; +} +.icon-table-resize-maximize:before { + content: "\e948"; +} +.icon-table-resize-hide:before { + content: "\e949"; +} +.icon-table-resize-resizable:before { + content: "\e94a"; +} +.icon-plus:before { + content: "\e94b"; +} +.icon-circle-with-dot:before { + content: "\e94c"; +} +.icon-check-rectangle:before { + content: "\e94d"; +} +.icon-check:before { + content: "\e963"; +} +.icon-params:before { + content: "\e940"; +} +.icon-time:before { + content: "\e96e"; +} +.icon-duration:before { + content: "\e96f"; +} +.icon-hash:before { + content: "\e970"; +} +.icon-calendar:before { + content: "\e971"; +} +.icon-text:before { + content: "\e96d"; +} diff --git a/src/public/assets/icomoon/selection.json b/src/public/assets/icomoon/selection.json new file mode 100644 index 00000000..c40afeb7 --- /dev/null +++ b/src/public/assets/icomoon/selection.json @@ -0,0 +1 @@ +{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M906.631 942.972h-789.264c-15.613 0-30.149-3.23-44.685-9.152s-26.919-14.536-37.687-25.303-19.382-23.688-25.303-37.687-9.152-29.072-9.152-44.685v-251.423c0-64.067 52.223-116.829 116.829-116.829h789.803c64.606 0 116.829 52.223 116.829 116.829v251.423c0 64.606-52.223 116.829-116.829 116.829zM117.368 566.107c-4.845 0-9.152 4.307-9.152 9.152l2.691 257.346 6.461 2.691h789.803c4.845 0 9.152-4.307 9.152-9.152v-251.423c0-4.845-3.769-9.152-9.152-9.152h-789.803zM502.847 404.593h-412.937c-23.688 0-46.839-9.691-63.529-26.381s-26.381-39.84-26.381-63.529v-143.747c0-49.53 40.378-89.909 89.909-89.909h412.937c49.53 0 89.909 40.378 89.909 89.909v143.747c0 23.688-9.691 46.839-26.381 63.529s-39.84 26.381-63.529 26.381zM108.215 296.917h376.866v-107.675h-376.866v107.675zM502.847 189.241v0 0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["metric-value"]},"attrs":[{}],"properties":{"order":613,"id":139,"name":"metric-value","prevSize":32,"code":59783},"setIdx":0,"setId":1,"iconIdx":0},{"icon":{"paths":["M662.872 425.894c0-32.044-25.977-58.024-58.024-58.024s-58.024 25.977-58.024 58.024v0 172.22c0 32.044 25.977 58.024 58.024 58.024s58.024-25.977 58.024-58.024v0zM848.553 180.468c0-32.044-25.977-58.024-58.024-58.024s-58.024 25.977-58.024 58.024v663.065c0 32.044 25.977 58.024 58.024 58.024s58.024-25.977 58.024-58.024v0zM1013.76 474.482c0-32.044-25.977-58.024-58.024-58.024s-58.024 25.977-58.024 58.024v75.047c0 32.044 25.977 58.024 58.024 58.024s58.024-25.977 58.024-58.024v0zM477.172 333.688c0-32.044-25.977-58.024-58.024-58.024s-58.024 25.977-58.024 58.024v0 356.627c0 32.044 25.977 58.024 58.024 58.024s58.024-25.977 58.024-58.024v0zM291.493 92.402c0-32.044-25.977-58.024-58.024-58.024s-58.024 25.977-58.024 58.024v839.595c0 32.044 25.977 58.024 58.024 58.024s58.024-25.977 58.024-58.024v0zM105.808 400.069c0-32.044-25.977-58.024-58.024-58.024s-58.024 25.977-58.024 58.024v0 223.872c0 32.044 25.977 58.024 58.024 58.024s58.024-25.977 58.024-58.024v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["audios"],"grid":0},"attrs":[],"properties":{"order":606,"id":0,"name":"audios","prevSize":32,"code":59787},"setIdx":0,"setId":1,"iconIdx":1},{"icon":{"paths":["M117.753 36.96c0-0.046 0-0.104 0-0.164 0-28.393-23.013-51.425-51.425-51.425v0c-7.296 0.677-13.985 2.081-20.39 4.129l0.673-0.185c-18.782 7.945-31.713 26.209-31.713 47.491 0 0.058 0 0.119 0 0.178v-0.014 783.867c0.006 104.125 84.416 188.532 188.54 188.535h783.757c28.389 0 51.425-23.012 51.425-51.425s-23.012-51.425-51.425-51.425h-783.757c-0.001 0-0.004 0-0.006 0-47.329 0-85.696-38.369-85.696-85.696 0-0.001 0-0.004 0-0.004v0zM980.124-14.624h-526.624c-32.289 0.034-58.465 26.209-58.524 58.519v409.607c0.034 32.289 26.209 58.465 58.519 58.524h526.624c32.296-0.033 58.473-26.209 58.524-58.519v-409.605c-0.033-32.296-26.209-58.473-58.519-58.524h-0.004zM453.476 43.876h526.624v409.601h-526.624v-409.601h-0.057zM528.932 570.524h96.665l-103.009 223.2c-6.672 14.153-20.257 24.048-36.302 25.371l-0.161 0.016c-0.897 0.064-1.953 0.097-2.998 0.097-15.27 0-28.769-7.67-36.824-19.371l-0.097-0.161-80.516-120.737-80.516 120.737c-7.954 12.075-21.449 19.937-36.77 19.937-24.228 0-43.878-19.648-43.878-43.878 0-9.249 2.849-17.825 7.733-24.887l-0.097 0.156 117.025-175.539c8.41-11.169 21.619-18.297 36.513-18.297s28.12 7.137 36.434 18.185l0.094 0.112 73.546 110.293zM839.812 570.524h90.46l-53.857 215.431c-4.591 17.897-19.745 31.243-38.276 33.064l-0.178 0.021c-1.091 0.097-2.352 0.158-3.634 0.158-17.692 0-32.967-10.274-40.189-25.188l-0.112-0.27-103.010-223.2h96.673l33.837 73.313zM570.524 102.399v0c32.314 0 58.524 26.209 58.524 58.524v0 0c0 32.314-26.209 58.524-58.524 58.524v0 0c-32.314 0-58.524-26.209-58.524-58.524v0 0c0-32.314 26.209-58.524 58.524-58.524v0zM746.063 102.399h117.025c32.314 0 58.524 26.209 58.524 58.524v0 0c0 32.314-26.209 58.524-58.524 58.524v0h-117.025c-32.314 0-58.524-26.209-58.524-58.524v0 0c0-32.314 26.209-58.524 58.524-58.524v0zM570.524 277.937v0c32.314 0 58.524 26.209 58.524 58.524v0 0c0 32.314-26.209 58.524-58.524 58.524v0 0c-32.314 0-58.524-26.209-58.524-58.524v0 0c0-32.314 26.209-58.524 58.524-58.524v0zM746.063 277.937h117.025c32.314 0 58.524 26.209 58.524 58.524v0 0c0 32.314-26.209 58.524-58.524 58.524v0h-117.025c-32.314 0-58.524-26.209-58.524-58.524v0 0c0-32.314 26.209-58.524 58.524-58.524v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["chart-legends"],"grid":0},"attrs":[],"properties":{"order":605,"id":1,"name":"chart-legends","prevSize":32,"code":59786},"setIdx":0,"setId":1,"iconIdx":2},{"icon":{"paths":["M929.246 986.178h-834.371c-52.342-0.057-94.758-42.472-94.815-94.81v-758.521c0.062-52.341 42.474-94.753 94.808-94.818h834.377c52.342 0.057 94.76 42.474 94.815 94.811v758.521c-0.050 52.344-42.471 94.764-94.81 94.815h-0.005zM113.838 872.399h796.444v-720.593h-796.444zM644.801 265.585h151.704c10.472 0 18.963 8.489 18.963 18.963 0 0 0 0 0 0v0 455.111c0 0 0 0 0 0 0 10.472-8.489 18.963-18.963 18.963h-151.704c-10.472 0-18.963-8.489-18.963-18.963 0 0 0 0 0 0v0-455.111c0 0 0 0 0 0 0-10.472 8.489-18.963 18.963-18.963v0zM549.986 663.806v75.851c0 10.472-8.491 18.963-18.963 18.963v0h-303.405c-10.472 0-18.963-8.489-18.963-18.963 0 0 0 0 0 0v0-75.851c0-10.472 8.489-18.963 18.963-18.963v0h303.405c0 0 0 0 0 0 10.472 0 18.963 8.489 18.963 18.963v0zM549.986 474.177v75.851c0 10.472-8.489 18.963-18.963 18.963 0 0 0 0 0 0h-303.405c-10.472 0-18.963-8.489-18.963-18.963v0-75.851c0-10.472 8.489-18.963 18.963-18.963v0h303.405c0 0 0 0 0.002 0 10.472 0 18.963 8.489 18.963 18.963v0zM549.986 284.548v75.851c0 10.472-8.491 18.963-18.963 18.963v0h-303.405c-10.472 0-18.963-8.489-18.963-18.963 0 0 0 0 0 0v0-75.851c0 0 0 0 0 0 0-10.472 8.489-18.963 18.963-18.963h303.405c0 0 0 0 0 0 10.472 0 18.963 8.491 18.963 18.963v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["dashboard"],"grid":0},"attrs":[],"properties":{"order":602,"id":2,"name":"dashboard","prevSize":32,"code":59785},"setIdx":0,"setId":1,"iconIdx":3},{"icon":{"paths":["M776.541 700.114c0-21.644 17.546-39.19 39.19-39.19v0h39.19c21.644 0 39.19 17.546 39.19 39.19v0 195.953c0 21.644-17.546 39.19-39.19 39.19v0h-39.19c-21.644 0-39.19-17.546-39.19-39.19v0zM962.69 964.652h-901.382c-16.233 0-29.392 13.159-29.392 29.392s13.159 29.392 29.392 29.392v0h901.382c16.233 0 29.392-13.159 29.392-29.392s-13.159-29.392-29.392-29.392v0zM972.929 598.579l-49.080-50.77c2.165-7.176 3.468-15.435 3.592-23.982l0.001-0.068c-0.069-50.845-41.275-92.044-92.115-92.1h-0.006c-7.982 0.098-15.663 1.208-22.976 3.206l0.639-0.149-109.028-109.028c4.992-10.9 7.913-23.642 7.937-37.063v-0.008c0-0.073 0-0.16 0-0.247 0-50.872-41.24-92.111-92.111-92.111s-92.111 41.24-92.111 92.111c0 6.445 0.661 12.736 1.922 18.808l-0.103-0.597-86.925 55.316c-11.23-5.39-24.408-8.562-38.319-8.618h-0.019c-2.326 0-4.51 0.517-6.791 0.686l-134.295-207.554c11.224-15.103 17.968-34.117 17.968-54.707 0-50.958-41.309-92.268-92.268-92.268s-92.268 41.309-92.268 92.268c0 16.713 4.443 32.386 12.213 45.907l-0.238-0.449-59.172 71.41c-4.871 5.754-7.831 13.26-7.831 21.458 0 18.398 14.915 33.312 33.312 33.312 10.387 0 19.664-4.753 25.773-12.204l0.047-0.059 59.158-71.395c8.575 3.097 18.472 4.948 28.783 5.080h0.061c6.615-0.001 13.064-0.7 19.282-2.027l-0.603 0.107 129.519 200.167c-15.282 16.389-24.664 38.454-24.664 62.712 0 50.842 41.217 92.059 92.059 92.059s92.059-41.217 92.059-92.059c0-12.524-2.501-24.464-7.031-35.349l0.225 0.609 75.972-48.347c14.938 11.287 33.822 18.078 54.291 18.078 13.422 0 26.163-2.92 37.621-8.159l-0.565 0.231 101.217 101.215c-9.35 14.136-14.917 31.485-14.917 50.135 0 50.648 41.058 91.706 91.706 91.706 18.019 0 34.822-5.197 48.997-14.172l-0.376 0.222 41.556 42.99c6.065 6.269 14.555 10.16 23.953 10.16 18.399 0 33.314-14.915 33.314-33.314 0-9.001-3.57-17.167-9.37-23.162l0.008 0.010zM238.436 108.238c-6.448 21.744-26.248 37.337-49.692 37.337-25.683 0-46.997-18.716-51.043-43.253l-0.041-0.3c-0.856-2.694-1.522-5.868-1.875-9.136l-0.019-0.222c0-29.222 23.69-52.911 52.911-52.911s52.911 23.69 52.911 52.911v0c-0.259 5.659-1.393 10.977-3.271 15.927l0.117-0.353zM404.226 498.29c-29.211-0.029-52.882-23.701-52.911-52.909v-0.003c0.267-10.070 3.392-19.358 8.588-27.148l-0.117 0.187c9.009-15.612 25.616-25.951 44.636-25.951 24.591 0 45.145 17.28 50.182 40.36l0.062 0.339c1.243 3.578 2.12 7.731 2.459 12.035l0.011 0.176c-0.029 29.211-23.701 52.882-52.907 52.911h-0.003zM671.726 293.454c-2.349 25.018-22.103 44.762-46.918 47.081l-0.207 0.015c-1.259 0.343-2.892 0.685-4.552 0.941l-0.274 0.034c-5.945-0.077-11.618-1.135-16.899-3.020l0.365 0.113c-21.248-7.104-36.308-26.784-36.397-49.995v-0.011c0.096-2.277 0.321-4.414 0.671-6.51l-0.043 0.304c3.154-26.421 25.427-46.707 52.44-46.707 29.155 0 52.792 23.636 52.792 52.792 0 0.043 0 0.085 0 0.127v-0.007c-0.293 1.94-0.635 3.577-1.055 5.182l0.076-0.343zM855.182 572.635c-5.863 2.44-12.672 3.856-19.813 3.856-29.172 0-52.82-23.648-52.82-52.82 0-29.155 23.621-52.793 52.769-52.82h0.003c28.599 1.51 51.41 24.315 52.924 52.772l0.006 0.139c-0.054 22.007-13.555 40.849-32.718 48.745l-0.351 0.128zM169.085 269.018c-21.644 0-39.19 17.546-39.19 39.19v0 587.858c0 21.644 17.546 39.19 39.19 39.19v0h39.19c21.644 0 39.19-17.546 39.19-39.19v0-587.858c0-21.644-17.546-39.19-39.19-39.19v0zM384.633 582.543c-21.644 0-39.19 17.546-39.19 39.19v0 274.334c0 21.644 17.546 39.19 39.19 39.19v0h39.19c21.644 0 39.19-17.546 39.19-39.19v0-274.334c0-21.644-17.546-39.19-39.19-39.19v0zM600.182 464.972c-21.644 0-39.19 17.546-39.19 39.19v0 391.905c0 21.644 17.546 39.19 39.19 39.19v0h39.19c21.644 0 39.19-17.546 39.19-39.19v0-391.905c0-21.644-17.546-39.19-39.19-39.19v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["distributions"],"grid":0},"attrs":[{}],"properties":{"order":601,"id":3,"name":"distributions","prevSize":32,"code":59784},"setIdx":0,"setId":1,"iconIdx":4},{"icon":{"paths":["M831.999 1023.999h-640c-105.99-0.12-191.88-86.008-192-191.988v-640.012c0.12-105.99 86.008-191.88 191.988-192h640.011c105.99 0.12 191.88 86.008 192 191.988v640.012c-0.12 105.99-86.008 191.88-191.988 192h-0.012zM192.001 96.001c-52.995 0.060-95.94 43.005-96 95.994v640.006c0.060 52.995 43.005 95.94 95.994 96h640.006c52.995-0.060 95.94-43.005 96-95.994v-640.006c-0.060-52.995-43.005-95.94-95.994-96h-0.006zM256 192.001h511.999c35.346 0 64 28.654 64 64v0 127.999c0 35.346-28.654 64-64 64v0h-511.999c-35.346 0-64-28.654-64-64v0-127.999c0-35.346 28.654-64 64-64v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["pin-to-top"],"grid":0},"attrs":[],"properties":{"order":603,"id":4,"name":"pin-to-top","prevSize":32,"code":59780},"setIdx":0,"setId":1,"iconIdx":5},{"icon":{"paths":["M831.999 1023.999h-640c-105.99-0.12-191.88-86.008-192-191.988v-640.012c0.12-105.99 86.008-191.88 191.988-192h640.011c105.99 0.12 191.88 86.008 192 191.988v640.012c-0.12 105.99-86.008 191.88-191.988 192h-0.012zM192.001 96.001c-52.995 0.060-95.94 43.005-96 95.994v640.006c0.060 52.995 43.005 95.94 95.994 96h640.006c52.995-0.060 95.94-43.005 96-95.994v-640.006c-0.060-52.995-43.005-95.94-95.994-96h-0.006zM256 576h511.999c35.346 0 64 28.654 64 64v0 127.999c0 35.346-28.654 64-64 64v0h-511.999c-35.346 0-64-28.654-64-64v0-127.999c0-35.346 28.654-64 64-64v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["pin-to-bottom"],"grid":0},"attrs":[],"properties":{"order":602,"id":5,"name":"pin-to-bottom","prevSize":32,"code":59781},"setIdx":0,"setId":1,"iconIdx":6},{"icon":{"paths":["M831.999 1023.999h-640c-105.99-0.12-191.88-86.008-192-191.988v-640.012c0.12-105.99 86.008-191.88 191.988-192h640.011c105.99 0.12 191.88 86.008 192 191.988v640.012c-0.12 105.99-86.008 191.88-191.988 192h-0.012zM192.001 96.001c-52.995 0.060-95.94 43.005-96 95.994v640.006c0.060 52.995 43.005 95.94 95.994 96h640.006c52.995-0.060 95.94-43.005 96-95.994v-640.006c-0.060-52.995-43.005-95.94-95.994-96h-0.006zM256 384.001h511.999c35.346 0 64 28.654 64 64v0 127.999c0 35.346-28.654 64-64 64v0h-511.999c-35.346 0-64-28.654-64-64v0-127.999c0-35.346 28.654-64 64-64v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["flexible"],"grid":0},"attrs":[],"properties":{"order":604,"id":6,"name":"flexible","prevSize":32,"code":59782},"setIdx":0,"setId":1,"iconIdx":7},{"icon":{"paths":["M798.952 967.111v-910.222c0-31.419-25.47-56.889-56.889-56.889-12.87 0-24.744 4.274-34.278 11.481l0.144-0.104-606.815 455.111c-13.878 10.489-22.756 26.963-22.756 45.511s8.878 35.022 22.611 45.407l0.144 0.104 606.815 455.111c9.389 7.104 21.263 11.378 34.133 11.378 31.419 0 56.889-25.47 56.889-56.889v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["arrow-left"],"grid":0},"attrs":[{}],"properties":{"order":595,"id":7,"name":"arrow-left-contained","prevSize":32,"code":59776},"setIdx":0,"setId":1,"iconIdx":8},{"icon":{"paths":["M56.889 799.578h910.222c31.419 0 56.889-25.47 56.889-56.889 0-12.87-4.274-24.744-11.481-34.278l0.104 0.144-455.111-606.815c-10.489-13.878-26.963-22.756-45.511-22.756s-35.022 8.878-45.407 22.611l-0.104 0.144-455.111 606.815c-7.104 9.389-11.378 21.263-11.378 34.133 0 31.419 25.47 56.889 56.889 56.889v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["arrow-up-contained"],"grid":0},"attrs":[{}],"properties":{"order":594,"id":8,"name":"arrow-up-contained","prevSize":32,"code":59777},"setIdx":0,"setId":1,"iconIdx":9},{"icon":{"paths":["M239.693 56.889v910.222c0 31.419 25.47 56.889 56.889 56.889 12.87 0 24.744-4.274 34.278-11.481l-0.144 0.104 606.815-455.111c13.878-10.489 22.756-26.963 22.756-45.511s-8.878-35.022-22.611-45.407l-0.144-0.104-606.815-455.111c-9.389-7.104-21.263-11.378-34.133-11.378-31.419 0-56.889 25.47-56.889 56.889v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["arrow-right-contained"],"grid":0},"attrs":[{}],"properties":{"order":593,"id":9,"name":"arrow-right-contained","prevSize":32,"code":59778},"setIdx":0,"setId":1,"iconIdx":10},{"icon":{"paths":["M967.111 224.541h-910.222c-31.419 0-56.889 25.47-56.889 56.889 0 12.87 4.274 24.744 11.481 34.278l-0.104-0.144 455.111 606.815c10.489 13.878 26.963 22.756 45.511 22.756s35.022-8.878 45.407-22.611l0.104-0.144 455.111-606.815c7.104-9.389 11.378-21.263 11.378-34.133 0-31.419-25.47-56.889-56.889-56.889v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["arrow-down-contained"],"grid":0},"attrs":[{}],"properties":{"order":592,"id":10,"name":"arrow-down-contained","prevSize":32,"code":59779},"setIdx":0,"setId":1,"iconIdx":11},{"icon":{"paths":["M967.112 986.074h-872.298c-52.342-0.057-94.759-42.473-94.815-94.809v-796.45c0-31.419 25.469-56.889 56.889-56.889s56.889 25.469 56.889 56.889v0 777.482h853.334c31.419 0 56.889 25.469 56.889 56.889s-25.469 56.889-56.889 56.889v0zM266.666 558.185c266.247-55.286 495.261-188.346 668.625-374.031l0.674-0.729c7.613-8.379 12.272-19.558 12.272-31.826 0-26.179-21.223-47.401-47.401-47.401-14.010 0-26.599 6.078-35.278 15.739l-0.039 0.044c-161.407 172.208-373.614 295.024-612.649 344.529l-7.535 1.305c-21.202 5.022-36.733 23.792-36.733 46.188 0 26.166 21.2 47.382 47.361 47.404h0.002c0.037 0 0.083 0 0.128 0 3.751 0 7.397-0.445 10.89-1.287l-0.316 0.065zM834.372 417.185v379.259c0 10.474 8.49 18.962 18.962 18.962v0h75.851c10.474 0 18.962-8.49 18.962-18.962v0-379.259c0-10.474-8.49-18.962-18.962-18.964h-75.85c0 0-0.002 0-0.002 0-10.474 0-18.964 8.49-18.964 18.964v0zM834.372 417.185v379.259c0 10.474 8.49 18.962 18.962 18.962v0h75.851c10.474 0 18.962-8.49 18.962-18.962v0-379.259c0-10.474-8.49-18.962-18.962-18.964h-75.85c0 0-0.002 0-0.002 0-10.474 0-18.964 8.49-18.964 18.964v0zM625.779 493.034v303.408c0 10.474 8.49 18.962 18.962 18.962v0h75.851c10.474 0 18.962-8.49 18.962-18.962v0-303.408c0-10.474-8.49-18.962-18.962-18.964h-75.85c-0.002 0-0.002 0-0.003 0-10.474 0-18.964 8.49-18.964 18.964 0 0.002 0 0.002 0 0.003v0zM625.779 493.034v303.408c0 10.474 8.49 18.962 18.962 18.962v0h75.851c10.474 0 18.962-8.49 18.962-18.962v0-303.408c0-10.474-8.49-18.962-18.962-18.964h-75.85c-0.002 0-0.002 0-0.003 0-10.474 0-18.964 8.49-18.964 18.964 0 0.002 0 0.002 0 0.003v0zM417.186 606.812v189.63c0 10.474 8.49 18.962 18.962 18.962v0h75.851c10.474 0 18.962-8.49 18.962-18.962v0-189.627c0-10.474-8.49-18.962-18.962-18.962v0h-75.85c0 0-0.002 0-0.002 0-10.474 0-18.962 8.49-18.962 18.962v0zM417.186 606.812v189.63c0 10.474 8.49 18.962 18.962 18.962v0h75.851c10.474 0 18.962-8.49 18.962-18.962v0-189.627c0-10.474-8.49-18.962-18.962-18.962v0h-75.85c0 0-0.002 0-0.002 0-10.474 0-18.962 8.49-18.962 18.962v0zM208.592 682.666v113.778c0 10.474 8.49 18.962 18.962 18.962h75.851c10.474 0 18.962-8.49 18.962-18.962v0-113.778c0-10.474-8.49-18.962-18.962-18.964h-75.85c0 0-0.002 0-0.002 0-10.474 0-18.964 8.49-18.964 18.964v0zM208.592 682.666v113.778c0 10.474 8.49 18.962 18.962 18.962h75.851c10.474 0 18.962-8.49 18.962-18.962v0-113.778c0-10.474-8.49-18.962-18.962-18.964h-75.85c0 0-0.002 0-0.002 0-10.474 0-18.964 8.49-18.964 18.964v0zM208.592 303.407c0 31.419 25.469 56.889 56.889 56.889s56.889-25.469 56.889-56.889c0-31.419-25.469-56.889-56.889-56.889 0 0 0 0 0 0v0c-31.419 0-56.889 25.469-56.889 56.889 0 0 0 0 0 0v0zM303.407 113.778c0 31.418 25.471 56.889 56.889 56.889s56.889-25.469 56.889-56.889c0-31.419-25.469-56.889-56.889-56.889v0c-31.419 0-56.889 25.469-56.889 56.889 0 0 0 0 0 0.002v0zM455.111 265.482c0 31.419 25.471 56.889 56.889 56.889s56.889-25.469 56.889-56.889c0-31.419-25.469-56.889-56.889-56.889v0c-31.419 0-56.889 25.469-56.889 56.889v0zM587.851 113.778c0 31.419 25.469 56.889 56.889 56.889s56.889-25.469 56.889-56.889c0-31.419-25.469-56.889-56.889-56.889v0c-31.419 0-56.889 25.469-56.889 56.889v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["figures"],"grid":0},"attrs":[],"properties":{"order":598,"id":11,"name":"figures","prevSize":32,"code":59774},"setIdx":0,"setId":1,"iconIdx":12},{"icon":{"paths":["M853.333 1024h-682.667c-94.213-0.107-170.56-76.452-170.667-170.656v-682.677c0.107-94.213 76.452-170.56 170.656-170.667h682.677c94.213 0.107 170.56 76.452 170.667 170.656v682.677c-0.107 94.213-76.452 170.56-170.656 170.667h-0.011zM170.667 85.333c-47.107 0.053-85.28 38.227-85.333 85.328v682.672c0.053 47.107 38.227 85.28 85.328 85.333h682.672c47.107-0.053 85.28-38.227 85.333-85.328v-682.672c-0.053-47.107-38.227-85.28-85.328-85.333h-0.005zM801.235 423.117l-38.679-4.904c-2.191-5.797-4.568-11.593-7.133-17.169l23.928-30.839c7.881-9.921 12.644-22.628 12.644-36.447 0-16.423-6.727-31.273-17.573-41.949l-42.112-42.072c-10.671-10.947-25.561-17.737-42.039-17.737-13.823 0-26.529 4.779-36.559 12.775l0.119-0.091-30.84 23.856c-5.649-2.527-11.372-4.905-17.169-7.060l-4.937-38.719c-3.705-29.496-28.628-52.088-58.828-52.096h-60.155c-30.192 0.007-55.103 22.603-58.753 51.805l-0.029 0.291-4.944 38.719c-5.831 2.155-11.555 4.533-17.129 7.060l-30.876-24.004c-9.92-7.773-22.579-12.467-36.333-12.467-16.435 0-31.304 6.699-42.028 17.516l-42.101 42.067c-10.924 10.687-17.696 25.576-17.696 42.048 0 13.813 4.763 26.515 12.736 36.551l-0.092-0.121 23.929 30.839c-2.564 5.575-4.941 11.372-7.097 17.169l-38.793 4.904c-29.432 3.828-51.941 28.701-52.024 58.848v60.208c0.048 30.176 22.623 55.064 51.803 58.753l0.292 0.031 38.681 4.904c2.192 5.797 4.533 11.52 7.097 17.169l-23.893 30.84c-7.879 9.927-12.64 22.639-12.64 36.461 0 16.448 6.741 31.321 17.611 42.008l42.105 42.072c10.711 10.883 25.6 17.627 42.065 17.627 13.797 0 26.488-4.736 36.537-12.669l-0.124 0.095 30.843-24.007q8.473 3.908 17.129 7.14l4.944 38.639c3.657 29.52 28.575 52.148 58.781 52.173h60.163c30.187-0.043 55.088-22.615 58.793-51.8l0.031-0.293 4.904-38.719c5.831-2.156 11.555-4.535 17.203-7.060l30.879 24.001c9.916 7.792 22.58 12.496 36.341 12.496 16.437 0 31.307-6.711 42.017-17.543l42.069-42.069c10.953-10.677 17.747-25.576 17.747-42.063 0-13.811-4.768-26.508-12.748-36.536l0.092 0.12-23.967-30.84q3.848-8.476 7.133-17.169l38.684-4.977c29.468-3.731 52.033-28.612 52.093-58.777v-60.207c-0.048-30.177-22.624-55.067-51.807-58.753l-0.292-0.031zM788.417 537.043l-54.363 6.985c-12.985 1.681-23.455 10.843-27.032 22.959l-0.059 0.229c-4.809 16.628-10.959 31.075-18.589 44.573l0.532-1.024c-2.636 4.576-4.192 10.063-4.192 15.913 0 7.543 2.585 14.481 6.917 19.979l-0.052-0.069 33.553 43.179-35.373 35.3-43.252-33.593c-5.416-4.199-12.307-6.731-19.789-6.731-5.82 0-11.283 1.532-16.007 4.215l0.16-0.084c-12.519 7.116-27.019 13.267-42.249 17.696l-1.447 0.36c-12.333 3.665-21.476 14.143-23.131 26.968l-0.017 0.163-6.952 54.397h-50.159l-6.912-54.397c-1.747-12.988-10.913-23.449-23.031-27.065l-0.231-0.059c-16.595-4.772-31.019-10.897-44.491-18.511l1.016 0.528c-4.58-2.657-10.077-4.225-15.941-4.225-7.549 0-14.491 2.599-19.98 6.949l0.067-0.051-43.14 33.439-35.375-35.368 33.516-43.031c4.281-5.441 6.865-12.393 6.865-19.948 0-5.833-1.54-11.305-4.237-16.033l0.084 0.16c-7.108-12.476-13.257-26.924-17.696-42.101l-0.363-1.447c-3.608-12.379-14.087-21.573-26.928-23.244l-0.163-0.017-54.399-6.985v-50.091l54.584-6.912c12.872-1.864 23.208-10.993 26.804-23.031l0.060-0.232c4.832-16.684 11.007-31.18 18.667-44.724l-0.535 1.027c2.58-4.533 4.101-9.96 4.101-15.743 0-7.552-2.595-14.497-6.94-19.995l0.052 0.068-33.512-43.107 35.411-35.375 43.289 33.665c5.475 4.079 12.372 6.529 19.841 6.529 5.753 0 11.168-1.455 15.895-4.016l-0.176 0.088c12.513-7.155 27-13.331 42.225-17.773l1.437-0.359c12.375-3.621 21.556-14.115 23.205-26.964l0.017-0.161 6.912-54.325h50.164l6.912 54.325c1.615 12.992 10.788 23.476 22.921 26.995l0.227 0.056c16.639 4.824 31.085 10.947 44.603 18.528l-1.055-0.543c4.597 2.757 10.143 4.388 16.069 4.388 7.535 0 14.455-2.636 19.887-7.035l-0.059 0.047 43.139-33.516 35.34 35.375-33.485 43.104c-4.257 5.469-6.825 12.436-6.825 20.003 0 5.805 1.512 11.257 4.163 15.984l-0.085-0.165c7.113 12.496 13.276 26.967 17.731 42.167l0.365 1.455c3.645 12.34 14.109 21.496 26.927 23.171l0.164 0.017 54.403 6.912zM512 358.688c-0.047 0-0.103 0-0.159 0-84.761 0-153.475 68.713-153.475 153.475s68.713 153.475 153.475 153.475c84.761 0 153.475-68.713 153.475-153.475 0-42.381-17.179-80.752-44.953-108.525v0c-27.728-27.749-66.037-44.921-108.356-44.949h-0.005zM512 600.44c-0.036 0-0.079 0-0.12 0-48.888 0-88.519-39.632-88.519-88.519s39.632-88.519 88.519-88.519c48.888 0 88.519 39.632 88.519 88.519 0 24.436-9.901 46.56-25.912 62.579v0c-15.989 16.005-38.079 25.915-62.481 25.941h-0.005z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["box-settings"],"grid":0},"attrs":[],"properties":{"order":597,"id":12,"name":"box-settings","prevSize":32,"code":59773},"setIdx":0,"setId":1,"iconIdx":13},{"icon":{"paths":["M853.334 1024h-170.666c-25.706 0-46.545-20.839-46.545-46.545s20.839-46.545 46.545-46.545v0h170.666c42.828-0.041 77.535-34.748 77.575-77.572v-170.671c0-25.706 20.839-46.545 46.545-46.545s46.545 20.839 46.545 46.545v0 170.666c-0.099 94.217-76.449 170.567-170.657 170.666h-0.010zM341.334 1024h-170.666c-94.217-0.099-170.567-76.449-170.666-170.657v-170.676c0-25.706 20.839-46.545 46.545-46.545s46.545 20.839 46.545 46.545v0 170.666c0.041 42.828 34.748 77.535 77.572 77.575h170.671c25.706 0 46.545 20.839 46.545 46.545s-20.839 46.545-46.545 46.545v0zM977.455 387.879c-25.703-0.007-46.538-20.842-46.545-46.545v0-170.666c-0.041-42.828-34.748-77.535-77.572-77.575h-170.671c-25.706 0-46.545-20.839-46.545-46.545s20.839-46.545 46.545-46.545v0h170.666c94.217 0.099 170.567 76.449 170.666 170.657v170.676c-0.007 25.703-20.842 46.538-46.545 46.545v0zM46.545 387.879c-25.703-0.007-46.538-20.842-46.545-46.545v0-170.666c0.099-94.217 76.449-170.567 170.657-170.666h170.676c25.706 0 46.545 20.839 46.545 46.545s-20.839 46.545-46.545 46.545v0h-170.666c-42.828 0.041-77.535 34.748-77.575 77.572v170.671c-0.007 25.703-20.842 46.538-46.545 46.545v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["full-screen"],"grid":0},"attrs":[],"properties":{"order":596,"id":13,"name":"full-screen","prevSize":32,"code":59771},"setIdx":0,"setId":1,"iconIdx":14},{"icon":{"paths":["M776.258 1024h-528.515c-136.757-0.166-247.576-110.985-247.742-247.726v-528.531c0.153-136.761 110.979-247.587 247.726-247.742h132.144c27.365 0 49.548 22.184 49.548 49.548s-22.184 49.548-49.548 49.548v0h-132.128c-82.057 0.093-148.552 66.588-148.645 148.636v528.524c0.104 82.052 66.593 148.541 148.636 148.645h528.526c82.047-0.116 148.529-66.598 148.645-148.634v-132.139c0-27.365 22.184-49.548 49.548-49.548s49.548 22.184 49.548 49.548v0 132.128c-0.178 136.752-110.988 247.564-247.725 247.742h-0.017zM974.452-0h-330.322c-27.365 0-49.548 22.184-49.548 49.548s22.184 49.548 49.548 49.548v0h210.706l-377.866 377.871c-8.889 8.953-14.383 21.287-14.383 34.904 0 27.362 22.181 49.544 49.544 49.544 13.618 0 25.952-5.494 34.907-14.386l377.868-377.863v210.706c0 27.365 22.184 49.548 49.548 49.548s49.548-22.184 49.548-49.548v0-330.322c0-27.365-22.184-49.548-49.548-49.548v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["new-tab"],"grid":0},"attrs":[],"properties":{"order":595,"id":14,"name":"new-tab","prevSize":32,"code":59772},"setIdx":0,"setId":1,"iconIdx":15},{"icon":{"paths":["M0.002 161.281v480.809c0 48.689 42.604 91.293 91.293 91.293h359.084c42.604 73.034 121.723 115.638 213.016 115.638 54.776 0 109.551-18.259 152.155-48.689l-6.087 6.087 133.896 133.896c18.259 18.259 48.689 18.259 66.947 0s18.259-48.689 0-66.947l-133.896-133.896-6.087 6.087c30.43-42.604 48.689-97.379 48.689-152.155 0-66.947-24.345-121.723-66.947-170.413v-261.706c0-48.689-42.604-91.293-91.293-91.293h-669.479c-48.689 0-91.293 42.604-91.293 91.293zM791.206 161.281v206.931c-30.43-18.259-60.862-30.43-91.293-36.517l60.862-97.379c6.087-12.172 6.087-30.43-12.172-42.604-12.172-6.087-30.43-6.087-42.604 12.172l-73.034 127.81c-42.604 6.087-85.206 24.345-121.723 48.689l-54.776-54.776c-6.087-6.087-18.259-12.172-24.345-6.087-12.172 0-18.259 6.087-24.345 18.259l-60.862 127.81-103.465-225.189c-6.087-12.172-18.259-18.259-30.43-18.259s-24.345 12.172-24.345 24.345l-91.293 304.308c-6.087 18.259 6.087 30.43 18.259 36.517 18.259 6.087 30.43-6.087 36.517-18.259l66.947-225.189 91.293 200.844c6.087 12.172 18.259 18.259 24.345 18.259 12.172 0 24.345-6.087 30.43-18.259l73.034-146.068 24.345 24.345c-42.604 48.689-66.947 103.465-66.947 170.413 0 30.43 6.087 60.862 12.172 85.206h-316.482c-18.259 0-30.43-12.172-30.43-30.43v-486.894c0-18.259 12.172-30.43 30.43-30.43h669.479c18.259 0 30.43 18.259 30.43 30.43zM827.723 593.4c0 91.293-73.034 170.413-170.413 170.413-91.293 0-170.413-73.034-170.413-170.413 0-91.293 73.034-170.413 170.413-170.413s170.413 79.121 170.413 170.413z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["compare"],"grid":0},"attrs":[],"properties":{"order":594,"id":15,"name":"compare","prevSize":32,"code":59770},"setIdx":0,"setId":1,"iconIdx":16},{"icon":{"paths":["M1023.974 961.382c0 0.006 0 0.012 0 0.019 0 34.606-28.053 62.66-62.66 62.66-0.007 0-0.013 0-0.020 0h-764.789c-0.019 0-0.041 0-0.063 0-108.479 0-196.418-87.94-196.418-196.418 0-0.010 0-0.022 0-0.032v0.001-764.669c0-0.095-0.001-0.206-0.001-0.319 0-8.556 1.75-16.704 4.912-24.105l-0.152 0.401c3.29-7.937 7.867-14.712 13.537-20.396l-0.001 0.001c5.681-5.675 12.444-10.268 19.954-13.442l0.413-0.155c6.638-2.294 14.368-3.976 22.37-4.726l0.402-0.031c1.011-0.070 2.192-0.111 3.383-0.111 7.947 0 15.476 1.795 22.203 5.002l-0.312-0.135c15.461 6.484 27.5 18.562 33.779 33.64l0.152 0.411c2.988 6.983 4.726 15.109 4.726 23.641 0 0.135 0 0.268-0.001 0.402v-0.020 764.608c0 0.057 0 0.124 0 0.192 0 9.744 1.984 19.026 5.571 27.462l-0.174-0.459c10.967 26.015 36.25 43.946 65.724 43.961h764.789c17.289 0.056 32.939 7.031 44.334 18.299l-0.006-0.006c11.338 11.342 18.35 27.008 18.35 44.312 0 0.004 0 0.009 0 0.013v0zM295.374 794.931l499.471-499.471c8.669-8.505 14.040-20.341 14.040-33.434 0-25.861-20.965-46.826-46.826-46.826-13.089 0-24.924 5.37-33.422 14.029l-499.486 499.484c-8.666 8.505-14.036 20.34-14.036 33.429 0 25.861 20.965 46.826 46.826 46.826 13.092 0 24.929-5.373 33.426-14.033l0.007-0.007zM758.018 522.087h-1.708c-1.008-0.044-2.189-0.069-3.377-0.069-13.382 0-26.025 3.167-37.219 8.792l0.477-0.218c-8.54 4.116-15.422 10.527-20.002 18.438l-0.117 0.219c-1.888 3.111-3.006 6.87-3.006 10.891 0 0.299 0.006 0.594 0.018 0.89l-0.001-0.042c0.14 5.29 2.074 10.101 5.212 13.878l-0.029-0.037c3.137 3.758 7.28 6.579 12.012 8.060l0.181 0.048c3.813 1.276 8.215 2.088 12.782 2.253l0.083 0.003c4.485-0.146 8.752-0.783 12.841-1.857l-0.401 0.089c2.303-0.776 4.993-1.356 7.773-1.633l0.157-0.013c5.452 0.101 10.411 2.138 14.234 5.451l-0.028-0.023c6.462 5.249 12.052 11.206 16.764 17.83l0.186 0.277c6.159 8.231 15.852 22.011 29.51 42.070l12.742 18.719c-22.864 27.62-41.398 49.324-55.301 64.751-10.117 12.081-21.146 22.781-33.183 32.26l-0.473 0.359c-7 5.954-13.187 12.489-18.618 19.632l-0.222 0.306c-2.726 3.303-5.006 7.11-6.665 11.234l-0.102 0.29-0.549 1.402 0.124 1.463c0.827 8.518 4.485 16.054 10.009 21.778l-0.010-0.010c3.063 3.388 6.775 6.125 10.95 8.025l0.208 0.085c4.015 1.774 8.698 2.805 13.62 2.805 0.078 0 0.154 0 0.231-0.001h-0.012c4.672-0.132 9.134-0.724 13.436-1.735l-0.449 0.089c5.070-1.239 9.504-3.434 13.309-6.399l-0.078 0.059c14.591-13.007 27.934-26.506 40.392-40.8l0.459-0.538c13.536-15.546 30.059-35.179 50.363-59.874 17.763 26.675 35.687 49.849 55.082 71.689l-0.574-0.658c6.529 8.124 14.57 14.743 23.733 19.5l0.411 0.195c8.974 4.728 19.496 7.836 30.655 8.644l0.258 0.015c1.117 0.057 2.425 0.089 3.74 0.089 11.725 0 22.851-2.571 32.842-7.18l-0.487 0.202c5.31-2.337 9.674-5.995 12.798-10.567l0.066-0.102c2.903-4.169 4.637-9.339 4.637-14.915 0-0.158-0.001-0.316-0.004-0.473v0.023c0.018-0.281 0.026-0.61 0.026-0.942 0-3.064-0.824-5.937-2.264-8.405l0.042 0.079c-1.68-2.916-4.034-5.271-6.861-6.902l-0.089-0.048c-5.584-3.011-12.061-5.54-18.861-7.252l-0.588-0.126c-5.663-1.4-10.597-3.219-15.261-5.503l0.445 0.198c-12.968-7.521-23.839-17.187-32.484-28.628l-0.198-0.272c-11.462-14.389-26.339-35.485-44.328-62.559 20.486-24.938 37.559-44.935 52.070-61.214 12.996-14.755 26.477-28.208 40.775-40.755l0.502-0.432 1.523-1.981c4.064-8.127 6.589-17.661 6.948-27.744l0.003-0.12c0.035-0.528 0.056-1.144 0.056-1.766 0-7.35-2.826-14.040-7.45-19.043l0.018 0.019c-2.533-2.839-5.673-5.079-9.223-6.525l-0.167-0.060c-2.911-1.215-6.294-1.921-9.841-1.921-0.442 0-0.881 0.010-1.318 0.032l0.061-0.003c-0.132-0.001-0.288-0.003-0.445-0.003-7.103 0-13.777 1.831-19.578 5.047l0.208-0.105c-8.2 5.256-15.23 11.423-21.228 18.492l-0.111 0.135c-13.963 14.541-37.193 42.131-69.080 82.099-13.718-21.522-24.876-37.863-33.169-48.503-8.535-11.67-18.755-21.503-30.419-29.358l-0.432-0.274c-11.039-7.085-24.509-11.297-38.963-11.303h-0.001zM227.266 52.67c-1.239-2.839-2.085-6.131-2.371-9.582l-0.007-0.113c-0.064-0.729-0.101-1.577-0.101-2.433 0-9.677 4.645-18.268 11.825-23.667l0.076-0.054c7.096-5.070 15.949-8.108 25.51-8.108 0.56 0 1.117 0.010 1.673 0.031l-0.080-0.003c0.423-0.025 0.916-0.040 1.414-0.040 5.732 0 11.026 1.88 15.296 5.059l-0.069-0.048c5.303 4.17 9.709 9.207 13.066 14.933l0.135 0.249c13.868 24.545 26.607 53.178 36.618 83.062l1.030 3.549c7.956 22.072 14.146 38.35 18.779 49.66 3.658 8.475 7.742 16.92 12.195 25.090 7.118-18.038 14.599-41.28 20.816-65.034l1.042-4.687c6.371-21.676 11.494-38.747 15.426-51.46 4.778-14.554 9.67-26.565 15.261-38.175l-0.811 1.866c3.499-7.33 8.219-13.533 13.961-18.603l0.061-0.054c5.761-4.803 13.239-7.725 21.396-7.742h0.004c9.137 0.413 17.451 3.625 24.186 8.794l-0.102-0.075c3.749 1.766 6.825 4.431 9.034 7.725l0.050 0.079c2.491 3.509 4.097 7.804 4.416 12.454l0.004 0.076c-0.236 6.278-1.958 12.103-4.823 17.201l0.098-0.19c-15.091 35.089-28.779 69.080-40.485 100.51-11.341 31.155-22.468 65.91-33.017 103.224l-0.031 0.092c-6.25 20.944-13.048 41.308-20.182 60.423-3.354 9.542-6.25 17.315-8.628 23.169-1.832 4.865-3.791 8.974-6.046 12.89l0.224-0.421c-7.776 11.25-17.023 20.807-27.602 28.672l-0.322 0.228c-9.882 7.617-22.435 12.213-36.062 12.224h-0.003c-0.637 0.041-1.38 0.063-2.129 0.063-0.538 0-1.073-0.012-1.605-0.035l0.076 0.003c-13.424-0.029-26.138-3.050-37.516-8.429l0.537 0.228c-9.746-4.425-17.86-10.947-24.032-19.029l-0.11-0.151c-4.466-5.501-7.387-12.419-8.009-19.989l-0.009-0.132c-0.025-0.416-0.040-0.903-0.040-1.393 0-7.451 3.352-14.118 8.631-18.577l0.037-0.029c5.322-3.985 12.025-6.393 19.289-6.431h0.009c0.284-0.012 0.618-0.019 0.953-0.019 5.136 0 9.886 1.654 13.748 4.456l-0.067-0.047 5.701 3.996c2.189 1.656 4.674 3.134 7.317 4.323l0.243 0.098 1.248 0.639c1.733 0.884 3.774 1.411 5.938 1.433h0.007c2.53 0 10.212 0 17.225-14.695 6.525-15.136 12.018-32.91 15.611-51.363l0.272-1.681c-15.306-22.244-29.876-47.732-42.309-74.416l-1.377-3.291-13.657-31.644q-3.017-7.317-16.524-36.827c-9.141-21.635-17.788-39.124-27.286-56.074l1.465 2.845c-2.085-3.904-4.27-8.717-6.175-13.669l-0.316-0.937zM280.431 331.855l-0.004 0.012z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["axes-props"],"grid":0},"attrs":[],"properties":{"order":240,"id":16,"name":"axes-props","prevSize":32,"code":59769},"setIdx":0,"setId":1,"iconIdx":17},{"icon":{"paths":["M512 1024c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512v0c-0.335 282.636-229.365 511.667-511.968 512h-0.032zM512 96c-229.751 0-416 186.249-416 416s186.249 416 416 416c229.751 0 416-186.249 416-416v0c-0.275-229.641-186.36-415.727-415.974-416h-0.026zM512 432c-26.51 0-48 21.491-48 48v0 256.001c0 26.51 21.491 48 48 48s48-21.491 48-48v0-256.001c0-26.51-21.491-48-48-48v0zM512 224c-35.346 0-64.001 28.655-64.001 64.001s28.655 64.001 64.001 64.001c35.346 0 64.001-28.655 64.001-64.001v0c-0.048-35.327-28.673-63.953-63.996-64.001h-0.005z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["info-circle-outline"],"grid":0},"attrs":[],"properties":{"order":593,"id":17,"name":"info-circle-outline","prevSize":32,"code":59768},"setIdx":0,"setId":1,"iconIdx":18},{"icon":{"paths":["M1023.996 511.989c0 254.891-206.63 461.521-461.521 461.521-125.791 0-239.828-50.326-323.077-131.939l0.076 0.074c-10.886-10.507-17.646-25.229-17.646-41.529 0-31.861 25.829-57.691 57.691-57.691 15.889 0 30.278 6.424 40.711 16.815l-0.001-0.001c62.443 61.366 148.138 99.248 242.679 99.248 191.267 0 346.319-155.052 346.319-346.319s-155.052-346.319-346.319-346.319c-175.952 0-321.255 131.214-343.398 301.13l-0.185 1.744h54.701c0.001 0 0.001 0 0.003 0 23.893 0 43.264 19.37 43.264 43.264 0 11.949-4.843 22.766-12.675 30.596l-115.38 115.408c-7.827 7.831-18.644 12.676-30.592 12.676s-22.764-4.845-30.592-12.676l-115.38-115.408c-7.831-7.83-12.675-18.647-12.675-30.596 0-23.893 19.37-43.264 43.264-43.264 0.001 0 0.001 0 0.003 0h59.877c22.798-235.581 219.774-418.259 459.416-418.259 254.846 0 461.441 206.593 461.441 461.441 0 0.030 0 0.061 0 0.091v-0.005zM531.883 542.585l115.38 115.38c7.827 7.814 18.633 12.648 30.567 12.648 23.895 0 43.264-19.37 43.264-43.264 0-11.936-4.834-22.743-12.649-30.57v0l-102.704-102.704v-212.846c0-23.896-19.372-43.268-43.268-43.268s-43.268 19.372-43.268 43.268v0 230.761c0 0.001 0 0.004 0 0.007 0 11.947 4.845 22.761 12.676 30.589v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["update-time"],"grid":0},"attrs":[],"properties":{"order":494,"id":18,"name":"update-time","prevSize":32,"code":59767},"setIdx":0,"setId":1,"iconIdx":19},{"icon":{"paths":["M1023.964 511.957c0 31.373-25.433 56.807-56.807 56.807v0h-910.387c-31.373 0-56.807-25.433-56.807-56.807s25.433-56.807 56.807-56.807v0h910.387c31.373 0 56.807 25.433 56.807 56.807v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["minus"],"grid":0},"attrs":[],"properties":{"order":591,"id":19,"name":"minus","prevSize":32,"code":59766},"setIdx":0,"setId":1,"iconIdx":20},{"icon":{"paths":["M215.991 50.239c-6.586-4.076-14.574-6.493-23.127-6.493-24.54 0-44.436 19.893-44.436 44.436 0 16.115 8.579 30.227 21.42 38.019l0.196 0.111 90.884 54.887-202.461 350.7c-8.732 14.87-13.888 32.753-13.888 51.839 0 38.174 20.629 71.53 51.352 89.525l0.488 0.264 425.049 245.405c14.87 8.732 32.753 13.89 51.84 13.89 38.177 0 71.533-20.631 89.528-51.355l0.264-0.488 221.29-383.289c4.242-7.225 6.747-15.909 6.747-25.18 0-18.543-10.019-34.741-24.94-43.484l-0.238-0.13-522.17-301.477zM143.637 562.128l193.828-335.744 424.095 244.857zM1015.839 837.74c0.314 2.816 0.494 6.079 0.494 9.385 0 49.353-40.009 89.363-89.363 89.363s-89.363-40.009-89.363-89.363c0-3.307 0.18-6.569 0.53-9.782l-0.034 0.397c0-78.992 88.869-197.487 88.869-197.487s88.869 118.49 88.869 197.483z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["color-scale-on"],"grid":0},"attrs":[],"properties":{"order":522,"id":20,"name":"color-scale-on","prevSize":32,"code":59763},"setIdx":0,"setId":1,"iconIdx":21},{"icon":{"paths":["M57.44 157.954c-0.308-0.007-0.671-0.010-1.034-0.010-28.983 0-52.478 23.495-52.478 52.478 0 28.62 22.91 51.888 51.391 52.468l0.054 0.002 125.368 2.47 0.012 478.251c0 67.626 54.821 122.449 122.449 122.449v0h579.651c67.626 0 122.449-54.821 122.449-122.449v0-522.709c0-32.848-26.627-59.476-59.476-59.476v0h-712.093zM285.704 479.821l-0.005-213.437h614.65v213.434z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["color-scale-off"],"grid":0},"attrs":[],"properties":{"order":523,"id":21,"name":"color-scale-off","prevSize":32,"code":59764},"setIdx":0,"setId":1,"iconIdx":22},{"icon":{"paths":["M512 0c-282.769 0-512 229.231-512 512s229.231 512 512 512c282.769 0 512-229.231 512-512v0c-0.327-282.639-229.362-511.673-511.969-512h-0.031zM512 99.097c0.169 0 0.367 0 0.565 0 227.727 0 412.337 184.609 412.337 412.337 0 83.743-24.965 161.656-67.858 226.701l0.958-1.547c-79.076-106.662-204.554-175.040-346.002-175.040-141.451 0-266.931 68.38-345.186 173.887l-0.819 1.157c-41.935-63.499-66.9-141.412-66.9-225.155 0-227.729 184.611-412.341 412.341-412.341 0.198 0 0.395 0 0.593 0h-0.031zM236.186 818.391c23.633-73.514 147.951-157.746 275.814-157.746 127.835 0 252.178 84.232 275.814 157.746-72.571 66.060-169.469 106.512-275.814 106.512s-203.243-40.452-276.145-106.808l0.33 0.296zM512 545.032c91.215 0 165.162-73.945 165.162-165.162s-73.945-165.162-165.162-165.162c-91.215 0-165.162 73.945-165.162 165.162v0c0.099 91.177 73.985 165.063 165.151 165.162h0.009zM512 313.807c36.486 0 66.065 29.579 66.065 66.065s-29.579 66.065-66.065 66.065c-36.486 0-66.065-29.579-66.065-66.065v0c0.050-36.466 29.597-66.015 66.060-66.065h0.005z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["avatar"],"grid":0},"attrs":[],"properties":{"order":524,"id":22,"name":"avatar","prevSize":32,"code":59762},"setIdx":0,"setId":1,"iconIdx":23},{"icon":{"paths":["M264.802 105.889c-29.255 0-52.971 23.716-52.971 52.971s23.716 52.971 52.971 52.971c29.255 0 52.971-23.716 52.971-52.971v0c0-29.255-23.716-52.971-52.971-52.971v0zM105.889 158.86c0.028-87.745 71.165-158.865 158.913-158.865 87.765 0 158.913 71.149 158.913 158.913 0 68.778-43.693 127.351-104.836 149.475l-1.106 0.349v273.876c43.577-33.054 98.717-52.95 158.505-52.95 0.144 0 0.288 0 0.43 0h-0.022c123.764 0 224.649-97.947 229.373-220.554l0.013-0.43c-62.167-22.519-105.783-81.051-105.783-149.769 0-87.765 71.149-158.913 158.913-158.913s158.913 71.149 158.913 158.913c0 68.818-43.744 127.419-104.944 149.514l-1.107 0.349c-4.837 181.522-153.138 326.829-335.378 326.83v0c-0.012 0-0.026 0-0.041 0-61.496 0-114.833 34.931-141.251 86.035l-0.417 0.887c52.981 26.509 88.72 80.364 88.72 142.565 0 87.762-71.144 158.905-158.905 158.905s-158.905-71.144-158.905-158.905c0-68.776 43.693-127.348 104.836-149.47l1.106-0.349v-406.535c-62.251-22.498-105.941-81.082-105.942-149.874v0zM264.802 812.169c-29.255 0-52.971 23.716-52.971 52.971s23.716 52.971 52.971 52.971c29.255 0 52.971-23.716 52.971-52.971v0c0-29.255-23.716-52.971-52.971-52.971v0zM706.227 158.86c0-29.255 23.716-52.971 52.971-52.971s52.971 23.716 52.971 52.971c0 29.255-23.716 52.971-52.971 52.971v0c-29.255 0-52.971-23.716-52.971-52.971v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Branch_ic-01"],"grid":0},"attrs":[],"properties":{"order":525,"id":23,"name":"branch","prevSize":32,"code":59765},"setIdx":0,"setId":1,"iconIdx":24},{"icon":{"paths":["M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512c282.77 0 512-229.23 512-512v0c0-282.77-229.23-512-512-512v0zM499.2 806.401c-28.277 0-51.2-22.923-51.2-51.2s22.923-51.2 51.2-51.2c28.232 0 51.128 22.85 51.2 51.065v0.008c0 0.024 0 0.051 0 0.080 0 28.287-22.917 51.221-51.198 51.249h-0.003zM597.001 507.188c-37.526 18.093-62.96 55.839-62.96 99.525 0 4.263 0.242 8.471 0.714 12.608l-0.047-0.506c0 19.436-15.756 35.192-35.193 35.192-0.002 0-0.002 0-0.003 0h-3.84c-19.431 0-35.184-15.753-35.184-35.184 0-0.002 0-0.005 0-0.006v0c0.516-102.005 29.063-124.278 77.336-155.618 32.099-18.111 53.721-51.483 55.016-90.006l0.005-0.177c-0.431-44.127-36.303-79.733-80.49-79.733-33.929 0-62.955 20.993-74.799 50.697l-0.191 0.543c-5.328 17.853-20.852 30.947-39.659 32.604l-0.173 0.012c-0.782 0.059-1.694 0.093-2.613 0.093-20.436 0-37.004-16.568-37.004-37.004 0-2.84 0.32-5.604 0.926-8.259l-0.048 0.249c18.845-63.215 76.452-108.516 144.639-108.516 3.335 0 6.644 0.108 9.924 0.321l-0.447-0.024c3.782-0.347 8.178-0.545 12.621-0.545 80.921 0 146.52 65.6 146.52 146.52 0 1.361-0.018 2.717-0.056 4.068l0.005-0.2c0.033 1.163 0.051 2.529 0.051 3.902 0 55.109-29.888 103.238-74.339 129.060l-0.713 0.383z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["question_ic-01"],"grid":0},"attrs":[],"properties":{"order":526,"id":24,"name":"circle-question","prevSize":32,"code":59756},"setIdx":0,"setId":1,"iconIdx":25},{"icon":{"paths":["M468.114 160.914v-117.028c0-24.237 19.648-43.886 43.886-43.886s43.886 19.648 43.886 43.886v117.028h87.771v-117.028c0-24.237 19.648-43.886 43.886-43.886s43.886 19.648 43.886 43.886v122.559l1.227 0.278c60.688 16.144 108.477 63.933 124.9 125.849h122.558c24.237 0 43.886 19.648 43.886 43.886s-19.648 43.886-43.886 43.886h-117.028v87.771h117.028c24.237 0 43.886 19.648 43.886 43.886s-19.648 43.886-43.886 43.886h-117.028v87.771h117.028c24.237 0 43.886 19.648 43.886 43.886s-19.648 43.886-43.886 43.886h-119.539l-85.262-85.262v-309.71c0-48.474-39.297-87.771-87.771-87.771h-309.71l-85.262-85.262v-119.538c0-24.237 19.648-43.886 43.886-43.886s43.886 19.648 43.886 43.886v117.028zM185.219 247.281l0.44-0.793c-8.289 13.827-14.718 28.897-19.215 46.083h-122.559c-24.237 0-43.886 19.648-43.886 43.886s19.648 43.886 43.886 43.886h117.028v87.771h-117.028c-24.237 0-43.886 19.648-43.886 43.886s19.648 43.886 43.886 43.886h117.028v87.771h-117.028c-24.237 0-43.886 19.648-43.886 43.886s19.648 43.886 43.886 43.886h122.559l0.278 1.227c16.144 60.688 63.933 108.477 125.849 124.9v122.558c0 24.237 19.648 43.886 43.886 43.886s43.886-19.648 43.886-43.886v-117.028h87.771v117.028c0 24.237 19.648 43.886 43.886 43.886s43.886-19.648 43.886-43.886v-117.028h87.771v117.028c0 24.237 19.648 43.886 43.886 43.886s43.886-19.648 43.886-43.886v-122.558l1.218-0.274c15.968-4.224 31.037-10.655 44.072-18.503l172.36 172.357c7.915 7.753 18.753 12.532 30.708 12.532 24.237 0 43.886-19.648 43.886-43.886 0-11.955-4.779-22.792-12.525-30.699l-936.229-936.229c-7.941-7.931-18.905-12.837-31.015-12.837-24.237 0-43.886 19.648-43.886 43.886 0 12.11 4.906 23.074 12.837 31.015l172.365 172.364zM710.276 772.342c-6.801 1.887-14.611 2.972-22.674 2.972-0.021 0-0.041 0-0.063 0h-351.083c-48.474 0-87.771-39.297-87.771-87.771v0-351.086c0-0.021 0-0.044 0-0.069 0-8.060 1.085-15.867 3.117-23.283l-0.144 0.617 84.798 84.801v230.505c0 32.316 26.198 58.515 58.515 58.515v0h230.505zM687.543 394.972v163.425l-221.938-221.938h163.425c32.316 0 58.515 26.198 58.515 58.515v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Hide system metrics-01-01"],"grid":0},"attrs":[],"properties":{"order":527,"id":25,"name":"hide-system-metrics","prevSize":32,"code":59754},"setIdx":0,"setId":1,"iconIdx":26},{"icon":{"paths":["M380.343 43.886c0-24.237-19.648-43.886-43.886-43.886s-43.886 19.648-43.886 43.886v0 122.559c-61.916 16.423-109.703 64.212-125.849 124.899l-0.278 1.227h-122.559c-24.237 0-43.886 19.648-43.886 43.886s19.648 43.886 43.886 43.886v0h117.028v87.771h-117.028c-24.237 0-43.886 19.648-43.886 43.886s19.648 43.886 43.886 43.886v0h117.028v87.771h-117.028c-24.237 0-43.886 19.648-43.886 43.886s19.648 43.886 43.886 43.886v0h122.559c16.423 61.916 64.21 109.705 124.899 125.849l1.227 0.278v122.558c0 24.237 19.648 43.886 43.886 43.886s43.886-19.648 43.886-43.886v0-117.028h87.771v117.028c0 24.237 19.648 43.886 43.886 43.886s43.886-19.648 43.886-43.886v0-117.028h87.771v117.028c0 24.237 19.648 43.886 43.886 43.886s43.886-19.648 43.886-43.886v0-122.558c61.917-16.423 109.705-64.21 125.849-124.9l0.278-1.227h122.558c24.237 0 43.886-19.648 43.886-43.886s-19.648-43.886-43.886-43.886v0h-117.028v-87.771h117.028c24.237 0 43.886-19.648 43.886-43.886s-19.648-43.886-43.886-43.886v0h-117.028v-87.771h117.028c24.237 0 43.886-19.648 43.886-43.886s-19.648-43.886-43.886-43.886v0h-122.558c-16.423-61.916-64.212-109.705-124.9-125.849l-1.227-0.278v-122.559c0-24.237-19.648-43.886-43.886-43.886s-43.886 19.648-43.886 43.886v0 117.028h-87.771v-117.028c0-24.237-19.648-43.886-43.886-43.886s-43.886 19.648-43.886 43.886v0 117.028h-87.771zM248.686 336.457c0-48.475 39.297-87.771 87.771-87.771v0h351.086c48.475 0 87.771 39.297 87.771 87.771v0 351.086c0 48.475-39.297 87.771-87.771 87.771v0h-351.086c-48.475 0-87.771-39.297-87.771-87.771v0zM394.972 336.457c-32.316 0-58.515 26.198-58.515 58.515v0 234.058c0 32.316 26.198 58.515 58.515 58.515v0h234.058c32.316 0 58.515-26.198 58.515-58.515v0-234.058c0-32.316-26.198-58.515-58.515-58.515v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Show system metrics-01"],"grid":0},"attrs":[],"properties":{"order":528,"id":26,"name":"show-system-metrics","prevSize":32,"code":59755},"setIdx":0,"setId":1,"iconIdx":27},{"icon":{"paths":["M972.952 52.048c-31.501-31.498-75.001-50.996-123.054-51.050h-522.349c-0.154 0-0.336-0.002-0.517-0.002-88.525 0-161.485 66.645-171.443 152.499l-0.076 0.803c-87.683 8.967-155.511 82.426-155.511 171.726 0 0.186 0 0.373 0.002 0.559v-0.029 522.373c0.673 95.854 78.234 173.369 174.042 173.969l522.406 0.104c0.159 0 0.345 0.002 0.532 0.002 88.522 0 161.478-66.646 171.428-152.499l0.076-0.803c87.683-8.958 155.514-82.412 155.514-171.711 0-0.192 0-0.384-0.002-0.576v0.030-522.335c-0.057-48.062-19.554-91.559-51.047-123.061v0zM760.27 848.892c-0.041 35.232-28.59 63.782-63.817 63.826l-522.354-0.112c-35.203-0.024-63.738-28.534-63.805-63.723v-522.325c0.036-35.232 28.585-63.784 63.814-63.823h522.343c35.232 0.039 63.782 28.59 63.821 63.818v0.005zM913.705 697.445c-0.018 17.619-7.163 33.564-18.71 45.113v0c-6.72 6.462-14.896 11.461-23.986 14.452l-0.446 0.127v-430.582c-0.106-96.116-77.995-174.005-174.102-174.111h-428.204c9.027-24.22 31.958-41.158 58.845-41.158 0.157 0 0.313 0 0.469 0.002h522.311c35.232 0.038 63.782 28.59 63.818 63.818v0.003zM608.258 496.856c-9.769-9.781-16.124-22.974-17.122-37.64l-0.011-0.181c-0.014-0.469-0.023-1.020-0.023-1.574 0-7.567 1.489-14.786 4.189-21.381l-0.136 0.376c2.911-7.136 7.027-13.222 12.15-18.291l0.005-0.005c5.115-5.13 11.228-9.263 18.024-12.083l0.367-0.135c5.487-2.601 11.922-4.121 18.71-4.121 0.996 0 1.983 0.033 2.963 0.097l-0.133-0.008c23.166 0.051 43.025 14.157 51.507 34.24l0.138 0.367c2.709 6.335 4.282 13.705 4.282 21.445s-1.575 15.11-4.42 21.81l0.138-0.366c-5.809 13.775-16.535 24.521-29.926 30.218l-0.367 0.139c-6.299 2.689-13.628 4.252-21.321 4.252-0.054 0-0.109 0-0.163 0h0.009c-15.221-0.803-28.81-7.204-38.867-17.164l0.005 0.005zM736.867 764.15c-0.615 22.055-18.372 39.766-40.386 40.307l-0.051 0.002c-11.053-0.132-21.104-4.311-28.764-11.124l0.045 0.039-103.353-103.415-22.359 21.287 33.254 36.529c7.52 7.541 12.301 17.817 12.72 29.208l0.003 0.079c0.002 0.144 0.003 0.313 0.003 0.482 0 22.725-18.421 41.146-41.146 41.146-10.743 0-20.523-4.116-27.851-10.858l0.029 0.027-3.526-3.842-87.734-96.173v0.503l-65.12-71.799-65.061 71.799v-0.503l-91.258 100.016c-7.299 6.731-17.090 10.859-27.843 10.859-22.713 0-41.127-18.412-41.127-41.127 0-10.377 3.844-19.857 10.185-27.093l-0.041 0.047 166.020-182.426c12.127-13.324 29.515-21.679 48.855-21.761h0.015l3.842-0.030 0.314 0.189c17.998 1.019 33.924 9.127 45.172 21.549l0.050 0.056 74.824 82.346 32.435-30.924c11.826-11.31 27.894-18.27 45.587-18.27 18.294 0 34.849 7.441 46.804 19.464l0.003 0.003 112.108 112.297c8.209 7.851 13.321 18.882 13.352 31.108v0.006z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["z-axis icon-01"],"grid":0},"attrs":[],"properties":{"order":529,"id":27,"name":"images-stacking","prevSize":32,"code":59753},"setIdx":0,"setId":1,"iconIdx":28},{"icon":{"paths":["M998.547 412.341c-11.015-20.783-26.644-37.801-45.599-50.137l-0.516-0.316c-17.213-11.111-37.343-19.494-58.909-23.948l-1.144-0.197c-18.080-4.177-38.888-6.65-60.247-6.809h-0.113c-0.378-0.001-0.824-0.003-1.272-0.003-28.836 0-56.612 4.53-82.66 12.917l1.908-0.531c-26.766 8.32-49.844 21.698-69.184 39.142l0.162-0.144c-20.242 18.734-35.782 42.256-44.845 68.78l-0.349 1.178 86.977 19.809c8.276-18.559 20.852-33.918 36.512-45.283l0.321-0.223c18.733-13.094 41.987-20.924 67.069-20.924 2.32 0 4.627 0.068 6.913 0.199l-0.317-0.014c2.094-0.169 4.532-0.265 6.994-0.265 23.188 0 44.379 8.541 60.602 22.647l-0.113-0.096c14.278 14.975 23.062 35.296 23.062 57.669 0 1.817-0.058 3.621-0.172 5.41l0.013-0.244v2.168c0.051 0.611 0.080 1.323 0.080 2.043 0 9.252-4.8 17.383-12.048 22.037l-0.104 0.062c-11.242 5.857-24.401 9.738-38.346 10.813l-0.348 0.021q-26.616 3.094-69.333 8.046c-25.732 3.085-48.232 7.214-70.244 12.59l4.004-0.827c-22.247 5.209-41.865 13.090-59.863 23.468l1.055-0.561c-17.391 10.040-31.514 23.963-41.502 40.647l-0.289 0.52c-9.805 17.672-15.575 38.755-15.575 61.184 0 1.778 0.037 3.548 0.108 5.309l-0.008-0.252c-0.049 1.385-0.076 3.012-0.076 4.647 0 27.503 7.864 53.169 21.467 74.873l-0.345-0.59c14.354 21.386 33.971 38.218 57.032 48.859l0.854 0.354c23.193 10.577 50.303 16.741 78.853 16.741 1.007 0 2.012-0.007 3.015-0.023l-0.152 0.001c1.293 0.034 2.816 0.052 4.344 0.052 22.686 0 44.385-4.22 64.357-11.918l-1.224 0.414c17.849-6.973 33.163-16.718 46.205-28.87l-0.086 0.079c10.706-9.986 19.692-21.639 26.585-34.576l0.345-0.71h3.712v65.008h90.382v-315.722c0.096-2.156 0.151-4.683 0.151-7.225 0-28.154-6.687-54.746-18.559-78.273l0.456 0.996zM923.947 641.086c0 0.066 0 0.144 0 0.223 0 19.458-5.409 37.654-14.805 53.165l0.258-0.458c-10.148 16.829-24.318 30.304-41.216 39.339l-0.571 0.279c-17.914 9.59-39.189 15.223-61.777 15.223-1.35 0-2.695-0.020-4.035-0.061l0.196 0.004c-1.374 0.061-2.987 0.094-4.607 0.094-22.293 0-43.069-6.495-60.538-17.696l0.448 0.269c-15.477-10.843-25.472-28.595-25.472-48.682 0-1.168 0.034-2.328 0.1-3.477l-0.007 0.159c-0.046-0.875-0.075-1.899-0.075-2.929 0-13.965 4.933-26.779 13.151-36.793l-0.080 0.101c9.42-10.367 21.286-18.342 34.694-23.033l0.592-0.18c14.234-5.209 30.877-9.231 48.11-11.343l1.11-0.111q11.453-1.547 28.475-3.714 17.022-2.475 34.973-5.261c12.731-2.13 23.482-4.604 33.997-7.64l-2.113 0.523c7.371-1.747 13.816-4.971 19.284-9.359l-0.094 0.073z","M220.772 178.644l-228.125 633.92h101.531l58.058-167.765h247.68l57.958 167.765h101.525l-228.125-633.92zM180.087 564.32l93.619-270.527h4.949l93.462 270.527z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Aa-01"],"grid":0},"attrs":[],"properties":{"order":530,"id":28,"name":"case-sensitive","prevSize":32,"code":59750},"setIdx":0,"setId":1,"iconIdx":29},{"icon":{"paths":["M167.915 821.465c-0.793 0.013-1.729 0.021-2.667 0.021-24.453 0-47.709-5.123-68.754-14.353l1.101 0.431c-20.376-9.208-37.073-23.5-48.935-41.293l-0.263-0.419c-11.291-18.144-17.984-40.165-17.984-63.751 0-1.464 0.025-2.922 0.078-4.375l-0.006 0.21c-0.052-1.297-0.082-2.819-0.082-4.348 0-19.409 4.777-37.703 13.22-53.768l-0.304 0.634c8.524-15.062 20.369-27.336 34.598-36.119l0.428-0.246c14.389-8.863 31.059-15.939 48.786-20.334l1.213-0.254c16.328-4.399 36.047-8.071 56.207-10.272l1.816-0.161q36.096-3.741 58.556-6.68c12.095-1.117 23.166-4.549 33.086-9.853l-0.466 0.227c6.339-4.107 10.474-11.144 10.474-19.148 0-0.507-0.017-1.009-0.049-1.508l0.004 0.068v-1.608c0.071-1.097 0.112-2.38 0.112-3.672 0-16.869-6.895-32.129-18.020-43.112l-0.006-0.006c-12.569-10.422-28.865-16.745-46.636-16.745-1.748 0-3.481 0.061-5.198 0.182l0.232-0.013c-1.478-0.085-3.208-0.133-4.948-0.133-19.19 0-37.016 5.845-51.793 15.851l0.326-0.208c-12.627 9.051-22.269 21.539-27.635 36.096l-0.172 0.534-90.374-12.836c6.702-24.484 18.944-45.56 35.339-62.613l-0.045 0.048c16.386-16.751 36.534-29.75 59.084-37.638l1.077-0.328c22.595-8.144 48.669-12.853 75.844-12.853 0.971 0 1.941 0.006 2.911 0.018l-0.147-0.001c20.973 0.014 41.346 2.55 60.844 7.32l-1.753-0.363c20.387 4.807 38.346 12.74 54.356 23.375l-0.613-0.383c16.447 10.88 29.664 25.382 38.735 42.426l0.302 0.624c9.494 18.408 15.061 40.173 15.061 63.239 0 1.738-0.031 3.469-0.095 5.191l0.007-0.25v274.866h-93.047v-56.417h-3.208c-6.661 12.435-14.959 23.036-24.775 32.005l-0.092 0.082c-11.187 10.115-24.435 18.198-39.008 23.527l-0.832 0.265c-15.671 5.613-33.75 8.859-52.587 8.859-1.159 0-2.314-0.013-3.467-0.037l0.172 0.003zM193.048 750.346c0.784 0.021 1.705 0.032 2.632 0.032 17.488 0 33.978-4.264 48.491-11.808l-0.584 0.277c13.69-7.35 24.823-17.881 32.678-30.647l0.21-0.368c7.386-11.797 11.767-26.129 11.767-41.485 0-0.174 0-0.346-0.001-0.52v0.027-48.4c-4.423 3.12-9.607 5.519-15.196 6.887l-0.312 0.065c-6.363 1.982-14.468 3.93-22.732 5.416l-1.331 0.199q-13.372 2.41-26.471 4.283t-22.728 3.205c-14.447 1.851-27.538 5.226-39.925 10.018l1.155-0.392c-10.79 3.987-19.88 10.41-26.932 18.634l-0.072 0.086c-6.182 8.413-9.894 18.976-9.894 30.405 0 16.336 7.581 30.901 19.416 40.369l0.103 0.079c13.050 8.593 29.054 13.708 46.252 13.708 1.223 0 2.44-0.025 3.649-0.078l-0.172 0.006zM486.364 813.176v-547.594h96.792v204.813h4.012c6.335-12.096 13.347-22.525 21.347-32.098l-0.229 0.282c10.026-12.061 22.31-21.867 36.253-28.854l0.648-0.294c15.967-7.818 34.746-12.39 54.593-12.39 1.677 0 3.347 0.032 5.008 0.097l-0.239-0.007c0.594-0.008 1.295-0.013 1.998-0.013 31.104 0 60.088 9.075 84.449 24.721l-0.623-0.374c26.677 17.456 47.591 41.72 60.545 70.355l0.419 1.035c14.435 31.605 22.849 68.554 22.849 107.466 0 2.828-0.044 5.644-0.133 8.451l0.010-0.409c0.069 2.279 0.109 4.961 0.109 7.65 0 38.811-8.207 75.703-22.979 109.039l0.68-1.72c-13.333 29.809-34.033 54.288-59.838 71.814l-0.59 0.378c-23.822 15.604-53.006 24.888-84.359 24.888-0.799 0-1.597-0.006-2.393-0.018l0.12 0.001c-1.343 0.049-2.918 0.079-4.501 0.079-19.608 0-38.195-4.367-54.844-12.182l0.791 0.333c-14.671-7.177-27.1-16.698-37.33-28.218l-0.107-0.123c-7.933-9.315-15.113-19.736-21.175-30.856l-0.479-0.96h-5.615v64.705zM581.282 607.828c-0.024 1.153-0.038 2.512-0.038 3.874 0 23.624 4.128 46.283 11.701 67.297l-0.435-1.384c6.8 18.832 18.13 34.638 32.706 46.645l0.182 0.147c14.692 10.371 32.969 16.577 52.697 16.577 20.054 0 38.61-6.414 53.729-17.3l-0.272 0.186c14.763-12.281 26.027-28.288 32.393-46.587l0.224-0.74c7.121-20.502 11.233-44.132 11.233-68.722 0-24.289-4.012-47.641-11.411-69.429l0.448 1.52c-6.546-18.8-17.825-34.56-32.431-46.369l-0.193-0.151c-14.99-10.542-33.624-16.848-53.73-16.848-19.775 0-38.123 6.099-53.27 16.519l0.318-0.206c-14.863 11.671-26.226 27.169-32.668 45.020l-0.22 0.699c-6.974 19.403-11.006 41.792-11.006 65.123 0 1.451 0.016 2.9 0.047 4.344l-0.004-0.215zM30.118 150.588h963.766c16.633 0 30.117 13.484 30.117 30.117v0 0c0 16.633-13.484 30.117-30.117 30.117v0h-963.766c-16.633 0-30.117-13.484-30.117-30.117v0 0c0-16.633 13.484-30.117 30.117-30.117v0zM1024.001 301.177v481.882c0 16.633-13.484 30.117-30.117 30.117v0 0c-16.633 0-30.117-13.484-30.117-30.117v0-481.882c0-16.633 13.484-30.117 30.117-30.117v0 0c16.633 0 30.117 13.484 30.117 30.117v0zM30.118 873.412h963.766c16.633 0 30.117 13.484 30.117 30.117v0 0c0 16.633-13.484 30.117-30.117 30.117v0h-963.766c-16.633 0-30.117-13.484-30.117-30.117v0 0c0-16.633 13.484-30.117 30.117-30.117v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Match Whole Word_ic-01"],"grid":0},"attrs":[],"properties":{"order":531,"id":29,"name":"word-match","prevSize":32,"code":59751},"setIdx":0,"setId":1,"iconIdx":30},{"icon":{"paths":["M36.571 804.573h146.285c21.943 0 36.571 14.628 36.571 36.571v146.285c0 21.943-14.628 36.571-36.571 36.571h-146.285c-21.943 0-36.571-14.628-36.571-36.571v-146.285c0-21.943 14.628-36.571 36.571-36.571zM746.057 131.656c0-29.258-21.943-58.514-58.514-58.514s-58.514 21.943-58.514 58.514v138.972l-102.4-102.4c-21.943-21.943-58.514-21.943-80.457 0s-21.943 58.514 0 80.457l102.4 102.4h-138.972c-29.258 0-58.514 21.943-58.514 58.514s21.943 58.514 58.514 58.514h138.972l-102.4 102.4c-21.943 21.943-21.943 58.514 0 80.457s58.514 21.943 80.457 0l102.4-102.4v138.972c0 29.258 21.943 58.514 58.514 58.514s58.514-21.943 58.514-58.514v-138.972l102.4 102.4c21.943 21.943 58.514 21.943 80.457 0s21.943-58.514 0-80.457l-102.4-102.4h138.972c29.258 0 58.514-21.943 58.514-58.514s-21.943-58.514-58.514-58.514h-138.972l102.4-102.4c21.943-21.943 21.943-58.514 0-80.457s-58.514-21.943-80.457 0l-102.4 102.4v-138.972z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Use Regular Expression_ic"],"grid":0},"attrs":[],"properties":{"order":532,"id":30,"name":"regex","prevSize":32,"code":59752},"setIdx":0,"setId":1,"iconIdx":31},{"icon":{"paths":["M908.386 132.131v0c9.122 0 16.517 7.395 16.517 16.517v66.065c0 9.122-7.395 16.517-16.517 16.517h-792.772c-9.122 0-16.517-7.395-16.517-16.517v-66.065c0-9.122 7.395-16.517 16.517-16.517zM0.001 214.71v-0.002c0 0.008 0 0.015 0 0.025 0 45.849 26.686 85.466 66.065 104.465v556.156c0 63.851 51.761 115.613 115.613 115.613h660.644c63.851 0 115.613-51.761 115.613-115.613v-556.156l0.691-0.3c38.688-18.698 65.374-58.317 65.374-104.166 0-0.006 0-0.014 0-0.020v-66.065c0-63.851-51.761-115.613-115.613-115.613h-792.772c-63.851 0-115.613 51.761-115.613 115.613zM165.162 330.324h693.676v545.031c0 9.122-7.395 16.517-16.517 16.517v0h-660.644c-9.122 0-16.517-7.395-16.517-16.517v0zM344.835 646.13l0.008 0.008c-8.781-8.94-14.197-21.196-14.197-34.718 0-27.365 22.184-49.548 49.548-49.548 13.522 0 25.779 5.416 34.712 14.191l47.546 47.54v-144.634c0-27.365 22.184-49.548 49.548-49.548s49.548 22.184 49.548 49.548v144.634l47.538-47.532c8.936-8.753 21.173-14.149 34.67-14.149 27.365 0 49.548 22.184 49.548 49.548 0 13.497-5.396 25.733-14.141 34.661l-132.128 132.128c-8.965 8.967-21.352 14.513-35.034 14.513s-26.069-5.546-35.034-14.513z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Archive_ic-01"],"grid":0},"attrs":[],"properties":{"order":533,"id":31,"name":"archive","prevSize":32,"code":59727},"setIdx":0,"setId":1,"iconIdx":32},{"icon":{"paths":["M420.030 381.54l110.147 110.147c7.41 7.463 11.99 17.746 11.99 29.098 0 22.809-18.49 41.301-41.301 41.301-11.353 0-21.634-4.58-29.1-11.993l-39.635-39.624v120.572c0 22.812-18.493 41.305-41.305 41.305s-41.305-18.493-41.305-41.305v0-120.572l-39.635 39.627c-7.444 7.291-17.644 11.79-28.895 11.79-22.812 0-41.305-18.493-41.305-41.305 0-11.251 4.499-21.45 11.794-28.899l-0.007 0.008 110.151-110.147c7.474-7.475 17.799-12.099 29.203-12.099s21.73 4.624 29.203 12.099v0zM949.363 832.079l-49.802 23.609c-12.020 5.87-26.157 9.305-41.094 9.305-0.034 0-0.070 0-0.105 0h0.005c-0.023 0-0.046 0-0.073 0-38.171 0-71.165-22.172-86.803-54.34l-0.252-0.574-10.586-22.256c-9.217 44.387-47.996 77.267-94.457 77.276h-550.737c-53.229 0-96.38-43.15-96.38-96.38v0-468.127c0-53.229 43.15-96.38 96.38-96.38v0h368.622c-3.743-9.827-5.912-21.191-5.912-33.063 0-37.967 22.178-70.755 54.284-86.116l0.575-0.248 49.64-23.638c12.105-5.87 26.328-9.303 41.354-9.303 38.199 0 71.22 22.182 86.881 54.365l0.252 0.574 283.868 596.801c5.863 12.099 9.289 26.315 9.289 41.333 0 38.209-22.186 71.237-54.378 86.903l-0.574 0.252zM679.963 618.207l-157.628-331.377h-406.878c-7.603 0-13.769 6.165-13.769 13.769v0 468.127c0 7.603 6.165 13.769 13.769 13.769v0h550.736c0.001 0 0.003 0 0.004 0 7.602 0 13.765-6.163 13.765-13.765 0-0.001 0-0.003 0-0.004v0zM920.372 739.089l-283.865-596.801c-2.248-4.695-6.96-7.879-12.417-7.879-2.154 0-4.192 0.495-6.005 1.38l0.081-0.036-49.695 23.663c-4.697 2.221-7.887 6.92-7.887 12.365 0 2.175 0.509 4.23 1.414 6.054l-0.036-0.079 283.865 596.828c1.576 3.286 4.331 5.796 7.703 7.015l0.095 0.029c1.363 0.482 2.935 0.762 4.573 0.762 2.146 0 4.18-0.48 6.001-1.337l-0.030-0.019 49.749-23.609c4.666-2.244 7.83-6.934 7.83-12.362 0-2.175-0.507-4.232-1.412-6.058l0.036 0.079z"],"width":1008,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Unarchive_ic-01"],"grid":0},"attrs":[],"properties":{"order":534,"id":32,"name":"unarchive","prevSize":32,"code":59749},"setIdx":0,"setId":1,"iconIdx":33},{"icon":{"paths":["M831.999 1023.999h-640c-108.799 0-192-83.2-192-192v-640c0-108.799 83.2-192 192-192h640c108.799 0 192 83.2 192 192v640c0 108.799-83.2 192-192 192zM192.001 96.001c-51.199 0-96 44.8-96 96v640c0 51.199 44.8 96 96 96h640c51.199 0 96-44.8 96-96v-640c0-51.199-44.8-96-96-96h-640zM819.2 512c0 25.6-19.2 51.199-51.199 51.199h-511.999c-25.6 0-51.199-19.2-51.199-51.199s19.2-51.199 51.199-51.199h511.999c25.6 0 51.199 25.6 51.199 51.199z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Type=Outlined Box with -","State=Default"],"grid":0},"attrs":[],"properties":{"order":535,"id":33,"name":"partially-selected","prevSize":32,"code":59748},"setIdx":0,"setId":1,"iconIdx":34},{"icon":{"paths":["M117.756 36.965c0-0.051 0-0.112 0-0.173 0-28.4-23.022-51.422-51.42-51.422v0c-7.296 0.686-13.994 2.074-20.399 4.118l0.679-0.187c-18.772 7.942-31.703 26.205-31.703 47.49 0 0.060 0 0.122 0 0.182v-0.010 783.867c0.004 104.126 84.416 188.536 188.541 188.538h783.752c28.398 0 51.419-23.021 51.419-51.419s-23.021-51.419-51.419-51.419h-783.752c-0.001 0-0.003 0-0.004 0-47.329 0-85.696-38.368-85.696-85.696 0-0.001 0-0.003 0-0.003v0zM945.574 314.704l-672.914 438.853c-6.813 4.564-15.195 7.285-24.214 7.285-24.237 0-43.886-19.648-43.886-43.886 0-15.42 7.953-28.982 19.98-36.809l0.17-0.103 672.914-438.861c6.761-4.468 15.057-7.127 23.975-7.127 24.239 0 43.887 19.65 43.887 43.887 0 15.32-7.85 28.808-19.749 36.658l-0.165 0.101zM810.41 231.132c35.476-0.092 64.201-28.873 64.201-64.362 0-35.469-28.69-64.236-64.129-64.362h-0.012c-0.285-0.004-0.62-0.007-0.957-0.007-34.726 0-62.938 27.895-63.449 62.499v0.048c-0.005 0.605-0.005 1.212 0 1.82 2.414 34.528 29.822 61.943 64.129 64.353l0.219 0.012zM459.325 465.189c35.476-0.092 64.201-28.873 64.201-64.362 0-35.469-28.69-64.236-64.129-64.362h-0.012c-0.285-0.004-0.62-0.007-0.957-0.007-34.726 0-62.938 27.895-63.449 62.499v0.048c-0.008 0.602-0.008 1.211 0 1.82 2.412 34.528 29.822 61.943 64.129 64.353l0.219 0.012zM225.269 582.217c35.226-0.42 63.622-29.074 63.622-64.361 0-35.549-28.818-64.365-64.365-64.365-8.497 0-16.609 1.647-24.036 4.638l0.432-0.154c-23.362 9.471-39.616 31.819-40.002 58.010v0.048c-0.005 0.602-0.005 1.211 0.001 1.82 2.408 34.53 29.82 61.947 64.129 64.353l0.218 0.012zM488.571 863.086c0.008 0 0.016 0 0.026 0 35.545 0 64.36-28.815 64.36-64.36 0-35.535-28.8-64.345-64.332-64.36h-0.001c-0.288-0.004-0.627-0.007-0.967-0.007-34.72 0-62.928 27.893-63.433 62.495v0.048q-0.018 0.913 0 1.825c2.41 34.528 29.822 61.943 64.129 64.347l0.218 0.012zM664.126 699.245c35.229-0.417 63.627-29.073 63.627-64.361 0-35.549-28.818-64.365-64.365-64.365-8.497 0-16.609 1.647-24.036 4.638l0.432-0.154c-23.362 9.471-39.618 31.819-40.006 58.010v0.048c-0.005 0.602-0.005 1.211 0 1.82 2.412 34.528 29.822 61.943 64.129 64.353l0.219 0.012zM576.354 231.132c35.476-0.092 64.201-28.873 64.201-64.362 0-35.469-28.69-64.236-64.129-64.362h-0.012c-0.285-0.004-0.62-0.007-0.957-0.007-34.726 0-62.938 27.895-63.449 62.499v0.048c-0.005 0.605-0.005 1.212 0 1.82 2.414 34.528 29.822 61.943 64.129 64.353l0.219 0.012zM927.44 640.732c35.229-0.417 63.627-29.073 63.627-64.361 0-35.549-28.818-64.365-64.365-64.365-8.497 0-16.609 1.647-24.036 4.638l0.432-0.154c-23.362 9.471-39.618 31.819-40.006 58.010v0.048c-0.005 0.602-0.005 1.211 0 1.82 2.412 34.528 29.822 61.943 64.129 64.353l0.219 0.012z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Trendline_ic-01"],"grid":0},"attrs":[],"properties":{"order":536,"id":34,"name":"trendline","prevSize":32,"code":59743},"setIdx":0,"setId":1,"iconIdx":35},{"icon":{"paths":["M383.301 538.559c-56.692 0-102.674 45.978-102.674 102.67v256.829c0 56.692 45.981 102.67 102.674 102.67s102.675-45.978 102.675-102.67v-256.829c-0.042-56.692-46.024-102.67-102.675-102.67z","M24.017 641.224c0 56.734 46.022 102.758 102.756 102.758s102.755-46.024 102.755-102.758v-102.754h-102.674c-0.041 0-0.041 0-0.081 0-56.733 0-102.756 46.024-102.756 102.754z","M383.405 23.273c-0.040 0-0.081 0-0.122 0-56.733 0-102.754 46.022-102.754 102.755s46.021 102.755 102.754 102.755h102.675v-102.755c0-0.041 0-0.122 0-0.204-0.042-56.651-45.942-102.551-102.553-102.551z","M126.027 486.377h257.315c56.733 0 102.755-46.020 102.755-102.753s-46.022-102.755-102.755-102.755h-257.315c-56.733 0-102.755 46.022-102.755 102.755s46.022 102.753 102.755 102.753z","M897.098 280.83c-56.655 0-102.554 45.899-102.554 102.551v102.959h102.675c56.734 0 102.754-46.022 102.754-102.755s-46.019-102.755-102.754-102.755c-0.042 0-0.084 0-0.121 0z","M537.982 126.032v257.601c0 56.692 45.982 102.675 102.675 102.675s102.675-45.982 102.675-102.675v-257.601c0-56.692-45.982-102.674-102.675-102.674s-102.675 45.981-102.675 102.674z","M743.331 897.983c0-56.697-45.982-102.675-102.675-102.675h-102.675v102.754c0.042 56.65 45.982 102.591 102.675 102.591s102.675-45.978 102.675-102.67z","M897.955 538.47h-257.313c-56.734 0-102.758 46.024-102.758 102.754 0 56.734 46.024 102.758 102.758 102.758h257.313c56.734 0 102.754-46.024 102.754-102.758 0-56.73-46.019-102.754-102.754-102.754z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Slack"],"grid":0},"attrs":[],"properties":{"order":543,"id":35,"name":"slack","prevSize":32,"code":59744},"setIdx":0,"setId":1,"iconIdx":36},{"icon":{"paths":["M512-0c282.769 0 512 229.231 512 512s-229.231 512-512 512c-282.769 0-512-229.231-512-512s229.231-512 512-512z","M343.716 500.070c-14.444-17.022-39.952-19.113-56.972-4.67-17.022 14.444-19.113 39.952-4.67 56.975l61.642-52.304zM445.636 682.666l-30.822 26.152c7.68 9.051 18.949 14.269 30.822 14.269 11.871 0 23.139-5.217 30.82-14.269l-30.82-26.152zM741.939 395.929c14.441-17.022 12.352-42.531-4.67-56.972-17.022-14.444-42.531-12.352-56.975 4.67l61.645 52.302zM282.075 552.376l132.74 156.443 61.642-52.302-132.74-156.445-61.642 52.304zM476.456 708.818l265.483-312.889-61.645-52.302-265.48 312.889 61.642 52.302z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"25525525516868681":[],"20115230165751091":[]},"tags":["successIcon"],"grid":0},"attrs":[],"properties":{"order":393,"id":36,"name":"success-icon","prevSize":32,"code":59745,"codes":[59745,59746]},"setIdx":0,"setId":1,"iconIdx":37},{"icon":{"paths":["M512 0c-281.6 0-512 230.4-512 512s230.4 512 512 512 512-230.4 512-512-230.4-512-512-512zM563.2 736c0 25.601-19.2 51.2-51.2 51.2s-51.2-19.2-51.2-51.2v-256.001c0-25.601 19.2-51.2 51.2-51.2s51.2 19.2 51.2 51.2v256.001zM512 351.999c-38.4 0-64.001-25.601-64.001-64.001s25.601-64.001 64.001-64.001 64.001 25.601 64.001 64.001-25.601 64.001-64.001 64.001z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Type=Circle","State=Default"],"grid":0},"attrs":[],"properties":{"order":537,"id":37,"name":"circle-info","prevSize":32,"code":59726},"setIdx":0,"setId":1,"iconIdx":38},{"icon":{"paths":["M895.337 1023.115h-766.673c-44.723 0-83.057-25.556-108.612-63.89s-25.556-83.057-6.389-127.778l383.337-741.117c19.167-44.723 63.89-70.278 115.001-70.278 0 0 0 0 0 0 51.111 0 89.445 25.556 115.001 70.278l383.337 741.117c19.167 38.334 19.167 89.445-6.389 127.778-19.167 38.334-63.89 63.89-108.612 63.89zM512 122.274c-6.389 0-19.167 0-25.556 19.167l-383.337 741.117c-6.389 12.777 0 25.556 0 31.944s12.777 12.777 25.556 12.777h766.673c19.167 0 25.556-12.777 25.556-12.777s6.389-19.167 0-31.944l-383.337-741.117c-6.389-19.167-19.167-19.167-25.556-19.167v0zM512 307.554c-25.556 0-51.111 19.167-51.111 51.111v255.558c0 25.556 19.167 51.111 51.111 51.111s51.111-19.167 51.111-51.111v-255.558c0-31.944-25.556-51.111-51.111-51.111zM512 863.393c-38.334 0-63.89-25.556-63.89-63.89s25.556-63.89 63.89-63.89 63.89 25.556 63.89 63.89-25.556 63.89-63.89 63.89z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"25525525516868681":[],"2011523012552552551":[],"20115230165751091":[]},"tags":["Type=Triangle Outline","State=Default"],"grid":0},"attrs":[],"properties":{"order":576,"id":38,"name":"warning-outline","prevSize":32,"code":59746},"setIdx":0,"setId":1,"iconIdx":39},{"icon":{"paths":["M1009.459 837.262l-382.661-739.812c-51.021-95.665-178.576-95.665-229.597-6.378l-382.661 739.812c-44.644 89.287 19.133 191.33 114.798 191.33h765.323c95.665 0 159.443-102.043 114.798-184.952zM460.979 352.557c0-25.511 19.133-51.021 51.021-51.021s51.021 19.133 51.021 51.021v255.108c0 25.511-19.133 51.021-51.021 51.021s-51.021-19.133-51.021-51.021v-255.108zM512 862.773c-38.266 0-63.777-25.511-63.777-63.777s25.511-63.777 63.777-63.777 63.777 25.511 63.777 63.777-25.511 63.777-63.777 63.777z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"25525525516868681":[],"2011523012552552551":[],"20115230165751091":[]},"tags":["Type=Triangle","State=Default"],"grid":0},"attrs":[],"properties":{"order":575,"id":39,"name":"warning-contained","prevSize":32,"code":59742},"setIdx":0,"setId":1,"iconIdx":40},{"icon":{"paths":["M931.57 6.848c-5.078-2.28-11-3.609-17.235-3.609-23.776 0-43.047 19.27-43.047 43.047 0 17.542 10.49 32.625 25.544 39.344l0.269 0.114c165.597 73.647 278.976 236.71 278.976 426.265s-113.38 352.62-276.009 425.079l-2.967 1.187c-15.324 6.814-25.814 21.897-25.814 39.44 0 23.777 19.272 43.047 43.047 43.047 6.234 0 12.155-1.328 17.502-3.704l-0.269 0.114c196.24-87.272 330.581-280.523 330.581-505.144s-134.36-417.871-327.080-503.748l-3.502-1.396zM609.561 975.91v-927.84c-0.002-23.774-19.272-43.043-43.046-43.043-10.877 0-20.806 4.025-28.381 10.687l-334.948 293.086h-117.097c-47.551 0-86.093 38.542-86.093 86.093v0 234.21c0 47.551 38.542 86.093 86.093 86.093v0h117.095l335.001 293.113c7.522 6.612 17.472 10.639 28.348 10.639 23.776 0 43.046-19.27 43.046-43.046v0zM827.84 173.24c7.139-14.445 21.794-24.215 38.71-24.215 6.859 0 13.34 1.599 19.084 4.453l-0.251-0.118c133.917 66.197 224.376 201.844 224.376 358.617s-90.48 292.418-222.061 357.581l-2.336 1.035c-5.491 2.737-11.973 4.335-18.832 4.335-23.776 0-43.047-19.272-43.047-43.047 0-16.918 9.752-31.552 23.963-38.594l0.251-0.118c105.010-51.898 175.969-158.274 175.969-281.212s-70.959-229.314-174.137-280.392l-1.831-0.82c-14.445-7.139-24.215-21.794-24.215-38.712 0-6.859 1.599-13.34 4.453-19.084l-0.118 0.251zM834.306 298.723c-6.185-3.644-13.652-5.804-21.605-5.804-23.776 0-43.046 19.27-43.046 43.046 0 15.849 8.576 29.705 21.326 37.183l0.2 0.116c48.221 28.221 80.113 79.755 80.113 138.751s-31.875 110.529-79.356 138.331l-0.759 0.401c-12.932 7.579-21.494 21.427-21.494 37.264 0 23.777 19.272 43.049 43.049 43.049 7.94 0 15.376-2.152 21.753-5.899l-0.199 0.114c74.1-43.383 123.096-122.607 123.096-213.277s-48.978-169.874-121.92-212.645l-1.155-0.632z"],"width":1280,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Voice_On-01"],"grid":0},"attrs":[],"properties":{"order":574,"id":40,"name":"voice-on","prevSize":32,"code":59738},"setIdx":0,"setId":1,"iconIdx":41},{"icon":{"paths":["M609.086 48.452v927.093c-0.002 23.75-19.256 43.005-43.007 43.005-10.871 0-20.79-4.033-28.366-10.682l-334.685-292.844h-117.012c-47.504 0-86.023-38.511-86.023-86.023v0-234.023c0-47.504 38.511-86.023 86.023-86.023v0h117.011l334.728-292.889c7.524-6.604 17.452-10.637 28.316-10.637 23.75 0 43.005 19.253 43.007 43.003v0zM1159.492 309.554c7.781 7.785 12.593 18.54 12.593 30.412s-4.812 22.625-12.595 30.412l-141.632 141.623 141.632 141.623c7.713 7.774 12.475 18.477 12.475 30.29 0 23.756-19.258 43.012-43.012 43.012-11.821 0-22.524-4.764-30.292-12.479l-141.621-141.63-141.623 141.632c-7.774 7.713-18.477 12.475-30.29 12.475-23.756 0-43.012-19.258-43.012-43.012 0-11.821 4.764-22.524 12.479-30.292l141.63-141.621-141.632-141.623c-7.785-7.785-12.597-18.54-12.597-30.412 0-23.754 19.256-43.010 43.010-43.010 11.882 0 22.629 4.814 30.413 12.6l141.623 141.628 141.623-141.628c7.785-7.785 18.54-12.599 30.413-12.599s22.629 4.814 30.413 12.599v0z"],"width":1184,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Voice_Off-01"],"grid":0},"attrs":[],"properties":{"order":573,"id":41,"name":"voice-off","prevSize":32,"code":59739},"setIdx":0,"setId":1,"iconIdx":42},{"icon":{"paths":["M213.335 938.665c0 47.128 38.206 85.334 85.334 85.334s85.334-38.206 85.334-85.334v0-853.333c0-47.128-38.206-85.334-85.334-85.334s-85.334 38.206-85.334 85.334v0zM640 938.665c0 47.128 38.206 85.334 85.334 85.334s85.334-38.206 85.334-85.334v0-853.333c0-47.128-38.206-85.334-85.334-85.334s-85.334 38.206-85.334 85.334v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Pause-01"],"grid":0},"attrs":[],"properties":{"order":572,"id":42,"name":"pause","prevSize":32,"code":59740},"setIdx":0,"setId":1,"iconIdx":43},{"icon":{"paths":["M258.662 9.858c-9.425-6.18-20.972-9.859-33.379-9.859-33.932 0-61.44 27.508-61.44 61.44 0 0.002 0 0.002 0 0.004v0 901.113c0 0.002 0 0.002 0 0.004 0 33.932 27.508 61.44 61.44 61.44 12.407 0 23.956-3.677 33.613-10.003l-0.234 0.144 696.31-450.558c16.994-11.117 28.064-30.057 28.064-51.584s-11.071-40.469-27.83-51.44l-0.234-0.144z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Play-01"],"grid":0},"attrs":[],"properties":{"order":571,"id":43,"name":"play","prevSize":32,"code":59741},"setIdx":0,"setId":1,"iconIdx":44},{"icon":{"paths":["M782.8 208.116c-0.202-0.003-0.437-0.004-0.673-0.004-25.902 0-46.9 20.999-46.9 46.9 0 0.235 0.001 0.476 0.007 0.712v-0.034c1.787 25.52 22.048 45.786 47.408 47.563l0.159 0.011c26.272 0 47.572-21.297 47.572-47.572s-21.297-47.572-47.572-47.572v0zM520.709 687.833l-30.227-3.832c-1.712-4.528-3.571-9.057-5.576-13.412l18.7-24.097c6.158-7.753 9.882-17.681 9.882-28.477 0-12.832-5.258-24.437-13.733-32.782l-32.903-32.872c-8.34-8.552-19.975-13.858-32.851-13.858-10.8 0-20.729 3.736-28.568 9.981l-24.008 18.57c-4.414-1.974-8.884-3.832-13.412-5.517l-3.864-30.253c-2.897-23.048-22.368-40.699-45.966-40.706h-47.008c-23.589 0.007-43.055 17.662-45.912 40.48l-0.026 0.225-3.864 30.253c-4.56 1.686-9.031 3.545-13.386 5.517l-24.127-18.756c-7.753-6.075-17.641-9.743-28.389-9.743-12.839 0-24.463 5.234-32.842 13.686l-32.899 32.868c-8.537 8.352-13.828 19.987-13.828 32.858 0 10.792 3.722 20.717 9.952 28.563l-0.073-0.095 18.7 24.097c-2.005 4.355-3.864 8.884-5.543 13.412l-30.31 3.832c-22.999 2.991-40.585 22.431-40.649 45.984v47.042c0.034 23.583 17.677 43.032 40.48 45.911l0.227 0.026 30.227 3.832c1.712 4.528 3.545 8.998 5.543 13.412l-18.67 24.097c-6.157 7.758-9.879 17.691-9.879 28.492 0 12.851 5.269 24.476 13.761 32.825l32.904 32.873c8.368 8.503 20.003 13.775 32.868 13.775 10.784 0 20.699-3.699 28.55-9.897l24.001-18.682q6.622 3.047 13.386 5.576l3.864 30.196c2.858 23.067 22.327 40.742 45.929 40.765h47.008c23.586-0.031 43.046-17.671 45.94-40.48l0.026-0.228 3.832-30.253c4.56-1.686 9.031-3.545 13.443-5.517l24.127 18.756c7.749 6.089 17.641 9.761 28.394 9.761 12.842 0 24.464-5.244 32.834-13.709l32.871-32.869c8.555-8.346 13.864-19.987 13.864-32.865 0-10.789-3.726-20.711-9.957-28.549l0.073 0.095-18.725-24.097q3.005-6.622 5.576-13.412l30.227-3.89c23.027-2.911 40.665-22.358 40.706-45.927v-47.039c-0.034-23.583-17.677-43.032-40.48-45.911l-0.227-0.026zM510.69 776.855l-42.477 5.461c-10.145 1.311-18.332 8.471-21.124 17.941l-0.044 0.177c-3.758 12.992-8.562 24.283-14.526 34.829l0.415-0.799c-2.059 3.574-3.273 7.861-3.273 12.433 0 5.895 2.017 11.314 5.405 15.612l-0.038-0.053 26.217 33.74-27.641 27.582-33.798-26.248c-4.232-3.284-9.616-5.264-15.461-5.264-4.548 0-8.815 1.195-12.509 3.295l0.125-0.066c-9.781 5.56-21.113 10.368-33.014 13.83l-1.128 0.284c-9.635 2.862-16.782 11.047-18.078 21.069l-0.015 0.127-5.429 42.508h-39.196l-5.402-42.504c-1.368-10.147-8.527-18.325-17.996-21.152l-0.18-0.044c-12.963-3.726-24.234-8.513-34.762-14.466l0.794 0.413c-3.579-2.077-7.874-3.297-12.455-3.297-5.9 0-11.324 2.030-15.615 5.429l0.052-0.038-33.709 26.133-27.642-27.637 26.191-33.624c3.346-4.254 5.363-9.685 5.363-15.585 0-4.558-1.203-8.833-3.31-12.527l0.066 0.124c-5.551-9.751-10.357-21.036-13.827-32.898l-0.286-1.13c-2.818-9.674-11.007-16.858-21.041-18.161l-0.127-0.015-42.507-5.464v-39.137l42.655-5.402c10.059-1.455 18.136-8.59 20.945-17.996l0.044-0.18c3.775-13.034 8.601-24.362 14.586-34.946l-0.415 0.801c2.015-3.545 3.205-7.782 3.205-12.303 0-5.902-2.026-11.328-5.422-15.625l0.038 0.052-26.187-33.686 27.672-27.641 33.824 26.306c4.278 3.186 9.668 5.101 15.507 5.101 4.497 0 8.729-1.135 12.42-3.137l-0.139 0.068c9.777-5.592 21.094-10.415 32.992-13.888l1.121-0.282c9.668-2.833 16.844-11.032 18.135-21.071l0.015-0.127 5.402-42.451h39.2l5.402 42.451c1.263 10.15 8.431 18.34 17.91 21.091l0.176 0.043c13.004 3.77 24.288 8.552 34.851 14.478l-0.823-0.423c3.592 2.153 7.923 3.426 12.557 3.426 5.887 0 11.296-2.061 15.537-5.496l33.663-26.153 27.616 27.641-26.16 33.683c-3.328 4.272-5.337 9.716-5.337 15.631 0 4.535 1.183 8.797 3.253 12.49l-0.067-0.128c5.557 9.762 10.373 21.072 13.856 32.948l0.287 1.136c2.847 9.641 11.027 16.8 21.041 18.103l0.128 0.015 42.508 5.402zM294.698 637.487c-66.162 0-119.797 53.637-119.797 119.797s53.637 119.797 119.797 119.797c66.162 0 119.797-53.637 119.797-119.797v0c-0.068-66.137-53.664-119.728-119.791-119.797h-0.008zM294.698 826.391c-0.009 0-0.020 0-0.030 0-38.166 0-69.102-30.94-69.102-69.102s30.94-69.102 69.102-69.102c38.166 0 69.102 30.94 69.102 69.102v0c-0.036 38.139-30.94 69.050-69.072 69.102h-0.007zM1024 178.387v535.174c-0.11 98.476-79.91 178.278-178.381 178.393h-303.587c-0.479-13.693-4.572-26.336-11.344-37.128l0.182 0.31c34.656-7.544 60.238-37.944 60.275-74.327v-1.863h254.462c36.098-0.034 65.35-29.287 65.386-65.381v-535.178c-0.033-36.098-29.286-65.353-65.381-65.387h-535.178c-36.098 0.034-65.352 29.289-65.386 65.385v287.115c-24.425 9.077-42.624 29.703-48.134 55.059l-0.093 0.499c-11.426-7.333-25.376-11.691-40.34-11.691-8.75 0-17.153 1.492-24.97 4.232l0.529-0.159v-335.047c0.11-98.476 79.91-178.278 178.381-178.393h535.185c98.476 0.11 178.278 79.91 178.393 178.381v0.012zM640.185 654.93l-196.33-215.285-58.154 64.274c-9.016-18.557-24.91-32.591-44.281-38.95l-0.533-0.153 58.896-65.062c10.912-12 26.567-19.514 43.978-19.569h0.095c17.377 0.008 33.014 7.461 43.889 19.352l0.038 0.043 102.865 112.81 52.882-50.357c10.639-10.194 25.102-16.471 41.032-16.471 16.439 0 31.319 6.686 42.067 17.485l0.003 0.003 136.096 136.291c4.833 5.229 7.799 12.254 7.799 19.964 0 8.165-3.325 15.56-8.694 20.896l-0.001 0.001-0.285 0.273c-5.343 5.362-12.734 8.681-20.9 8.681-7.782 0-14.863-3.016-20.132-7.94l0.018 0.016-135.939-136.111-53.848 51.234 55.072 60.391c4.508 5.096 7.29 11.808 7.394 19.168v0.024c0 16.647-13.494 30.141-30.142 30.142v0c-7.687-0.076-14.664-3.047-19.902-7.881l0.023 0.020z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["image properties_ic-01"],"grid":0},"attrs":[],"properties":{"order":570,"id":44,"name":"image-properties","prevSize":32,"code":59737},"setIdx":0,"setId":1,"iconIdx":45},{"icon":{"paths":["M740.084 12.634l-134.263 167.829c-4.583 5.689-7.356 13.005-7.356 20.968 0 18.536 15.026 33.563 33.563 33.563 0.001 0 0.003 0 0.004 0h83.912v738.451c0 0.072 0 0.157 0 0.24 0 27.807 22.542 50.35 50.35 50.35s50.35-22.542 50.35-50.35c0-0.085 0-0.169 0-0.254v0.014-738.449h83.917c0 0 0.001 0 0.001 0 18.536 0 33.561-15.026 33.561-33.561 0-7.964-2.774-15.28-7.408-21.034l0.050 0.065-134.263-167.831c-6.201-7.709-15.633-12.6-26.207-12.6s-20.006 4.891-26.157 12.535l-0.050 0.065z","M422.252 663.522q26.483-93.142 54.938-170.672l0.004-0.022q29.427-78.47 67.674-166.721l0.063-0.149 0.004 0.004c3.665-6.407 6.031-13.991 6.544-22.078l0.008-0.151c-0.843-11.592-7.993-21.333-18.004-25.868l-0.193-0.078-0.151-0.088 0.007-0.007c-9.276-7.108-20.884-11.609-33.513-12.228l-0.141-0.005c-0.019 0-0.041 0-0.062 0-10.842 0-20.79 3.825-28.569 10.199l0.080-0.063c-8.579 7.541-15.569 16.655-20.564 26.922l-0.223 0.507c-7.749 15.711-15.662 35.040-22.354 54.931l-1.025 3.511q-9.779 31.306-25.444 84.147h0.004c-13.459 52.352-27.919 95.898-44.913 138.154l2.641-7.435-2.266 5.193-2.864-4.891c-9.345-15.444-18.902-33.888-27.314-52.952l-1.283-3.26q-11.794-28.509-31.404-82.43l-0.007-0.024c-17.97-54.207-38.765-100.663-63.552-144.565l2.091 4.029c-4.97-8.52-11.228-15.707-18.598-21.554l-0.157-0.12-0.317-0.211 0.018-0.018c-5.253-3.907-11.867-6.255-19.030-6.255-0.912 0-1.814 0.038-2.706 0.112l0.116-0.008c-0.317-0.005-0.693-0.008-1.070-0.008-13.951 0-26.92 4.204-37.71 11.415l0.247-0.155c-9.473 7.092-15.538 18.286-15.538 30.897 0 1.051 0.042 2.093 0.124 3.122l-0.008-0.135c0.409 4.86 1.567 9.346 3.361 13.493l-0.107-0.278c3.568 9.271 6.985 16.758 10.773 24.021l-0.612-1.29c13.44 23.435 27.888 52.437 40.825 82.247l2.333 6.038q22.524 48.964 27.481 60.851v0l22.503 51.852c22.997 49.631 47.422 91.913 75.117 131.753l-1.867-2.837 0.696 1.027-0.261 1.202c-6.546 35.113-16.126 66.211-28.774 95.679l1.113-2.917c-9.373 19.417-21.912 30.049-37.872 30.049-5.817-0.012-11.268-1.575-15.961-4.298l0.154 0.082-0.028 0.063-0.239-0.138-0.058-0.014 0.007-0.014c-5.343-2.368-9.933-5.035-14.191-8.132l0.22 0.153-0.39-0.281 0.024-0.024-0.669-0.531-1.882-1.355q-2.412-1.683-6.802-4.615c-4.752-3.341-10.647-5.354-17.011-5.396h-0.011c-0.377-0.012-0.819-0.019-1.263-0.019-9.526 0-18.332 3.084-25.475 8.307l0.122-0.085c-6.565 5.5-10.71 13.701-10.71 22.87 0 0.465 0.011 0.927 0.031 1.387l-0.003-0.065c0.927 10.624 5.007 20.15 11.286 27.801l-0.070-0.089c9.425 12.238 21.568 21.926 35.558 28.247l0.585 0.236 0.042 0.022c16.745 7.895 36.371 12.504 57.075 12.504 1.532 0 3.057-0.026 4.577-0.076l-0.222 0.005c0.463 0.008 1.009 0.014 1.558 0.014 20.217 0 38.85-6.783 53.746-18.197l-0.212 0.155 0.058-0.049c16.885-12.465 31.242-27.127 42.995-43.762l0.4-0.596c3.125-5.396 6.161-11.757 8.706-18.362l0.322-0.948q5.849-14.371 14.16-37.846l0.022-0.053q17.605-46.937 33.251-98.789z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Y axis_ic-01"],"grid":0},"attrs":[],"properties":{"order":569,"id":45,"name":"y-axis","prevSize":32,"code":59735},"setIdx":0,"setId":1,"iconIdx":46},{"icon":{"paths":["M93.091 619.055v0c-0.002 0-0.002 0-0.004 0-5.14 0-9.305 4.167-9.305 9.305 0 0.002 0 0.002 0 0.004v302.545c0 0.002 0 0.002 0 0.004 0 5.14 4.167 9.305 9.305 9.305 0.002 0 0.002 0 0.004 0h837.818c0.002 0 0.002 0 0.004 0 5.14 0 9.305-4.167 9.305-9.305 0-0.002 0-0.002 0-0.004v-302.545c0-0.002 0-0.002 0-0.004 0-5.14-4.167-9.305-9.305-9.305-0.002 0-0.002 0-0.004 0h-837.818zM0 628.364c0-51.413 41.678-93.091 93.091-93.091v0h837.818c51.413 0 93.091 41.678 93.091 93.091v0 302.545c0 51.413-41.678 93.091-93.091 93.091v0h-837.818c-51.413 0-93.091-41.678-93.091-93.091v0zM930.909 83.782v0c0.002 0 0.002 0 0.004 0 5.14 0 9.305 4.167 9.305 9.305 0 0.002 0 0.002 0 0.004v302.545c0 0.002 0 0.002 0 0.004 0 5.14-4.167 9.305-9.305 9.305-0.002 0-0.002 0-0.004 0h-837.818c-0.002 0-0.002 0-0.004 0-5.14 0-9.305-4.167-9.305-9.305 0-0.002 0-0.002 0-0.004v-302.545c0-0.002 0-0.002 0-0.004 0-5.14 4.167-9.305 9.305-9.305 0.002 0 0.002 0 0.004 0h837.818zM93.091 0c-51.413 0-93.091 41.678-93.091 93.091v0 302.545c0 51.413 41.678 93.091 93.091 93.091v0h837.818c51.413 0 93.091-41.678 93.091-93.091v0-302.545c0-51.413-41.678-93.091-93.091-93.091v0zM162.909 826.182c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0h-93.091c-25.705 0-46.545 20.84-46.545 46.545v0zM162.909 290.909c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0h-93.091c-25.705 0-46.545 20.84-46.545 46.545v0zM465.455 337.455c-25.705 0-46.545-20.84-46.545-46.545v0-93.091c0-25.705 20.84-46.545 46.545-46.545v0h93.091c25.705 0 46.545 20.84 46.545 46.545v0 93.091c0 25.705-20.84 46.545-46.545 46.545v0zM418.909 826.182c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0h-93.091c-25.705 0-46.545 20.84-46.545 46.545v0zM721.454 337.455c-25.705 0-46.545-20.84-46.545-46.545v0-93.091c0-25.705 20.84-46.545 46.545-46.545v0h93.091c25.705 0 46.545 20.84 46.545 46.545v0 93.091c0 25.705-20.84 46.545-46.545 46.545v0zM674.909 826.182c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0h-93.091c-25.705 0-46.545 20.84-46.545 46.545v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Image group-01"],"grid":0},"attrs":[],"properties":{"order":568,"id":46,"name":"image-group","prevSize":32,"code":59736},"setIdx":0,"setId":1,"iconIdx":47},{"icon":{"paths":["M404.945 93.091v0c0-0.002 0-0.002 0-0.004 0-5.14-4.167-9.305-9.305-9.305-0.002 0-0.002 0-0.004 0h-302.545c-0.002 0-0.002 0-0.004 0-5.14 0-9.305 4.167-9.305 9.305 0 0.002 0 0.002 0 0.004v837.818c0 0.002 0 0.002 0 0.004 0 5.14 4.167 9.305 9.305 9.305 0.002 0 0.002 0 0.004 0h302.545c0.002 0 0.002 0 0.004 0 5.14 0 9.305-4.167 9.305-9.305 0-0.002 0-0.002 0-0.004v-837.818zM395.636 0c51.413 0 93.091 41.678 93.091 93.091v0 837.818c0 51.413-41.678 93.091-93.091 93.091v0h-302.545c-51.413 0-93.091-41.678-93.091-93.091v0-837.818c0-51.413 41.678-93.091 93.091-93.091v0zM940.218 930.909v0c0 0.002 0 0.002 0 0.004 0 5.14-4.167 9.305-9.305 9.305-0.002 0-0.002 0-0.004 0h-302.545c-0.002 0-0.002 0-0.004 0-5.14 0-9.305-4.167-9.305-9.305 0-0.002 0-0.002 0-0.004v-837.818c0-0.002 0-0.002 0-0.004 0-5.14 4.167-9.305 9.305-9.305 0.002 0 0.002 0 0.004 0h302.545c0.002 0 0.002 0 0.004 0 5.14 0 9.305 4.167 9.305 9.305 0 0.002 0 0.002 0 0.004v837.818zM1024 93.091c0-51.413-41.678-93.091-93.091-93.091v0h-302.545c-51.413 0-93.091 41.678-93.091 93.091v0l0 837.818c0 51.413 41.678 93.091 93.091 93.091v0h302.545c51.413 0 93.091-41.678 93.091-93.091v0zM197.818 162.909c-25.705 0-46.545 20.84-46.545 46.545v0 93.091c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0zM733.091 162.909c-25.705 0-46.545 20.84-46.545 46.545v0l0 93.091c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0zM686.545 465.455c0-25.705 20.84-46.545 46.545-46.545v0h93.091c25.705 0 46.545 20.84 46.545 46.545v0 93.091c0 25.705-20.84 46.545-46.545 46.545v0h-93.091c-25.705 0-46.545-20.84-46.545-46.545v0zM197.818 418.909c-25.705 0-46.545 20.84-46.545 46.545v0 93.091c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0zM686.545 721.454c0-25.705 20.84-46.545 46.545-46.545v0h93.091c25.705 0 46.545 20.84 46.545 46.545v0 93.091c0 25.705-20.84 46.545-46.545 46.545v0h-93.091c-25.705 0-46.545-20.84-46.545-46.545v0zM197.818 674.909c-25.705 0-46.545 20.84-46.545 46.545v0 93.091c0 25.705 20.84 46.545 46.545 46.545v0h93.091c25.705 0 46.545-20.84 46.545-46.545v0-93.091c0-25.705-20.84-46.545-46.545-46.545v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["group column"],"grid":0},"attrs":[],"properties":{"order":599,"id":47,"prevSize":32,"code":59775,"name":"group-column"},"setIdx":0,"setId":1,"iconIdx":48},{"icon":{"paths":["M1024 929.185c0 31.419-25.471 56.889-56.889 56.889h-872.296c-52.365 0-94.815-42.45-94.815-94.815v0-796.443c0-31.419 25.469-56.889 56.889-56.889s56.889 25.469 56.889 56.889v0 777.481h853.332c31.419 0 56.889 25.469 56.889 56.889v0zM265.478 640.673c-44.137 0-79.918 35.781-79.918 79.918s35.781 79.918 79.918 79.918c44.137 0 79.918-35.781 79.918-79.918v0c-0.047-44.119-35.799-79.871-79.913-79.918h-0.005zM316.051 299.344c0 0 0 0 0 0-44.139 0-79.918 35.781-79.918 79.918s35.781 79.918 79.918 79.918c44.139 0 79.918-35.781 79.918-79.918v0c-0.042-44.122-35.797-79.879-79.915-79.921h-0.005zM463.966 499.093c-0.006 0-0.015 0-0.023 0-44.137 0-79.918 35.781-79.918 79.918s35.781 79.918 79.918 79.918c44.137 0 79.918-35.781 79.918-79.918v0c-0.047-44.111-35.786-79.86-79.891-79.918h-0.005zM710.917 583.778c-44.137 0-79.918 35.781-79.918 79.918s35.781 79.918 79.918 79.918c44.137 0 79.918-35.779 79.918-79.917v0c-0.045-44.121-35.799-79.874-79.913-79.921h-0.005zM738.577 414.654c0-44.137-35.781-79.918-79.918-79.918s-79.918 35.781-79.918 79.918c0 44.137 35.781 79.918 79.918 79.918v0c44.119-0.045 79.873-35.799 79.92-79.913v-0.005zM919.056 367.613c-44.127 0.006-79.895 35.779-79.895 79.907 0 44.132 35.776 79.907 79.907 79.907 44.127 0 79.9-35.77 79.907-79.895v0c-0.047-44.118-35.799-79.871-79.912-79.918h-0.005zM530.954 307.481c44.137 0 79.918-35.781 79.918-79.918s-35.781-79.918-79.918-79.918c-44.137 0-79.918 35.781-79.918 79.918v0c0.049 44.118 35.801 79.87 79.915 79.918h0.005zM876.376 151.692c0-44.137-35.781-79.918-79.918-79.918s-79.918 35.781-79.918 79.918c0 44.137 35.781 79.918 79.918 79.918v0c44.121-0.042 79.876-35.797 79.92-79.915v-0.005z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Scaterplot_ic-01"],"grid":0},"attrs":[],"properties":{"order":567,"id":48,"name":"scatterplot","prevSize":32,"code":59733},"setIdx":0,"setId":1,"iconIdx":49},{"icon":{"paths":["M1023.99 156.832v641.148c0 25.474-20.651 46.125-46.125 46.125s-46.125-20.651-46.125-46.125v0-641.148c-1.038-14.849-12.827-26.638-27.582-27.673l-0.094-0.005h-714.949c-25.474 0-46.125-20.651-46.125-46.125s20.651-46.125 46.125-46.125v0h714.949c65.745 1.205 118.723 54.184 119.926 119.816l0.002 0.114zM599.635 461.262c0-20.38 16.521-36.901 36.901-36.901s36.901 16.521 36.901 36.901c0 20.38-16.521 36.901-36.901 36.901v0c-19.797-1.386-35.515-17.103-36.893-36.775l-0.006-0.125zM166.053 779.525c-4.32 5.71-6.919 12.931-6.919 20.758s2.599 15.049 6.983 20.846l-0.063-0.088c5.71 4.32 12.929 6.919 20.757 6.919s15.047-2.599 20.844-6.983l-0.088 0.063 147.602-166.053 147.602 166.053c5.312 5.312 12.65 8.598 20.757 8.598 16.213 0 29.356-13.143 29.356-29.356 0-8.106-3.287-15.446-8.599-20.758v0l-32.288-36.896 32.288-32.288 110.702 110.702c5.312 5.312 12.65 8.598 20.757 8.598 16.213 0 29.356-13.143 29.356-29.356 0-8.106-3.287-15.446-8.599-20.758l-119.928-119.923c-8.137-8.533-19.592-13.837-32.288-13.837s-24.151 5.306-32.272 13.819l-0.016 0.018-36.901 36.901-83.026-92.252c-7.973-10.55-20.496-17.298-34.594-17.298s-26.622 6.748-34.516 17.189l-0.079 0.109zM751.849 309.046h-641.148v562.729h641.148v-562.729zM788.75 198.345c0.282-0.003 0.616-0.006 0.95-0.006 40.239 0 72.857 32.619 72.857 72.857 0 0.334-0.002 0.668-0.006 1.001v-0.050 641.148c0.003 0.282 0.006 0.616 0.006 0.95 0 40.235-32.617 72.854-72.854 72.854-0.336 0-0.67-0.002-1.005-0.006h-714.899c-0.284 0.003-0.618 0.006-0.954 0.006-40.235 0-72.854-32.617-72.854-72.854 0-0.334 0.002-0.666 0.006-1.001v0.050-641.148c-0.003-0.282-0.006-0.616-0.006-0.95 0-40.239 32.619-72.857 72.857-72.857 0.334 0 0.668 0.002 1.001 0.006h-0.050z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Image Explorer icon-01"],"grid":0},"attrs":[],"properties":{"order":566,"id":49,"name":"image-explorer","prevSize":32,"code":59734},"setIdx":0,"setId":1,"iconIdx":50},{"icon":{"paths":["M204.799 153.6c0-28.276 22.923-51.199 51.199-51.199v0h307.201v102.4c0 84.831 68.769 153.6 153.6 153.6v0h102.4v512c0 28.276-22.923 51.199-51.199 51.199v0h-512c-28.276 0-51.199-22.923-51.199-51.199v0zM747.008 256l-81.409-81.409v30.208c0 28.276 22.923 51.199 51.199 51.199v0zM256-0c-84.831 0-153.6 68.769-153.6 153.6v0 716.801c0 84.831 68.769 153.6 153.6 153.6v0h512c84.831 0 153.6-68.769 153.6-153.6v0-563.201c0-0.088 0-0.193 0-0.295 0-14.065-5.672-26.806-14.852-36.059l-255.996-255.996c-9.25-9.178-21.991-14.848-36.056-14.848-0.104 0-0.209 0-0.311 0.002h0.016zM307.199 422.399c-21.208 0-38.399 17.192-38.399 38.399s17.192 38.399 38.399 38.399v0h307.201c21.208 0 38.399-17.192 38.399-38.399s-17.192-38.399-38.399-38.399v0zM268.8 614.4c0.284-21.092 17.307-38.115 38.372-38.399h409.628c21.208 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0h-409.601c-21.092-0.284-38.115-17.307-38.399-38.372v-0.027zM307.199 729.601c-21.208 0-38.399 17.192-38.399 38.399s17.192 38.399 38.399 38.399v0h409.601c21.208 0 38.399-17.192 38.399-38.399s-17.192-38.399-38.399-38.399v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Full docs_ic-01"],"grid":0},"attrs":[],"properties":{"order":538,"id":50,"name":"full-docs","prevSize":32,"code":59730},"setIdx":0,"setId":1,"iconIdx":51},{"icon":{"paths":["M93.092 744.727h837.817v-605.090h-837.817zM0.001 139.636c0-51.413 41.678-93.091 93.091-93.091v0h837.817c51.413 0 93.091 41.678 93.091 93.091v0 605.090c0 51.413-41.678 93.091-93.091 93.091v0h-372.364v46.545h93.091c25.706 0 46.545 20.839 46.545 46.545s-20.839 46.545-46.545 46.545v0h-279.273c-25.706 0-46.545-20.839-46.545-46.545s20.839-46.545 46.545-46.545v0h93.091v-46.545h-372.364c-51.413 0-93.091-41.678-93.091-93.091v0zM608.814 535.272l-0.008 0.008c-6.429 6.622-15.426 10.736-25.383 10.736-7.972 0-15.328-2.638-21.153-7.022l-139.636-99.142-165.178 165.189c-6.033 4.976-13.765 7.964-22.197 7.964-19.28 0-34.908-15.629-34.908-34.908 0-8.314 2.906-15.95 7.707-21.88l186.19-186.19c6.429-6.622 15.426-10.736 25.383-10.736 7.972 0 15.328 2.638 21.153 7.022l139.636 99.142 186.049-186.1c5.493-3.603 12.063-5.699 19.124-5.699 19.28 0 34.908 15.629 34.908 34.908 0 6.346-1.694 12.296-4.562 17.254z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Live demo_ic-01"],"grid":0},"attrs":[],"properties":{"order":539,"id":51,"name":"live-demo","prevSize":32,"code":59731},"setIdx":0,"setId":1,"iconIdx":52},{"icon":{"paths":["M720.062 353.574c-42.94 0.212-81.684 18.003-109.436 46.54l-0.035 0.036c-28.404 28.726-45.95 68.239-45.95 111.85s17.547 83.124 45.964 111.866l-0.014-0.014c27.949 28.71 66.97 46.52 110.151 46.52s82.202-17.811 110.117-46.487l0.033-0.035c28.292-28.655 45.767-68.049 45.767-111.525 0-86.922-69.85-157.529-156.482-158.75l-0.115-0.001zM303.938 206.026c0.050 0 0.109 0 0.169 0 68.93 0 132.294 23.825 182.309 63.69l-0.592-0.455-72.414 130.889c-27.949-28.71-66.97-46.52-110.151-46.52s-82.202 17.811-110.117 46.487l-0.033 0.035c-28.404 28.726-45.95 68.239-45.95 111.85s17.547 83.124 45.964 111.866l-0.014-0.014c28.006 28.746 67.096 46.577 110.349 46.577 0.17 0 0.338 0 0.508-0.001h-0.026c41.106-0.372 78.378-16.476 106.154-42.573l-0.082 0.076 73.773 127.829c-49.556 38.793-112.775 62.207-181.464 62.207-83.047 0-158.099-34.226-211.822-89.342l-0.061-0.063c-54.653-55.601-88.393-131.911-88.393-216.1 0-0.163 0-0.325 0-0.486v0.025c-0.005-0.608-0.007-1.327-0.007-2.046 0-167.143 134.92-302.774 301.792-303.926h0.11zM720.062 206.026c168.985 0 305.974 136.989 305.974 305.974s-136.989 305.974-305.974 305.974v0c-83.145-0.524-158.227-34.614-212.457-89.387l-0.024-0.025c-54.339-55.933-87.892-132.313-88.052-216.53v-0.031c-0.006-0.712-0.010-1.553-0.010-2.395 0-166.598 134.19-301.854 300.38-303.577l0.164-0.001z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["CO_ic-01"],"grid":0},"attrs":[],"properties":{"order":540,"id":52,"name":"co","prevSize":32,"code":59732},"setIdx":0,"setId":1,"iconIdx":53},{"icon":{"paths":["M227.538 1009.261l157.573-196.968c5.307-6.746 8.513-15.365 8.513-24.731 0-6.182-1.396-12.038-3.889-17.269l0.103 0.242c-6.559-13.17-19.93-22.061-35.375-22.061-0.028 0-0.055 0-0.083 0h-98.479v-689.384c0-32.634-26.456-59.090-59.090-59.090s-59.090 26.456-59.090 59.090v0 689.384h-98.483c-0.024 0-0.052 0-0.079 0-15.447 0-28.816 8.889-35.271 21.832l-0.103 0.229c-2.389 4.989-3.785 10.845-3.785 17.025 0 9.366 3.206 17.986 8.577 24.818l-0.065-0.087 157.573 196.968c7.279 9.020 18.335 14.741 30.727 14.741s23.448-5.721 30.668-14.667l0.059-0.076z"],"width":400,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Sort_one arrow_down_ic-01"],"grid":0},"attrs":[],"properties":{"order":544,"id":53,"name":"sort-arrow-down","prevSize":32,"code":59675},"setIdx":0,"setId":1,"iconIdx":54},{"icon":{"paths":["M166.086 14.855l-157.573 196.968c-5.307 6.746-8.513 15.365-8.513 24.731 0 6.182 1.396 12.038 3.889 17.269l-0.103-0.242c6.559 13.17 19.93 22.061 35.375 22.061 0.028 0 0.055 0 0.083 0h98.479v689.384c0 32.634 26.456 59.090 59.090 59.090s59.090-26.456 59.090-59.090v0-689.384h98.483c0.024 0 0.052 0 0.079 0 15.447 0 28.816-8.889 35.271-21.832l0.103-0.229c2.389-4.989 3.785-10.845 3.785-17.025 0-9.366-3.206-17.986-8.577-24.818l0.065 0.087-157.573-196.968c-7.279-9.020-18.335-14.741-30.727-14.741s-23.448 5.721-30.668 14.667l-0.059 0.076z"],"width":400,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Sort_one arrow_ic-01"],"grid":0},"attrs":[],"properties":{"order":394,"id":54,"name":"sort-arrow-up","prevSize":32,"code":59729},"setIdx":0,"setId":1,"iconIdx":55},{"icon":{"paths":["M94.868 37.991c-52.358 0-94.805 42.445-94.806 94.803v0 758.575c0 0 0 0.002 0 0.003 0 52.358 42.445 94.805 94.805 94.805 0.002 0 0.002 0 0.003 0h834.386c52.36-0.002 94.806-42.446 94.806-94.806v0-758.575c-0.005-52.358-42.448-94.801-94.806-94.803v0zM910.295 429.921v442.491h-796.466v-720.648h796.466v278.157zM485.357 461.131c-10.557-11.491-25.654-18.667-42.428-18.667s-31.87 7.176-42.39 18.625l-0.037 0.042-236.292 257.768c-5.627 6.124-9.077 14.327-9.077 23.337 0 19.075 15.463 34.537 34.537 34.537 10.064 0 19.125-4.306 25.437-11.175l0.023-0.024 227.801-248.513 227.801 248.513c6.335 6.895 15.395 11.201 25.46 11.201 19.075 0 34.537-15.463 34.537-34.537 0-9.009-3.45-17.213-9.1-23.362l0.023 0.024-122.859-134.029 19.671-21.859 190.71 202.879c6.32 6.749 15.284 10.953 25.231 10.953 19.073 0 34.535-15.462 34.535-34.535 0-9.197-3.595-17.555-9.456-23.744l0.015 0.016-199.279-211.996c-10.524-11.177-25.419-18.138-41.94-18.138-16.959 0-32.204 7.333-42.738 19.002l-0.045 0.050-23.595 26.219zM719.213 419.905c38.147 0 69.071-30.925 69.071-69.071s-30.925-69.071-69.071-69.071c-38.147 0-69.071 30.925-69.071 69.071v0c0 38.147 30.925 69.071 69.071 69.071v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["icon"],"grid":0},"attrs":[],"properties":{"order":541,"id":55,"name":"images","prevSize":32,"code":59728},"setIdx":0,"setId":1,"iconIdx":56},{"icon":{"paths":["M929.206 94.767c-126.362-126.364-331.242-126.364-457.604 0l-94.21 94.212c-22.302 22.3-22.302 58.454 0 80.754s58.449 22.3 80.749 0l94.217-94.212c81.762-81.764 214.329-81.764 296.098 0 81.762 81.764 81.762 214.336 0 296.098l-94.217 94.21c-22.3 22.3-22.3 58.456 0 80.758s58.456 22.3 80.758 0l94.21-94.21c126.362-126.369 126.362-331.244 0-457.608zM269.718 458.157c22.3-22.3 22.3-58.449 0-80.749-22.3-22.302-58.454-22.302-80.754 0l-94.212 94.21c-126.364 126.362-126.364 331.242 0 457.604s331.237 126.362 457.606 0l94.21-94.21c22.3-22.3 22.3-58.456 0-80.758s-58.456-22.3-80.758 0l-94.21 94.21c-81.762 81.769-214.332 81.769-296.096 0-81.764-81.762-81.764-214.329 0-296.091l94.212-94.217zM660.030 444.697c22.3-22.293 22.3-58.449 0-80.749s-58.456-22.3-80.758 0l-215.34 215.34c-22.3 22.3-22.3 58.456 0 80.758s58.456 22.3 80.758 0l215.34-215.349z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Link_ic"],"grid":0},"attrs":[],"properties":{"order":565,"id":56,"name":"link","prevSize":32,"code":59710},"setIdx":0,"setId":1,"iconIdx":57},{"icon":{"paths":["M192.001 0.004c-106.038 0-192 85.962-192 192v0 640c0 106.038 85.962 192 192 192v0h640c0.001 0 0.003 0 0.004 0 106.036 0 191.995-85.959 191.995-191.995 0-0.001 0-0.003 0-0.004v0-640c0-106.038-85.962-192-192-192v0zM737.939 286.063c8.686 8.686 14.059 20.686 14.059 33.94s-5.373 25.255-14.059 33.94l-158.055 158.059 158.055 158.061c8.902 8.721 14.422 20.866 14.422 34.3 0 26.509-21.49 48-48 48-13.434 0-25.579-5.52-34.293-14.413l-158.068-158.062-158.059 158.055c-8.71 8.839-20.814 14.317-34.197 14.317-26.509 0-48-21.49-48-48 0-13.381 5.476-25.485 14.308-34.189l158.062-158.067-158.056-158.059c-8.674-8.685-14.040-20.676-14.040-33.922 0-26.509 21.49-48 48-48 13.245 0 25.237 5.365 33.922 14.040v0l158.059 158.056 158.061-158.056c8.685-8.686 20.685-14.059 33.939-14.059s25.254 5.373 33.939 14.059v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Close_rectangle_ic-01"],"grid":0},"attrs":[],"properties":{"order":564,"id":57,"name":"close-rectangle","prevSize":32,"code":59648},"setIdx":0,"setId":1,"iconIdx":58},{"icon":{"paths":["M130.908 22.246c-13.903-13.886-33.099-22.476-54.304-22.476-42.437 0-76.84 34.403-76.84 76.84 0 21.203 8.589 40.401 22.476 54.304v0l381.047 381.042-381.047 381.054c-13.661 13.862-22.096 32.907-22.096 53.92 0 42.437 34.403 76.84 76.84 76.84 21.016 0 40.060-8.438 53.934-22.108l381.032-381.035 381.054 381.044c13.846 13.562 32.82 21.931 53.752 21.931 42.437 0 76.84-34.403 76.84-76.84 0-20.932-8.368-39.906-21.943-53.766l-381.032-381.042 381.044-381.042c13.663-13.862 22.099-32.909 22.099-53.925 0-42.437-34.403-76.84-76.84-76.84-21.013 0-40.058 8.436-53.93 22.106l-381.044 381.042z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Close_ic-01"],"grid":0},"attrs":[],"properties":{"order":563,"id":58,"name":"close","prevSize":32,"code":59649},"setIdx":0,"setId":1,"iconIdx":59},{"icon":{"paths":["M512 1024.004c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512v0c0 282.77 229.23 512 512 512v0zM737.939 286.062c8.687 8.687 14.060 20.687 14.060 33.941s-5.373 25.256-14.060 33.941l-158.055 158.060 158.055 158.061c8.903 8.721 14.423 20.867 14.423 34.301 0 26.51-21.491 48-48 48-13.434 0-25.58-5.52-34.293-14.414l-158.069-158.063-158.060 158.055c-8.711 8.84-20.814 14.318-34.197 14.318-26.51 0-48-21.491-48-48 0-13.382 5.477-25.485 14.309-34.19l158.063-158.067-158.057-158.060c-8.675-8.685-14.040-20.676-14.040-33.923 0-26.51 21.491-48 48-48 13.245 0 25.238 5.366 33.923 14.040v0l158.060 158.057 158.061-158.057c8.685-8.687 20.685-14.060 33.939-14.060s25.254 5.373 33.939 14.060v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Close_circle_ic-01"],"grid":0},"attrs":[],"properties":{"order":562,"id":59,"name":"close-circle","prevSize":32,"code":59650},"setIdx":0,"setId":1,"iconIdx":60},{"icon":{"paths":["M618.666 512.026c0 58.91-47.756 106.666-106.666 106.666s-106.666-47.756-106.666-106.666c0-58.91 47.756-106.666 106.666-106.666v0c58.888 0.056 106.61 47.778 106.666 106.662v0.006zM1024 512.006c-85.826 202.142-282.658 341.334-512 341.334s-426.176-139.192-510.628-337.706l-1.372-3.628c85.826-202.142 282.658-341.334 512-341.334s426.176 139.192 510.628 337.706l1.372 3.628zM746.666 512.026c0-129.602-105.064-234.666-234.666-234.666s-234.666 105.064-234.666 234.666c0 129.602 105.064 234.666 234.666 234.666v0c129.548-0.136 234.532-105.118 234.666-234.654v-0.014z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Eye_fill_show_ic"],"grid":0},"attrs":[],"properties":{"order":561,"id":60,"name":"eye-fill-show","prevSize":32,"code":59651},"setIdx":0,"setId":1,"iconIdx":61},{"icon":{"paths":["M1020.372 531.977l-0.014 0.060-0.023 0.060-0.060 0.144-0.139 0.37-0.418 1.079-1.38 3.413c-1.172 2.823-2.825 6.713-5.015 11.515-4.37 9.596-10.871 22.907-19.746 38.684-24.898 43.754-52.899 81.566-84.83 115.651l0.308-0.332q-4.444 4.731-9.083 9.468l-80.458-80.458q3.333-3.413 6.532-6.834c25.573-27.303 48.22-57.884 67.111-90.892l1.255-2.38c4.133-7.344 7.57-13.922 10.343-19.518-2.773-5.596-6.208-12.176-10.343-19.518-20.142-35.39-42.791-65.971-68.615-93.543l0.249 0.268c-76.119-82.396-184.719-133.818-305.33-133.818-3.067 0-6.124 0.034-9.175 0.1l0.455-0.007c-0.174 0-0.382 0-0.588 0-19.351 0-38.437 1.132-57.196 3.333l2.277-0.217-96.824-96.828c44.873-12.745 96.407-20.071 149.653-20.071 0.942 0 1.884 0.002 2.827 0.007h-0.146c2.617-0.046 5.703-0.073 8.796-0.073 153.293 0 291.353 65.216 387.95 169.416l0.313 0.341c31.626 33.751 59.628 71.56 82.974 112.376l1.548 2.939c8.875 15.772 15.376 29.088 19.746 38.679 2.19 4.802 3.842 8.695 5.015 11.515l1.38 3.413 0.418 1.074 0.139 0.379 0.060 0.144 0.023 0.060 0.014 0.060c2.295 5.932 3.625 12.796 3.625 19.971s-1.33 14.039-3.756 20.361l0.132-0.389zM492.228 304.339l227.439 227.439q0.924-9.764 0.926-19.772c0-115.201-93.39-208.591-208.591-208.591v0q-10 0-19.772 0.926zM3.644 491.975l0.023-0.060 0.055-0.144 0.139-0.379 0.421-1.074 1.38-3.413c1.163-2.82 2.82-6.713 5.006-11.515 4.37-9.593 10.871-22.907 19.746-38.679 24.896-43.754 52.899-81.566 84.833-115.647l-0.306 0.329c20.185-21.527 41.735-41.191 64.723-59.091l1.248-0.935-164.248-164.244c-10.295-10.295-16.663-24.517-16.663-40.227 0-31.418 25.47-56.889 56.889-56.889 15.71 0 29.932 6.368 40.226 16.663l910.212 910.214c10.219 10.281 16.535 24.451 16.535 40.096 0 31.417-25.468 56.883-56.883 56.883-15.644 0-29.813-6.315-40.098-16.535l-183.907-183.899c-66.238 30.88-143.802 48.898-225.574 48.898-1.899 0-3.796-0.009-5.689-0.028l0.29 0.002c-2.613 0.046-5.694 0.073-8.782 0.073-153.295 0-291.36-65.214-387.964-169.412l-0.311-0.34c-31.623-33.753-59.625-71.564-82.974-112.378l-1.55-2.94c-8.875-15.778-15.376-29.088-19.746-38.684-2.19-4.802-3.847-8.69-5.006-11.515l-1.38-3.413-0.421-1.079-0.139-0.37-0.055-0.144-0.028-0.059zM3.621 531.977c-2.293-5.932-3.621-12.796-3.621-19.971s1.328-14.039 3.753-20.361l-0.132 0.389zM417.183 512.005c0.053 52.377 42.524 94.814 94.908 94.814 4.7 0 9.321-0.341 13.836-1.001l-0.514 0.062-107.292-107.292c-0.597 4.014-0.937 8.645-0.937 13.358 0 0.021 0 0.041 0 0.062v-0.004zM655.487 735.938l-41.783-41.778c-29.28 16.633-64.32 26.435-101.649 26.435-115.235 0-208.65-93.416-208.65-208.65 0-37.33 9.803-72.369 26.976-102.686l-0.54 1.036-67.651-67.648c-23.915 17.333-44.928 35.911-64.010 56.316l-0.229 0.249c-25.573 27.303-48.222 57.884-67.111 90.894l-1.255 2.38c-4.13 7.342-7.564 13.922-10.343 19.518 2.777 5.596 6.213 12.176 10.343 19.518 20.147 35.388 42.794 65.969 68.617 93.543l-0.251-0.27c76.115 82.396 184.714 133.818 305.323 133.818 3.068 0 6.13-0.034 9.182-0.1l-0.455 0.007c0.992 0.007 2.164 0.012 3.337 0.012 50.128 0 98.323-8.27 143.295-23.522l-3.143 0.924z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Eye_outline_hide_ic"],"grid":0},"attrs":[],"properties":{"order":560,"id":61,"name":"eye-outline-hide","prevSize":32,"code":59652},"setIdx":0,"setId":1,"iconIdx":62},{"icon":{"paths":["M512 303.413c-115.201 0-208.591 93.39-208.591 208.591s93.39 208.591 208.591 208.591c115.201 0 208.591-93.39 208.591-208.591v0c0-115.201-93.39-208.591-208.591-208.591v0zM512 606.819c-52.364 0-94.814-42.45-94.814-94.814s42.45-94.814 94.814-94.814c52.364 0 94.814 42.45 94.814 94.814v0c0 0.002 0 0.004 0 0.005 0 52.362-42.448 94.81-94.81 94.81-0.002 0-0.004 0-0.005 0v0zM1020.373 492.032l-0.016-0.057-0.023-0.060-0.060-0.144-0.139-0.379-0.418-1.074-1.38-3.413c-1.172-2.82-2.825-6.713-5.015-11.515-4.37-9.593-10.871-22.907-19.746-38.679-24.894-43.754-52.896-81.564-84.83-115.646l0.306 0.331c-96.908-104.542-234.971-169.759-388.265-169.759-3.092 0-6.176 0.027-9.255 0.080l0.462-0.007c-2.615-0.046-5.7-0.073-8.791-0.073-153.293 0-291.357 65.216-387.955 169.418l-0.311 0.34c-31.627 33.751-59.628 71.561-82.974 112.376l-1.548 2.939c-8.875 15.772-15.376 29.088-19.746 38.679-2.19 4.802-3.847 8.695-5.006 11.515l-1.38 3.413-0.421 1.074-0.139 0.379-0.055 0.144-0.028 0.062-0.023 0.060c-2.293 5.932-3.621 12.796-3.621 19.971s1.328 14.039 3.753 20.361l-0.132-0.389 0.046 0.121 0.055 0.144 0.139 0.37 0.421 1.079 1.38 3.413c1.163 2.823 2.82 6.713 5.006 11.515 4.37 9.596 10.871 22.907 19.746 38.684 24.898 43.754 52.899 81.566 84.83 115.651l-0.308-0.332c96.915 104.536 234.978 169.748 388.272 169.748 3.092 0 6.176-0.027 9.255-0.080l-0.464 0.007c2.613 0.046 5.698 0.073 8.788 0.073 153.295 0 291.359-65.214 387.959-169.412l0.311-0.34c31.623-33.753 59.625-71.564 82.974-112.378l1.55-2.94c8.875-15.778 15.376-29.088 19.746-38.684 2.19-4.802 3.842-8.69 5.015-11.515l1.38-3.413 0.418-1.079 0.139-0.37 0.060-0.144 0.023-0.060 0.014-0.060c2.295-5.932 3.625-12.796 3.625-19.971s-1.33-14.039-3.756-20.361l0.132 0.389zM894.416 531.523c-20.146 35.388-42.793 65.969-68.615 93.543l0.251-0.27c-76.115 82.396-184.714 133.818-305.323 133.818-3.068 0-6.13-0.034-9.182-0.1l0.455 0.007c-2.597 0.059-5.659 0.092-8.727 0.092-120.609 0-229.206-51.422-305.067-133.537l-0.256-0.281c-25.571-27.303-48.218-57.884-67.111-90.892l-1.255-2.38c-4.13-7.344-7.564-13.922-10.343-19.518 2.777-5.596 6.213-12.176 10.343-19.518 20.144-35.388 42.793-65.971 68.615-93.543l-0.249 0.268c76.119-82.396 184.719-133.818 305.33-133.818 3.067 0 6.124 0.034 9.175 0.1l-0.455-0.007c2.596-0.059 5.653-0.092 8.72-0.092 120.611 0 229.211 51.422 305.074 133.537l0.256 0.279c25.575 27.301 48.224 57.884 67.111 90.894l1.253 2.379c4.133 7.342 7.57 13.922 10.343 19.518-2.773 5.596-6.208 12.176-10.343 19.518z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Eye_show_outline_ic"],"grid":0},"attrs":[],"properties":{"order":559,"id":62,"name":"eye-show-outline","prevSize":32,"code":59653},"setIdx":0,"setId":1,"iconIdx":63},{"icon":{"paths":["M1007.398 926.943l-910.336-910.341c-10.296-10.296-24.521-16.665-40.231-16.665-31.423 0-56.896 25.474-56.896 56.896 0 15.712 6.369 29.936 16.665 40.233l205.458 205.458c-71.412 54.212-127.716 124.713-163.9 206.139l-1.326 3.343c76.495 179.549 251.363 303.184 455.137 303.448h0.034c0.715 0.004 1.561 0.005 2.407 0.005 66.466 0 129.82-13.328 187.532-37.459l-3.213 1.191 228.215 228.211c10.282 10.218 24.453 16.535 40.099 16.535 31.421 0 56.891-25.472 56.891-56.891 0-15.648-6.317-29.819-16.541-40.105l0.004 0.004zM512 720.644c-115.169-0.121-208.498-93.45-208.619-208.609v-0.012c0.188-37.162 10.314-71.919 27.851-101.802l-0.519 0.957 88.758 88.753c-0.942 3.378-1.748 7.48-2.255 11.674l-0.041 0.416c0.050 52.352 42.475 94.777 94.823 94.827h0.005c4.609-0.548 8.71-1.355 12.697-2.438l-0.608 0.14 88.758 88.758c-28.926 17.019-63.685 27.145-100.795 27.333h-0.053zM493.219 305.301l-85.913-85.913c31.451-6.836 67.596-10.778 104.655-10.83h0.039c203.808 0.261 378.675 123.897 453.947 300.222l1.223 3.225c-27.047 61.907-63.29 114.822-107.651 159.695l0.048-0.050-140.845-140.847c0.574-6.283 1.897-12.348 1.897-18.779-0.121-115.169-93.45-208.5-208.609-208.619h-0.012c-6.431 0-12.496 1.325-18.781 1.899z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Eye_fill_hide_ic"],"grid":0},"attrs":[],"properties":{"order":558,"id":63,"name":"eye-fill-hide","prevSize":32,"code":59654},"setIdx":0,"setId":1,"iconIdx":64},{"icon":{"paths":["M336.775 700.845l-134.295 167.87c-6.204 7.71-15.64 12.601-26.217 12.601s-20.012-4.891-26.167-12.537l-0.050-0.065-134.295-167.87c-4.583-5.691-7.356-13.007-7.356-20.972 0-18.542 15.031-33.573 33.573-33.573h83.934v-470.034c0-27.813 22.547-50.361 50.361-50.361s50.361 22.547 50.361 50.361v0 470.034h83.934c18.542 0 33.573 15.033 33.573 33.573 0 7.965-2.773 15.28-7.406 21.037l0.050-0.065zM982.034 159.48h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.034 360.923h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.034 562.365h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.034 763.808h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Row height_down_ic-01"],"grid":0},"attrs":[],"properties":{"order":557,"id":64,"name":"row-height-down","prevSize":32,"code":59655},"setIdx":0,"setId":1,"iconIdx":65},{"icon":{"paths":["M1024 512.004c0 0.001 0 0.004 0 0.007 0 9.486-4.389 17.946-11.246 23.462l-0.058 0.045-150.589 120.47c-5.106 4.114-11.671 6.604-18.817 6.604-16.631 0-30.113-13.482-30.113-30.113 0-0.001 0-0.004 0-0.006v0-90.353h-180.706c-16.633 0-30.117-13.484-30.117-30.117s13.484-30.117 30.117-30.117v0h180.706v-90.353c0-16.633 13.485-30.117 30.117-30.117 7.145 0 13.707 2.488 18.871 6.644l-0.058-0.045 150.589 120.474c6.916 5.56 11.305 14.020 11.305 23.504 0 0.003 0 0.007 0 0.010v0zM391.53 481.886h-180.706v-90.353c0 0 0-0.001 0-0.001 0-16.633-13.484-30.117-30.117-30.117-7.146 0-13.711 2.489-18.874 6.647l0.058-0.045-150.589 120.474c-6.915 5.565-11.301 14.027-11.301 23.514s4.388 17.949 11.243 23.469l0.058 0.045 150.589 120.47c5.106 4.112 11.671 6.601 18.816 6.601 16.633 0 30.117-13.484 30.117-30.116v0-90.353h180.706c16.633 0 30.117-13.484 30.117-30.117s-13.484-30.117-30.117-30.117v0zM512 105.416c-24.95 0-45.176 20.226-45.176 45.176v0 722.823c0 24.95 20.226 45.176 45.176 45.176s45.176-20.226 45.176-45.176v0-722.823c0-24.95-20.226-45.176-45.176-45.176v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Reset width_outside_ic"],"grid":0},"attrs":[],"properties":{"order":556,"id":65,"name":"reset-width-outside","prevSize":32,"code":59656},"setIdx":0,"setId":1,"iconIdx":66},{"icon":{"paths":["M1024.001 512.004c0 15.709-12.735 28.444-28.444 28.444v0h-170.667v85.333c0 0.001 0 0.003 0 0.005 0 15.707-12.733 28.44-28.44 28.44-6.749 0-12.951-2.351-17.827-6.28l0.055 0.043-142.223-113.777c-6.532-5.255-10.677-13.248-10.677-22.208s4.145-16.953 10.621-22.165l0.055-0.043 142.223-113.781c4.821-3.883 11.020-6.232 17.768-6.232 15.709 0 28.444 12.735 28.444 28.444v0 85.333h170.667c15.709 0 28.444 12.735 28.444 28.444v0zM387.549 489.795l-142.223-113.781c-4.823-3.884-11.023-6.235-17.771-6.235-15.709 0-28.444 12.735-28.444 28.444 0 0 0 0.001 0 0.001v0 85.333h-170.667c-15.709 0-28.444 12.735-28.444 28.444s12.735 28.444 28.444 28.444v0h170.667v85.333c0.001 15.709 12.736 28.443 28.444 28.443 6.749 0 12.949-2.351 17.825-6.277l-0.055 0.043 142.223-113.777c6.531-5.256 10.673-13.248 10.673-22.208s-4.144-16.952-10.619-22.165l-0.055-0.043zM512 128.004c-23.564 0-42.667 19.103-42.667 42.667v0 682.668c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-682.668c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Reset width_inside_ic"],"grid":0},"attrs":[],"properties":{"order":555,"id":66,"name":"reset-width-inside","prevSize":32,"code":59657},"setIdx":0,"setId":1,"iconIdx":67},{"icon":{"paths":["M340.815 358.68c-5.546 11.35-17.006 19.028-30.257 19.028h-83.934v470.033c0 27.813-22.547 50.361-50.361 50.361s-50.361-22.547-50.361-50.361v0-470.033h-83.934c0 0-0.002 0-0.002 0-18.542 0-33.573-15.031-33.573-33.573 0-7.966 2.775-15.284 7.409-21.040l-0.050 0.065 134.294-167.869c6.205-7.708 15.64-12.598 26.217-12.598s20.012 4.89 26.167 12.534l0.050 0.065 134.294 167.869c4.583 5.691 7.356 13.009 7.356 20.972 0 5.291-1.223 10.294-3.402 14.746l0.088-0.198zM982.033 159.48h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.033 360.923h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.033 562.365h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.033 763.808h-537.18c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.18c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Row height_up_ic-01"],"grid":0},"attrs":[],"properties":{"order":554,"id":67,"name":"row-height-up","prevSize":32,"code":59658},"setIdx":0,"setId":1,"iconIdx":68},{"icon":{"paths":["M16.697 429.262c-9.603 9.619-15.554 22.896-15.554 37.585 0 29.371 23.808 53.18 53.18 53.18 14.673 0 27.959-5.948 37.585-15.554v0l53.557-53.555 189.897 189.901c41.702 41.702 67.499 99.316 67.499 162.947 0 0.909-0.006 1.834-0.020 2.736l0.002-0.142-1.713 151.053c-0.002 0.177-0.004 0.388-0.004 0.594 0 29.371 23.808 53.18 53.18 53.18 14.685 0 27.977-5.949 37.599-15.574l212.328-212.319 169.398 169.398c9.642 8.902 22.58 14.357 36.786 14.357 29.992 0 54.305-24.312 54.305-54.305 0-14.202-5.445-27.144-14.391-36.829l-169.366-169.366 212.319-212.328c9.619-9.622 15.574-22.914 15.574-37.599 0-29.371-23.808-53.18-53.18-53.18-0.214 0-0.417 0.002-0.63 0.004h0.027l-151.053 1.713c-0.779 0.011-1.691 0.017-2.61 0.017-63.636 0-121.25-25.794-162.947-67.497l-189.901-189.901 53.555-53.557c9.781-9.65 15.84-23.046 15.84-37.861 0-29.371-23.808-53.18-53.18-53.18-14.815 0-28.21 6.059-37.853 15.831l-0.006 0.008-319.060 319.060zM410.568 565.6l-189.897-189.897 152.689-152.678 189.896 189.898c60.958 60.958 145.146 98.643 238.153 98.643 1.346 0 2.673-0.009 4.022-0.027l20.376-0.229-316.858 316.858 0.231-20.588c0.016-1.135 0.025-2.479 0.025-3.817 0-93.005-37.701-177.201-98.643-238.153v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Pin_right_ic-01"],"grid":0},"attrs":[],"properties":{"order":553,"id":68,"name":"pin-right","prevSize":32,"code":59659},"setIdx":0,"setId":1,"iconIdx":69},{"icon":{"paths":["M592.958 14.224c-9.779-9.779-23.288-15.828-38.211-15.828-29.844 0-54.039 24.193-54.039 54.039 0 14.923 6.049 28.43 15.826 38.209l54.419 54.421-192.957 192.962c-42.377 42.375-100.92 68.585-165.584 68.585-0.932 0-1.863-0.005-2.793-0.017l-153.347-1.739c-0.182-0.002-0.399-0.003-0.615-0.003-29.844 0-54.037 24.193-54.037 54.037 0 14.923 6.049 28.434 15.83 38.213l215.747 215.745-172.137 172.134c-9.048 9.798-14.597 22.946-14.597 37.389 0 30.475 24.705 55.182 55.182 55.182 14.443 0 27.591-5.549 37.428-14.632l-0.037 0.034 172.137-172.134 215.745 215.745c9.779 9.779 23.288 15.828 38.211 15.828 29.844 0 54.037-24.193 54.037-54.037 0-0.214-0.002-0.431-0.003-0.645v0.032l-1.744-153.488c-0.010-0.789-0.015-1.719-0.015-2.651 0-64.664 26.21-123.207 68.585-165.584l192.964-192.964 54.419 54.426c9.779 9.779 23.288 15.828 38.211 15.828 29.845 0 54.039-24.193 54.039-54.039 0-14.923-6.049-28.432-15.828-38.211l-324.208-324.206zM454.415 414.444l192.964-192.96 155.151 155.159-192.957 192.964c-61.935 61.933-100.242 147.493-100.242 242.002 0 1.363 0.008 2.722 0.024 4.081l-0.002-0.206 0.238 20.916-321.972-321.976 20.921 0.238c1.153 0.014 2.518 0.022 3.882 0.022 94.504 0 180.062-38.307 241.994-100.241v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Pin_left_ic-01"],"grid":0},"attrs":[],"properties":{"order":552,"id":69,"name":"pin-left","prevSize":32,"code":59660},"setIdx":0,"setId":1,"iconIdx":70},{"icon":{"paths":["M223.104 0.014c-29.251 0-52.964 23.713-52.964 52.964s23.713 52.964 52.964 52.964v0h75.435v267.471c-0.002 64.292-26.438 122.411-69.031 164.079l-0.041 0.041-107.586 105.173c-9.838 9.625-15.939 23.036-15.939 37.873 0 29.251 23.712 52.963 52.963 52.964h299.059v238.611c1.228 28.897 24.953 51.859 54.042 51.859s52.814-22.962 54.037-51.748l0.003-0.111-0.007-238.608h299.059c0 0 0 0 0 0 29.251 0 52.964-23.713 52.964-52.964 0-14.837-6.101-28.248-15.929-37.863l-0.010-0.010-107.581-105.173c-42.636-41.708-69.072-99.826-69.072-164.119v0-267.474h75.428c29.251 0 52.964-23.713 52.964-52.964s-23.713-52.964-52.964-52.964v0h-577.793zM404.467 373.414v-267.471h215.070v267.471c0 0 0 0 0 0.002 0 93.966 38.636 178.907 100.889 239.805l0.061 0.060 14.661 14.335h-446.298l14.665-14.335c62.314-60.957 100.952-145.899 100.952-239.866v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Pin_ic-01"],"grid":0},"attrs":[],"properties":{"order":542,"id":70,"name":"pin","prevSize":32,"code":59661},"setIdx":0,"setId":1,"iconIdx":71},{"icon":{"paths":["M875.366 512.005c0 0.002 0 0.005 0 0.006 0 10.402-4.809 19.682-12.327 25.734l-0.063 0.050-165.162 132.128c-5.601 4.512-12.802 7.243-20.642 7.243-18.243 0-33.032-14.789-33.032-33.032 0 0 0-0.002 0-0.002v0-99.097h-264.269v99.097c-0.002 18.243-14.79 33.030-33.032 33.030-7.838 0-15.038-2.73-20.7-7.29l0.063 0.050-165.162-132.128c-7.584-6.104-12.395-15.385-12.395-25.79s4.812-19.686 12.331-25.74l0.063-0.050 165.162-132.133c5.601-4.51 12.801-7.24 20.637-7.24 18.243 0 33.032 14.789 33.032 33.032 0 0 0 0.002 0 0.002v0 99.097h264.269v-99.097c0-0.002 0-0.003 0-0.005 0-18.243 14.789-33.032 33.032-33.032 7.839 0 15.041 2.731 20.705 7.293l-0.063-0.050 165.162 132.133c7.581 6.101 12.392 15.38 12.392 25.781 0 0.003 0 0.006 0 0.009v0zM974.452 66.070c-27.365 0-49.548 22.184-49.548 49.548v0 792.773c0 27.365 22.184 49.548 49.548 49.548s49.548-22.184 49.548-49.548v0-792.773c0-27.365-22.184-49.548-49.548-49.548v0zM49.548 66.070c-27.365 0-49.548 22.184-49.548 49.548v0 792.773c0 27.365 22.184 49.548 49.548 49.548s49.548-22.184 49.548-49.548v0-792.773c0-27.365-22.184-49.548-49.548-49.548v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Expand_horizontal_ic-01"],"grid":0},"attrs":[],"properties":{"order":545,"id":71,"name":"expand-horizontal","prevSize":32,"code":59662},"setIdx":0,"setId":1,"iconIdx":72},{"icon":{"paths":["M354.077 326.206l132.133-165.162c6.104-7.584 15.385-12.395 25.79-12.395s19.686 4.812 25.74 12.331l0.050 0.063 132.129 165.162zM354.077 326.206c-4.51 5.601-7.24 12.801-7.24 20.637 0 18.243 14.789 33.032 33.032 33.032 0 0 0.002 0 0.002 0h99.097v264.259h-99.097c-18.243 0-33.032 14.79-33.032 33.032 0 7.836 2.728 15.033 7.287 20.697l-0.050-0.063 132.133 165.162c6.102 7.586 15.385 12.399 25.79 12.399s19.688-4.814 25.74-12.334l0.050-0.063 132.129-165.162c4.512-5.601 7.243-12.801 7.243-20.638 0-18.24-14.787-33.027-33.027-33.027-0.002 0-0.005 0-0.006 0h-99.097v-264.259h99.097c18.243-0.002 33.030-14.79 33.030-33.032 0-7.838-2.73-15.038-7.29-20.7l0.050 0.063zM908.387 0.004h-792.775c-27.365 0-49.548 22.184-49.548 49.548s22.184 49.548 49.548 49.548v0h792.775c27.365 0 49.548-22.184 49.548-49.548s-22.184-49.548-49.548-49.548v0zM908.387 924.907h-792.775c-27.365 0-49.548 22.184-49.548 49.548s22.184 49.548 49.548 49.548v0h792.775c27.365 0 49.548-22.184 49.548-49.548s-22.184-49.548-49.548-49.548v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Expand_vertical_ic-01"],"grid":0},"attrs":[],"properties":{"order":590,"id":72,"name":"expand-vertical","prevSize":32,"code":59663},"setIdx":0,"setId":1,"iconIdx":73},{"icon":{"paths":["M1004.681 642.934l-445.44-445.44c-12.090-12.092-28.791-19.571-47.241-19.571s-35.152 7.479-47.241 19.571l-445.446 445.44c-11.879 12.054-19.214 28.614-19.214 46.886 0 36.901 29.915 66.816 66.816 66.816 18.274 0 34.834-7.337 46.899-19.224l398.186-398.184 398.199 398.192c12.075 12 28.716 19.418 47.091 19.418 36.899 0 66.81-29.913 66.81-66.81 0-18.377-7.419-35.018-19.425-47.097l0.004 0.004z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Arrow_up_ic-01"],"grid":0},"attrs":[],"properties":{"order":476,"id":73,"name":"arrow-up","prevSize":32,"code":59664},"setIdx":0,"setId":1,"iconIdx":74},{"icon":{"paths":["M197.451 464.753c-12.093 12.091-19.573 28.797-19.573 47.249s7.48 35.158 19.573 47.249l445.502 445.496c12.076 12.001 28.72 19.421 47.097 19.421 36.904 0 66.818-29.916 66.818-66.818 0-18.379-7.42-35.022-19.427-47.103l-398.238-398.241 398.243-398.243c11.809-12.043 19.095-28.555 19.095-46.771 0-36.906-29.919-66.824-66.824-66.824-18.212 0-34.722 7.286-46.775 19.101l-445.492 445.485z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Arrow_left_ic-01"],"grid":0},"attrs":[],"properties":{"order":477,"id":74,"name":"arrow-left","prevSize":32,"code":59665},"setIdx":0,"setId":1,"iconIdx":75},{"icon":{"paths":["M1004.265 286.774c-12.079-12.081-28.767-19.554-47.201-19.554s-35.122 7.473-47.201 19.554l-397.865 397.863-397.859-397.863c-12.115-12.294-28.949-19.913-47.562-19.913-36.87 0-66.76 29.89-66.76 66.76 0 18.611 7.617 35.445 19.901 47.552l445.079 445.072c12.079 12.081 28.767 19.554 47.201 19.554s35.122-7.473 47.201-19.554l445.064-445.064c12.081-12.079 19.554-28.769 19.554-47.203s-7.473-35.124-19.554-47.203v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Arrow_down_ic-01"],"grid":0},"attrs":[],"properties":{"order":478,"id":75,"name":"arrow-down","prevSize":32,"code":59666},"setIdx":0,"setId":1,"iconIdx":76},{"icon":{"paths":["M826.603 464.744l-445.579-445.579c-12.062-11.901-28.64-19.249-46.932-19.249-36.913 0-66.837 29.924-66.837 66.837 0 18.295 7.35 34.874 19.259 46.942l398.317 398.31-398.323 398.319c-11.797 12.043-19.076 28.548-19.076 46.755 0 36.913 29.924 66.837 66.837 66.837 18.207 0 34.711-7.279 46.767-19.086l445.568-445.568c12.095-12.093 19.577-28.803 19.577-47.258s-7.482-35.165-19.577-47.258v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Arrow_right_ic-01"],"grid":0},"attrs":[],"properties":{"order":479,"id":76,"name":"arrow-right","prevSize":32,"code":59667},"setIdx":0,"setId":1,"iconIdx":77},{"icon":{"paths":["M1022.545 156.242c-7.306-68.806-64.963-121.963-135.065-122.104h-751.010c-71.653 0.138-130.297 55.648-135.429 126.011l-0.026 0.443c-0.25 3.37-1.016 6.594-1.016 10.029v682.716c0 0.016 0 0.035 0 0.054 0 75.373 61.099 136.473 136.47 136.478h750.996c0.002 0 0.003 0 0.005 0 75.403 0 136.529-61.126 136.529-136.529 0-0.002 0-0.003 0-0.005v0-682.716c-0.253-5.328-0.773-10.278-1.555-15.142l0.101 0.763zM102.401 170.671c0.213-3.083 0.818-5.955 1.766-8.664l-0.070 0.23c3.696-14.766 16.789-25.552 32.422-25.683h170.681v170.667h-204.8zM409.6 136.556h204.8v170.667h-204.8zM716.8 136.556h170.667c12.899 0.123 24.059 7.445 29.669 18.134l0.090 0.186c0.478 0.896 1.291 1.562 1.691 2.509l0.192 0.955c1.526 3.643 2.437 7.874 2.491 12.31v136.571h-204.8zM136.471 887.47c-18.818-0.006-34.070-15.262-34.070-34.082 0-0.018 0-0.037 0-0.054v0.003-443.716h204.8v477.849zM409.6 887.47v-477.849h204.8v477.849zM921.599 853.337c0 18.851-15.282 34.133-34.133 34.133v0h-170.667v-477.849h204.8z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Manage calumn_ic-01"],"grid":0},"attrs":[],"properties":{"order":480,"id":77,"name":"manage-column","prevSize":32,"code":59668},"setIdx":0,"setId":1,"iconIdx":78},{"icon":{"paths":["M1017.284 495.792l-152.836-152.836c-4.131-4.049-9.795-6.549-16.043-6.549-12.662 0-22.925 10.263-22.925 22.925 0 6.249 2.5 11.914 6.555 16.049l113.697 113.696h-922.807c-12.662 0-22.925 10.263-22.925 22.925s10.263 22.925 22.925 22.925v0h922.804l-113.7 113.7c-4.118 4.144-6.663 9.854-6.663 16.158 0 12.661 10.263 22.924 22.924 22.924 6.304 0 12.014-2.545 16.158-6.664l152.835-152.835c4.149-4.148 6.716-9.879 6.716-16.21s-2.566-12.062-6.716-16.21v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Long arrow_right_ic-01"],"grid":0},"attrs":[],"properties":{"order":481,"id":78,"name":"long-arrow-right","prevSize":32,"code":59669},"setIdx":0,"setId":1,"iconIdx":79},{"icon":{"paths":["M1001.073 489.076h-922.801l113.699-113.699c4.051-4.131 6.551-9.796 6.551-16.045 0-12.662-10.263-22.925-22.925-22.925-6.249 0-11.913 2.499-16.048 6.552l-152.833 152.831c-4.149 4.148-6.716 9.879-6.716 16.21s2.566 12.062 6.716 16.21l152.837 152.836c4.144 4.118 9.854 6.663 16.158 6.663 12.66 0 22.924-10.263 22.924-22.924 0-6.304-2.545-12.016-6.664-16.159l-113.695-113.698h922.799c12.662 0 22.925-10.263 22.925-22.925s-10.263-22.925-22.925-22.925v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Long arrow_left_ic-01"],"grid":0},"attrs":[],"properties":{"order":482,"id":79,"name":"long-arrow-left","prevSize":32,"code":59670},"setIdx":0,"setId":1,"iconIdx":80},{"icon":{"paths":["M1011.186 485.354l-170.667-136.537c-5.786-4.659-13.224-7.478-21.322-7.478-18.851 0-34.133 15.282-34.133 34.133v0 85.333h-221.867v-221.867h85.333c18.851-0.002 34.131-15.283 34.131-34.133 0-8.099-2.821-15.539-7.533-21.39l0.051 0.066-136.532-170.667c-6.307-7.837-15.898-12.808-26.65-12.808s-20.342 4.973-26.598 12.742l-0.051 0.066-136.537 170.667c-4.661 5.787-7.482 13.227-7.482 21.325 0 18.851 15.282 34.133 34.133 34.133 0 0 0.002 0 0.002 0h85.333v221.867h-221.867v-85.333c0 0 0-0.002 0-0.002 0-18.851-15.282-34.133-34.133-34.133-8.099 0-15.539 2.821-21.39 7.533l0.066-0.051-170.667 136.537c-7.837 6.307-12.808 15.898-12.808 26.65s4.973 20.342 12.742 26.598l0.066 0.051 170.667 136.532c5.787 4.661 13.227 7.482 21.325 7.482 18.851 0 34.133-15.282 34.133-34.131v0-85.333h221.867v221.867h-85.333c-18.851 0-34.133 15.283-34.133 34.133 0 8.098 2.819 15.534 7.53 21.387l-0.051-0.066 136.537 170.667c6.306 7.838 15.898 12.813 26.65 12.813s20.344-4.974 26.598-12.746l0.051-0.066 136.532-170.667c4.662-5.787 7.485-13.227 7.485-21.326 0-18.848-15.28-34.128-34.128-34.128-0.002 0-0.005 0-0.006 0h-85.333v-221.867h221.867v85.333c0 0.002 0 0.003 0 0.006 0 18.848 15.28 34.128 34.128 34.128 8.099 0 15.541-2.821 21.392-7.536l-0.066 0.051 170.667-136.532c7.838-6.306 12.813-15.898 12.813-26.65s-4.974-20.344-12.746-26.598l-0.066-0.051z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Cursor_ic-01"],"grid":0},"attrs":[],"properties":{"order":483,"id":80,"name":"cursor","prevSize":32,"code":59671},"setIdx":0,"setId":1,"iconIdx":81},{"icon":{"paths":["M735.495 341.339v568.886h-455.117v-568.886zM650.16 0.004h-284.445l-56.889 56.889h-162.54c-20.197 0-36.572 16.373-36.572 36.572v0 40.634c0 20.197 16.373 36.572 36.572 36.572v0h723.302c20.197 0 36.572-16.373 36.572-36.572v0-40.634c0-20.197-16.373-36.572-36.572-36.572v0h-162.537zM849.269 264.131c0-20.197-16.373-36.572-36.572-36.572v0h-609.523c-20.197 0-36.572 16.373-36.572 36.572v0 646.092c0.194 62.759 51.017 113.585 113.758 113.781h455.135c62.757-0.201 113.577-51.022 113.774-113.761v-0.020z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Delete_ic-01"],"grid":0},"attrs":[],"properties":{"order":484,"id":81,"name":"delete","prevSize":32,"code":59672},"setIdx":0,"setId":1,"iconIdx":82},{"icon":{"paths":["M849.592 642.213c-6.268 12.82-19.214 21.493-34.185 21.495h-94.816v303.407c0 31.419-25.47 56.889-56.889 56.889s-56.889-25.47-56.889-56.889v0-303.407h-94.814c-0.002 0-0.004 0-0.007 0-20.942 0-37.92-16.978-37.92-37.92 0-8.999 3.134-17.268 8.373-23.769l-0.057 0.073 151.703-189.63c7.006-8.709 17.664-14.236 29.611-14.236s22.604 5.527 29.554 14.162l0.057 0.073 151.703 189.63c5.18 6.43 8.315 14.697 8.315 23.696 0 5.972-1.38 11.621-3.84 16.647l0.1-0.224zM330.681 611.546c7.008 8.709 17.666 14.236 29.612 14.236s22.606-5.527 29.556-14.164l0.057-0.073 151.703-189.63c5.18-6.43 8.316-14.697 8.316-23.696 0-20.942-16.978-37.92-37.92-37.92-0.002 0-0.005 0-0.007 0h-94.814v-303.407c0-31.419-25.47-56.889-56.889-56.889s-56.889 25.47-56.889 56.889v0 303.407h-94.814c-20.946 0-37.925 16.981-37.925 37.925 0 8.997 3.132 17.26 8.366 23.764l-0.057-0.073 151.703 189.63z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Sort_inside_ic-01"],"grid":0},"attrs":[],"properties":{"order":485,"id":82,"name":"sort-inside","prevSize":32,"code":59673},"setIdx":0,"setId":1,"iconIdx":83},{"icon":{"paths":["M857.826 812.298l-157.537 196.923c-7.276 9.044-18.343 14.784-30.749 14.784s-23.474-5.74-30.69-14.706l-0.059-0.076-157.537-196.923c-5.38-6.678-8.636-15.262-8.636-24.607 0-21.748 17.631-39.378 39.378-39.378 0.002 0 0.006 0 0.007 0h98.461v-315.077c0-32.627 26.45-59.077 59.077-59.077s59.077 26.45 59.077 59.077v0 315.077h98.461c0.002 0 0.004 0 0.007 0 21.748 0 39.378 17.631 39.378 39.378 0 9.345-3.255 17.932-8.695 24.683l0.059-0.076zM542.749 211.707l-157.537-196.923c-7.278-9.042-18.345-14.778-30.751-14.778s-23.474 5.738-30.692 14.703l-0.059 0.076-157.537 196.923c-5.378 6.678-8.633 15.262-8.633 24.605 0 21.751 17.633 39.384 39.384 39.384 0 0 0.002 0 0.002 0h98.461v315.077c0 32.627 26.45 59.077 59.077 59.077s59.077-26.45 59.077-59.077v0-315.077h98.461c21.751-0.002 39.382-17.634 39.382-39.384 0-9.345-3.255-17.93-8.692-24.681l0.059 0.076z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Sort_outside_ic-01"],"grid":0},"attrs":[],"properties":{"order":486,"id":83,"name":"sort-outside","prevSize":32,"code":59674},"setIdx":0,"setId":1,"iconIdx":84},{"icon":{"paths":["M1024.001 929.189c0 31.419-25.47 56.889-56.889 56.889h-872.296c-52.364 0-94.815-42.451-94.815-94.815v0-796.445c0.094-31.348 25.528-56.722 56.889-56.722s56.795 25.376 56.889 56.714v777.491h853.334c31.419 0 56.889 25.47 56.889 56.889v0zM922.973 116.468c-8.363-7.55-19.498-12.17-31.713-12.17-13.967 0-26.524 6.040-35.199 15.65l-0.037 0.042c-154.983 171.483-360.922 294.267-593.848 344.488l-7.357 1.329c-21.106 5.096-36.539 23.819-36.539 46.146 0 26.184 21.225 47.409 47.409 47.409 3.705 0 7.314-0.426 10.775-1.23l-0.321 0.063c259.922-56.184 482.643-189.188 649.414-373.723l0.939-1.054c7.55-8.363 12.17-19.5 12.17-31.713 0-13.968-6.041-26.524-15.652-35.2l-0.042-0.037zM834.371 417.188v379.26c0 10.473 8.49 18.966 18.966 18.966v0h75.849c10.473 0 18.966-8.49 18.966-18.966v0-379.26c-0.002-10.473-8.492-18.962-18.966-18.962h-75.853c-10.472 0.002-18.961 8.49-18.962 18.962v0zM625.777 493.039v303.407c0 10.473 8.49 18.966 18.966 18.966v0h75.849c10.473-0.002 18.962-8.492 18.962-18.966v-303.407c0-10.473-8.489-18.964-18.962-18.966h-75.853c-10.473 0.002-18.962 8.492-18.962 18.966v0zM417.185 606.818v189.63c0 10.473 8.489 18.964 18.962 18.966h75.853c10.473 0 18.966-8.49 18.966-18.966v0-189.63c0-10.473-8.49-18.966-18.966-18.966h-75.853c-10.473 0.002-18.962 8.492-18.962 18.966v0zM208.593 682.669v113.777c0 10.473 8.489 18.964 18.962 18.966h75.853c10.473-0.002 18.962-8.492 18.962-18.966v0-113.777c0-10.473-8.489-18.964-18.962-18.966h-75.853c-10.473 0.002-18.962 8.492-18.962 18.966v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Metrics_ic-01"],"grid":0},"attrs":[],"properties":{"order":487,"id":84,"name":"metrics","prevSize":32,"code":59676},"setIdx":0,"setId":1,"iconIdx":85},{"icon":{"paths":["M979.838 563.781l-168.62-202.346 168.62-202.342c8.686-10.366 13.961-23.845 13.961-38.557 0-33.26-26.962-60.222-60.222-60.222 0 0-0.002 0-0.002 0h-662.474c0-0.052 0-0.113 0-0.173 0-33.261-26.964-60.226-60.226-60.226s-60.226 26.964-60.226 60.226c0 0.061 0 0.121 0 0.183v-0.010 843.151h-60.226c-33.187 0.098-60.051 27.024-60.051 60.226s26.864 60.126 60.043 60.226h240.91c33.187-0.098 60.051-27.024 60.051-60.226s-26.864-60.126-60.043-60.226h-60.235v-240.9h662.474c33.261 0 60.224-26.964 60.224-60.226 0-14.712-5.275-28.192-14.037-38.651l0.076 0.095zM686.56 322.881c-8.686 10.364-13.961 23.845-13.961 38.557s5.275 28.191 14.037 38.65l-0.076-0.095 118.433 142.12h-533.894v-361.348h533.894l-118.433 142.118z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Tags_ic-01"],"grid":0},"attrs":[],"properties":{"order":488,"id":85,"name":"tags","prevSize":32,"code":59677},"setIdx":0,"setId":1,"iconIdx":86},{"icon":{"paths":["M662.517 1012.462c9.822 7.212 22.15 11.541 35.491 11.541 33.325 0 60.341-27.014 60.341-60.34v0-622.136c0-77.761-63.037-140.798-140.798-140.798v0h-391.123c-77.761 0-140.798 63.037-140.798 140.798v0 622.136c0 0.002 0 0.002 0 0.003 0 33.324 27.014 60.338 60.338 60.338 13.341 0 25.67-4.33 35.66-11.66l-0.168 0.118 240.526-174.927 240.528 174.927zM386.497 714.124l-180.183 131.042v-503.636c0-11.108 9.005-20.114 20.114-20.114h391.123c11.108 0 20.114 9.005 20.114 20.114v0 503.638l-180.186-131.045c-9.82-7.214-22.15-11.544-35.491-11.544s-25.67 4.33-35.66 11.662l0.168-0.118zM933.991 140.801v622.133c0 33.325-27.016 60.341-60.341 60.341s-60.341-27.016-60.341-60.341v0-622.133c0-11.108-9.005-20.114-20.114-20.114v0h-471.578c-33.325 0-60.341-27.016-60.341-60.341s27.016-60.341 60.341-60.341v0h471.58c77.761 0 140.796 63.037 140.796 140.798v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Bookmarks_ic-01"],"grid":0},"attrs":[],"properties":{"order":489,"id":86,"name":"bookmarks","prevSize":32,"code":59678},"setIdx":0,"setId":1,"iconIdx":87},{"icon":{"paths":["M94.867 37.993c-52.359 0-94.805 42.445-94.807 94.803v0 758.577c0 52.36 42.446 94.807 94.807 94.807v0h834.387c52.36 0 94.807-42.446 94.807-94.807v0-758.577c-0.002-52.359-42.446-94.803-94.807-94.803h-834.387zM393.901 594.272v-164.353h516.394v164.353zM113.828 594.272v-164.353h166.305v164.353zM280.133 708.056v164.357h-166.307v-164.357zM393.898 872.414v-164.357h516.395v164.357zM280.136 316.133h-166.307v-164.375h166.305zM393.901 316.133v-164.375h516.394v164.375z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Runs_ic-01"],"grid":0},"attrs":[],"properties":{"order":551,"id":87,"name":"runs","prevSize":32,"code":59679},"setIdx":0,"setId":1,"iconIdx":88},{"icon":{"paths":["M476.372 172.972c10.476-10.324 16.969-24.668 16.969-40.53 0-31.419-25.47-56.889-56.889-56.889-15.86 0-30.204 6.491-40.521 16.958l-0.007 0.007zM56.889 512.005l-40.226-40.224c-10.295 10.293-16.663 24.516-16.663 40.224s6.368 29.931 16.663 40.224v0zM395.924 931.488c10.251 10.041 24.299 16.236 39.796 16.236 31.419 0 56.889-25.47 56.889-56.889 0-15.497-6.196-29.545-16.245-39.806l0.009 0.009zM967.111 568.894c31.419 0 56.889-25.47 56.889-56.889s-25.47-56.889-56.889-56.889v0zM395.924 92.519l-379.259 379.259 80.453 80.448 379.259-379.259zM16.665 552.229l379.259 379.259 80.448-80.448-379.259-379.259zM56.889 568.894h910.222v-113.778h-910.222z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_left_ic"],"grid":0},"attrs":[],"properties":{"order":546,"id":88,"name":"back-left","prevSize":32,"code":59680},"setIdx":0,"setId":1,"iconIdx":89},{"icon":{"paths":["M931.483 547.63c-10.293-10.293-24.514-16.66-40.222-16.66s-29.929 6.366-40.222 16.66l-282.149 282.149v-772.888c0-31.419-25.47-56.889-56.889-56.889s-56.889 25.47-56.889 56.889v0 772.888l-282.145-282.149c-10.324-10.476-24.669-16.969-40.53-16.969-31.419 0-56.889 25.47-56.889 56.889 0 15.86 6.491 30.205 16.958 40.521l379.273 379.268c10.293 10.295 24.514 16.663 40.222 16.663s29.929-6.368 40.222-16.663l379.261-379.261c10.295-10.293 16.663-24.516 16.663-40.224s-6.368-29.931-16.663-40.224v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_down_ic"],"grid":0},"attrs":[],"properties":{"order":589,"id":89,"name":"back-down","prevSize":32,"code":59681},"setIdx":0,"setId":1,"iconIdx":90},{"icon":{"paths":["M931.481 395.925l-379.259-379.259c-10.293-10.295-24.514-16.663-40.222-16.663s-29.929 6.368-40.222 16.663l-379.264 379.259c-10.114 10.263-16.359 24.363-16.359 39.92 0 31.419 25.47 56.889 56.889 56.889 15.559 0 29.659-6.247 39.931-16.368l282.137-282.135v772.883c0 31.419 25.47 56.889 56.889 56.889s56.889-25.47 56.889-56.889v0-772.883l282.147 282.142c10.281 10.217 24.45 16.533 40.094 16.533 31.417 0 56.884-25.468 56.884-56.884 0-15.646-6.316-29.815-16.539-40.1l0.004 0.004z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_up_ic"],"grid":0},"attrs":[],"properties":{"order":588,"id":90,"name":"back-up","prevSize":32,"code":59682},"setIdx":0,"setId":1,"iconIdx":91},{"icon":{"paths":["M1007.336 471.778l-379.261-379.261c-10.252-10.050-24.308-16.253-39.812-16.253-31.419 0-56.889 25.47-56.889 56.889 0 15.506 6.204 29.565 16.265 39.826l282.14 282.135h-772.893c-31.419 0-56.889 25.47-56.889 56.889s25.47 56.889 56.889 56.889v0h772.888l-282.144 282.145c-10.219 10.281-16.535 24.452-16.535 40.096 0 31.417 25.469 56.884 56.884 56.884 15.645 0 29.813-6.315 40.098-16.535l379.257-379.257c10.295-10.293 16.663-24.516 16.663-40.224s-6.368-29.931-16.663-40.224v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_right_ic"],"grid":0},"attrs":[],"properties":{"order":587,"id":91,"name":"back-right","prevSize":32,"code":59683},"setIdx":0,"setId":1,"iconIdx":92},{"icon":{"paths":["M947.231-0.15h-725.372c-42.491 0-76.938 34.447-76.938 76.938s34.447 76.938 76.938 76.938v0h539.624l-739.108 739.117c-13.721 13.89-22.199 32.987-22.199 54.066 0 42.491 34.447 76.938 76.938 76.938 21.079 0 40.178-8.478 54.075-22.209l739.11-739.101v539.629c0 42.491 34.447 76.938 76.938 76.938s76.938-34.447 76.938-76.938v0-725.372c0-0.002 0-0.005 0-0.010 0-42.491-34.447-76.938-76.938-76.938-0.002 0-0.007 0-0.010 0v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_up_right_ic"],"grid":0},"attrs":[],"properties":{"order":586,"id":92,"name":"back-up-right","prevSize":32,"code":59684},"setIdx":0,"setId":1,"iconIdx":93},{"icon":{"paths":["M1001.636 892.824l-739.121-739.121h539.634c42.492 0 76.938-34.447 76.938-76.938s-34.447-76.938-76.938-76.938v0h-725.376c-42.492 0-76.938 34.447-76.938 76.938v0 725.388c0 42.492 34.447 76.938 76.938 76.938s76.938-34.447 76.938-76.938v0-539.642l739.112 739.112c13.89 13.726 32.99 22.204 54.071 22.204 42.492 0 76.938-34.447 76.938-76.938 0-21.076-8.475-40.174-22.204-54.071l0.007 0.007z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_up_left_ic"],"grid":0},"attrs":[],"properties":{"order":585,"id":93,"name":"back-up-left","prevSize":32,"code":59685},"setIdx":0,"setId":1,"iconIdx":94},{"icon":{"paths":["M1001.469 22.525c-13.921-13.917-33.15-22.524-54.389-22.524s-40.469 8.607-54.389 22.524l-738.864 738.877v-539.46c0-42.478-34.435-76.913-76.913-76.913s-76.913 34.435-76.913 76.913v0 725.146c0 42.478 34.435 76.913 76.913 76.913v0h725.145c42.478 0 76.913-34.435 76.913-76.913s-34.435-76.913-76.913-76.913v0h-539.466l738.877-738.877c13.919-13.919 22.528-33.147 22.528-54.387s-8.609-40.468-22.528-54.387v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_down_left"],"grid":0},"attrs":[],"properties":{"order":584,"id":94,"name":"back-down-left","prevSize":32,"code":59686},"setIdx":0,"setId":1,"iconIdx":95},{"icon":{"paths":["M946.947 145.169c-42.464 0-76.888 34.424-76.888 76.888v0 539.29l-738.634-738.634c-13.946-14.114-33.302-22.855-54.701-22.855-42.464 0-76.888 34.424-76.888 76.888 0 21.399 8.741 40.755 22.85 54.696l738.651 738.641h-539.29c-42.464 0-76.888 34.424-76.888 76.888s34.424 76.888 76.888 76.888h724.902c42.464 0 76.888-34.424 76.888-76.888v0-724.912c0-42.464-34.424-76.888-76.888-76.888v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Back_down_right"],"grid":0},"attrs":[],"properties":{"order":583,"id":95,"name":"back-down-right","prevSize":32,"code":59687},"setIdx":0,"setId":1,"iconIdx":96},{"icon":{"paths":["M118.154 393.852v0c65.254 0 118.154 52.9 118.154 118.154v0 0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0zM512 393.852v0c65.254 0 118.154 52.9 118.154 118.154v0 0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0zM905.846 393.852v0c65.254 0 118.154 52.9 118.154 118.154v0 0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["More_horizontal_ic"],"grid":0},"attrs":[],"properties":{"order":582,"id":96,"name":"more-horizontal","prevSize":32,"code":59688},"setIdx":0,"setId":1,"iconIdx":97},{"icon":{"paths":["M630.154 118.158v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM630.154 512.006v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM630.154 905.851v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["More_vertical_ic"],"grid":0},"attrs":[],"properties":{"order":581,"id":97,"name":"more-vertical","prevSize":32,"code":59689},"setIdx":0,"setId":1,"iconIdx":98},{"icon":{"paths":["M807.384 118.158v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM807.384 512.006v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM807.384 905.851v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM452.923 118.158v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM452.923 512.006v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0zM452.923 905.851v0c0 65.254-52.9 118.154-118.154 118.154v0 0c-65.254 0-118.154-52.9-118.154-118.154v0 0c0-65.254 52.9-118.154 118.154-118.154v0 0c65.254 0 118.154 52.9 118.154 118.154v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Drag_ic-01"],"grid":0},"attrs":[],"properties":{"order":580,"id":98,"name":"drag","prevSize":32,"code":59690},"setIdx":0,"setId":1,"iconIdx":99},{"icon":{"paths":["M939.133 152.637c15.441-16.184 24.944-38.152 24.944-62.339 0-49.911-40.459-90.37-90.37-90.37-25.723 0-48.934 10.748-65.392 27.994l-0.034 0.037-401.759 421.629c-15.444 16.181-24.95 38.152-24.95 62.342s9.505 46.158 24.984 62.376l-0.034-0.034 401.759 421.626c16.492 17.285 39.702 28.031 65.426 28.031 49.908 0 90.367-40.459 90.367-90.367 0-24.184-9.503-46.152-24.975-62.37l0.034 0.037-342.369-359.298zM240.9 90.295c0-49.908-40.459-90.367-90.367-90.367s-90.367 40.459-90.367 90.367v0 843.255c0 49.908 40.459 90.367 90.367 90.367s90.367-40.459 90.367-90.367v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Move to_left_ic"],"grid":0},"attrs":[],"properties":{"order":579,"id":99,"name":"move-to-left","prevSize":32,"code":59691},"setIdx":0,"setId":1,"iconIdx":100},{"icon":{"paths":["M85.108 871.196c-15.444 16.184-24.947 38.154-24.947 62.344 0 49.911 40.462 90.372 90.372 90.372 25.723 0 48.933-10.745 65.392-27.994l0.034-0.037 401.761-421.625c15.444-16.181 24.95-38.152 24.95-62.342s-9.505-46.158-24.984-62.376l0.034 0.034-401.761-421.631c-16.492-17.283-39.702-28.031-65.425-28.031-49.911 0-90.369 40.459-90.369 90.369 0 24.187 9.503 46.155 24.978 62.376l-0.034-0.037 342.365 359.289zM783.34 933.537c0 49.908 40.459 90.367 90.367 90.367s90.367-40.459 90.367-90.367v0-843.247c0-49.908-40.459-90.367-90.367-90.367s-90.367 40.459-90.367 90.367v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Move to_right_ic"],"grid":0},"attrs":[],"properties":{"order":578,"id":100,"name":"move-to-right","prevSize":32,"code":59692},"setIdx":0,"setId":1,"iconIdx":101},{"icon":{"paths":["M512.189 124.86l-0.189 0.012v-100.698c0-0.002 0-0.003 0-0.005 0-10.7-8.675-19.375-19.375-19.375-4.3 0-8.274 1.402-11.487 3.772l0.053-0.038-220.853 161.427c-4.838 3.565-7.941 9.241-7.941 15.641s3.103 12.076 7.888 15.603l0.053 0.038 220.856 161.427c3.161 2.331 7.132 3.731 11.431 3.731 10.7 0 19.375-8.675 19.375-19.375 0 0 0-0.002 0-0.002v0-97.194h0.189c178.487 2.986 322.031 148.379 322.031 327.297 0 180.785-146.555 327.34-327.34 327.34-162.339 0-297.078-118.175-322.882-273.194l-0.262-1.91c-5.034-29.754-30.614-52.132-61.42-52.132-34.378 0-62.247 27.87-62.247 62.247 0 3.058 0.221 6.064 0.646 9.003l-0.039-0.335c35.648 217.067 221.879 380.655 446.318 380.655 249.623 0 451.982-202.359 451.982-451.982 0-247.796-199.409-449.019-446.511-451.951l-0.277-0.003z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["reset_ic-01"],"grid":0},"attrs":[],"properties":{"order":577,"id":101,"name":"reset","prevSize":32,"code":59693},"setIdx":0,"setId":1,"iconIdx":102},{"icon":{"paths":["M73.147 146.287c-40.395 0-73.143 32.748-73.143 73.143s32.748 73.143 73.143 73.143h877.713c40.395 0 73.143-32.748 73.143-73.143s-32.748-73.143-73.143-73.143v0zM73.147 438.862c-40.395 0-73.142 32.746-73.142 73.142s32.746 73.142 73.142 73.142h292.57c40.395 0 73.142-32.746 73.142-73.142s-32.746-73.142-73.142-73.142v0zM0.003 804.572c0.002-40.394 32.748-73.14 73.143-73.14s73.143 32.746 73.143 73.143c0 40.395-32.746 73.142-73.142 73.143v0c-40.395 0-73.143-32.748-73.143-73.145 0 0 0-0.002 0-0.002v0zM292.575 731.43c0 0-0.002 0-0.002 0-40.395 0-73.143 32.748-73.143 73.143s32.748 73.143 73.143 73.143c40.395 0 73.143-32.748 73.143-73.143 0 0 0-0.002 0-0.002v0c-0.003-40.394-32.748-73.138-73.142-73.142v0zM438.858 804.572c0.002-40.395 32.748-73.142 73.143-73.142s73.143 32.748 73.143 73.143c0 40.395-32.746 73.142-73.142 73.143v0c-40.397 0-73.145-32.748-73.145-73.145v0zM731.432 731.43c0 0-0.002 0-0.002 0-40.395 0-73.143 32.748-73.143 73.143s32.748 73.143 73.143 73.143c40.395 0 73.143-32.748 73.143-73.143 0 0 0-0.002 0-0.002v0c-0.003-40.394-32.748-73.138-73.142-73.142v0zM877.715 804.572c0.002-40.395 32.748-73.142 73.143-73.142s73.143 32.748 73.143 73.143c0 40.395-32.746 73.142-73.142 73.143v0c-40.397 0-73.145-32.748-73.145-73.145v0zM658.287 438.862c-40.395 0-73.142 32.746-73.142 73.142s32.746 73.142 73.142 73.142h292.573c40.395 0 73.142-32.746 73.142-73.142s-32.746-73.142-73.142-73.142v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Line style_ic-01"],"grid":0},"attrs":[],"properties":{"order":490,"id":102,"name":"line-style","prevSize":32,"code":59694},"setIdx":0,"setId":1,"iconIdx":103},{"icon":{"paths":["M82.996 931.784v0c0 5.094 4.128 9.221 9.221 9.221h288.18c5.092-0.002 9.22-4.13 9.221-9.221v-209.412c0-5.094-4.128-9.221-9.221-9.221h-288.18c-5.094 0-9.221 4.128-9.221 9.221v209.412zM92.218 1024.003c-50.93-0.002-92.215-41.287-92.217-92.217v0-209.412c0-50.93 41.287-92.217 92.217-92.217 0 0 0.002 0 0.002 0h288.18c50.93 0 92.217 41.287 92.217 92.217v0 209.412c-0.002 50.93-41.287 92.215-92.217 92.217v0zM634.377 301.632v0c0 5.094 4.128 9.221 9.221 9.221h288.18c5.092-0.002 9.22-4.13 9.221-9.221v-209.412c-0.002-5.092-4.13-9.22-9.221-9.221h-288.18c-5.094 0-9.221 4.128-9.221 9.221v209.412zM643.599 393.849c-50.93 0-92.217-41.287-92.217-92.217v0-209.412c0-50.93 41.287-92.217 92.217-92.217v0h288.18c50.93 0 92.217 41.287 92.217 92.217v0 209.412c0 50.93-41.287 92.217-92.217 92.217v0zM380.397 82.998v0c5.092 0.002 9.22 4.13 9.221 9.221v366.951c-0.002 5.092-4.13 9.22-9.221 9.221h-288.18c-5.094 0-9.221-4.128-9.221-9.221v-366.951c0-5.094 4.128-9.221 9.221-9.221h288.18zM92.218 0.003c-50.93 0.002-92.215 41.287-92.217 92.217v0 366.951c0.002 50.93 41.289 92.217 92.219 92.217h288.18c50.93-0.002 92.215-41.287 92.217-92.217v0-366.951c-0.002-50.93-41.287-92.215-92.217-92.217v0zM643.599 555.612v0c-5.094 0-9.221 4.128-9.221 9.221v366.951c0 5.094 4.128 9.221 9.221 9.221h288.18c5.092-0.002 9.22-4.13 9.221-9.221v-366.951c-0.002-5.092-4.13-9.22-9.221-9.221h-288.18zM551.382 564.835c0-50.93 41.287-92.217 92.217-92.217v0h288.18c50.93 0 92.217 41.287 92.217 92.217v0 366.951c0 50.93-41.287 92.217-92.217 92.217v0h-288.18c-50.93 0-92.217-41.287-92.217-92.217v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Chart group_ic-01"],"grid":0},"attrs":[],"properties":{"order":491,"id":103,"name":"chart-group","prevSize":32,"code":59695},"setIdx":0,"setId":1,"iconIdx":104},{"icon":{"paths":["M777.34 289.772c-47.589 1.432-85.619 40.353-85.619 88.155 0 48.707 39.485 88.192 88.192 88.192s88.192-39.485 88.192-88.192c0 0 0-0.002 0-0.002v0c-0.804-48.86-40.602-88.16-89.577-88.16-0.418 0-0.835 0.003-1.251 0.008h0.062zM562.522 146.689c-47.589 1.432-85.619 40.353-85.619 88.155 0 48.707 39.485 88.192 88.192 88.192s88.192-39.485 88.192-88.192c0 0 0-0.002 0-0.002v0c-0.803-48.861-40.6-88.162-89.577-88.162-0.418 0-0.835 0.003-1.251 0.008h0.064zM324.643 390.208c47.589-1.432 85.619-40.353 85.619-88.155 0-48.707-39.485-88.192-88.192-88.192s-88.192 39.483-88.192 88.19v0c0.804 48.861 40.603 88.163 89.581 88.163 0.416 0 0.833-0.003 1.248-0.008h-0.064zM333.299 525.719c0.025-0.791 0.039-1.721 0.039-2.653 0-50.151-40.655-90.806-90.806-90.806s-90.806 40.655-90.806 90.806c0 50.151 40.654 90.805 90.805 90.806v0c0.353 0.005 0.769 0.008 1.185 0.008 48.979 0 88.778-39.3 89.582-88.086l0.002-0.076zM985.15 259.262c-46.611-78.295-110.622-141.736-186.981-186.339l-2.475-1.335c-76.957-44.999-169.437-71.568-268.125-71.568-0.247 0-0.494 0-0.741 0h0.039c-0.781-0.003-1.703-0.007-2.626-0.007-143.822 0-274.296 57.153-369.949 149.988l0.133-0.128c-95.233 91.485-154.399 219.899-154.399 362.131s59.166 270.646 154.231 361.971l0.168 0.161c95.543 92.707 226.038 149.86 369.882 149.86 0.9 0 1.8-0.002 2.7-0.007h-0.138c18.061 0 36.164-0.9 53.815-2.621 46.26-3.877 85.603-30.288 107.359-68.099l0.351-0.663c11.465-18.932 18.251-41.811 18.251-66.271 0-21.673-5.326-42.101-14.74-60.048l0.339 0.71c-25.269-50.907-28.053-94.524-7.618-119.629 15.881-15.996 37.883-25.896 62.195-25.896 0.509 0 1.018 0.005 1.525 0.013l-0.077-0.002c102.733-3.969 191.177-61.522 238.554-145.355l0.742-1.426c22.922-38.904 36.461-85.71 36.461-135.678 0-51.637-14.459-99.896-39.551-140.951l0.675 1.187zM618.973 861.89c3.845 7.059 6.107 15.462 6.107 24.391 0 10.056-2.868 19.444-7.83 27.388l0.128-0.218c-9.103 16.096-25.545 27.12-44.66 28.534l-0.185 0.012c-15.112 1.516-30.512 2.253-45.664 2.253-1.771 0.025-3.862 0.040-5.956 0.040-240.181 0-435.361-192.678-439.4-431.897l-0.005-0.379c4.027-239.605 199.207-432.297 439.395-432.297 2.097 0 4.193 0.015 6.283 0.044l-0.316-0.003c0.532-0.002 1.162-0.003 1.79-0.003 163.161 0 306.002 86.991 384.676 217.122l1.127 2.010c17.717 28.498 28.22 63.084 28.22 100.122 0 35.863-9.846 69.428-26.986 98.136l0.485-0.877c-34.307 61.717-98.24 103.309-172.074 105.553l-0.306 0.007c-48.885 0.099-92.727 21.606-122.665 55.64l-0.158 0.183c-40.874 50.127-41.609 124.582-2.007 204.239z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Coloring_ic-01"],"grid":0},"attrs":[],"properties":{"order":550,"id":104,"name":"coloring","prevSize":32,"code":59696},"setIdx":0,"setId":1,"iconIdx":105},{"icon":{"paths":["M438.868 768.079v0c0 0-0.001 0-0.001 0-181.817 0-329.209-147.393-329.209-329.209 0 0 0-0.001 0-0.001v0c0-181.818 147.393-329.211 329.211-329.211s329.211 147.393 329.211 329.211c0 181.818-147.393 329.211-329.211 329.211 0 0 0 0 0 0zM785.63 708.031c57.475-73.496 92.163-167.232 92.163-269.070 0-242.373-196.481-438.854-438.854-438.854s-438.854 196.481-438.854 438.854c0 242.373 196.481 438.854 438.854 438.854 101.852 0 195.598-34.697 270.068-92.915l-0.967 0.728 222.372 222.381c9.929 9.929 23.648 16.072 38.801 16.072 30.305 0 54.873-24.568 54.873-54.873 0-15.153-6.141-28.87-16.072-38.801v0zM438.868 237.684v0c-30.301 0.001-54.864 24.566-54.866 54.868v91.453h-91.461c-30.213 0.105-54.675 24.63-54.675 54.868s24.46 54.764 54.685 54.868h91.45v91.455c0.105 30.213 24.63 54.675 54.868 54.675s54.764-24.46 54.868-54.685v-91.447h91.455c30.213-0.105 54.675-24.63 54.675-54.868s-24.46-54.764-54.685-54.868h-91.447v-91.45c0-30.302-24.566-54.868-54.868-54.868z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Zoom_ic-1-01"],"grid":0},"attrs":[],"properties":{"order":547,"id":105,"name":"zoom-in","prevSize":32,"code":59697},"setIdx":0,"setId":1,"iconIdx":106},{"icon":{"paths":["M859.341 404.814c-9.37 9.372-22.317 15.169-36.616 15.169s-27.247-5.797-36.616-15.169l-101.482-101.478-101.482 101.478c-9.371 9.371-22.318 15.168-36.618 15.168-28.601 0-51.787-23.186-51.787-51.787 0-14.301 5.797-27.247 15.168-36.619l101.478-101.478-101.478-101.482c-9.433-9.382-15.271-22.37-15.271-36.723 0-28.601 23.186-51.787 51.787-51.787 14.351 0 27.339 5.837 36.719 15.267l101.486 101.486 101.482-101.482c9.371-9.37 22.317-15.165 36.616-15.165 28.601 0 51.786 23.186 51.786 51.786 0 14.301-5.797 27.248-15.169 36.62l-101.478 101.482 101.478 101.478c9.372 9.371 15.169 22.318 15.169 36.618s-5.797 27.248-15.171 36.619v0zM97.684 788.377c-53.946 0.016-97.671 43.752-97.671 97.699 0 53.958 43.742 97.699 97.699 97.699s97.699-43.742 97.699-97.699v0c-0.071-53.938-43.785-97.644-97.721-97.699h-0.005zM304.841 512.157c-53.96 0.008-97.701 43.753-97.701 97.714 0 53.967 43.748 97.714 97.714 97.714 53.961 0 97.706-43.741 97.714-97.699v0c-0.058-53.949-43.777-97.668-97.721-97.727h-0.005zM512 788.377c-53.958 0-97.699 43.742-97.699 97.699s43.742 97.699 97.699 97.699c53.958 0 97.699-43.742 97.699-97.699v0c-0.074-53.928-43.772-97.625-97.693-97.699h-0.007zM926.313 512.157c-0.004 0-0.009 0-0.015 0-53.967 0-97.714 43.748-97.714 97.714s43.748 97.714 97.714 97.714c53.961 0 97.706-43.741 97.714-97.699v-0.001c-0.066-53.937-43.765-97.647-97.693-97.727h-0.008z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Ignore outlines_ic-01"],"grid":0},"attrs":[],"properties":{"order":492,"id":106,"name":"ignore-outliers","prevSize":32,"code":59698},"setIdx":0,"setId":1,"iconIdx":107},{"icon":{"paths":["M881.535 247.71c8.584-10.572 13.782-24.196 13.782-39.032 0-34.331-27.83-62.162-62.162-62.162-19.343 0-36.621 8.834-48.022 22.688l-0.086 0.107c-88.289 120.153-203.262 215.666-336.531 278.884l-5.374 2.294c-98.4 37.148-212.149 58.654-330.921 58.654-17.585 0-35.059-0.472-52.412-1.402l2.421 0.103c-34.33 0-62.161 27.83-62.161 62.161s27.83 62.161 62.161 62.161v0c15.156 0.758 32.91 1.191 50.765 1.191 135.739 0 265.644-24.976 385.37-70.584l-7.433 2.487c158.193-73.673 289.527-181.594 388.694-314.867l1.909-2.683zM1015.582 322.306c5.281-6.295 8.488-14.485 8.488-23.423 0-20.193-16.37-36.563-36.563-36.563-11.255 0-21.321 5.085-28.028 13.082l-0.047 0.056-327.206 392.226-101.576-65.802c-5.611-3.683-12.489-5.875-19.878-5.875-9.764 0-18.636 3.827-25.193 10.065l0.016-0.015-155.357 147.518-112.309-68.765c-5.436-3.38-12.032-5.383-19.095-5.383-10.117 0-19.275 4.109-25.893 10.751l-124.738 125.134c-6.522 6.601-10.55 15.677-10.55 25.695 0 20.194 16.371 36.565 36.565 36.565 10.058 0 19.168-4.061 25.778-10.633l-0.001 0.001 104.363-104.693 111.621 68.347c5.436 3.38 12.032 5.382 19.095 5.382 9.764 0 18.634-3.827 25.193-10.062l-0.016 0.015 154.816-147.014 104.597 67.762c5.612 3.684 12.491 5.878 19.883 5.878 11.255 0 21.323-5.085 28.030-13.082l0.047-0.056z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Smoothing_ic-01"],"grid":0},"attrs":[],"properties":{"order":493,"id":107,"name":"smoothing","prevSize":32,"code":59699},"setIdx":0,"setId":1,"iconIdx":108},{"icon":{"paths":["M106.038 194.289c0-48.737 39.51-88.247 88.247-88.247 0 0 0 0 0 0h121.12c0.054 0 0.116 0 0.178 0 29.242 0 52.948-23.706 52.948-52.948s-23.706-52.948-52.948-52.948c-0.062 0-0.126 0-0.188 0h-121.11c-107.223 0-194.144 86.921-194.144 194.144v0 121.121c0.102 29.166 23.768 52.77 52.948 52.77s52.847-23.605 52.948-52.76v-0.010zM708.879 0.146c-29.166 0.102-52.77 23.768-52.77 52.948s23.605 52.847 52.76 52.948h121.127c0 0 0.001 0 0.003 0 48.737 0 88.246 39.509 88.246 88.246 0 0 0 0.001 0 0.001v0 121.121c0.102 29.166 23.768 52.77 52.948 52.77s52.847-23.605 52.948-52.76v-121.131c0 0 0 0 0 0 0-107.223-86.921-194.144-194.144-194.144 0 0-0.001 0-0.001 0v0zM106.038 708.883c0-0.054 0-0.116 0-0.178 0-29.242-23.706-52.948-52.948-52.948s-52.948 23.706-52.948 52.948c0 0.062 0 0.126 0 0.188v-0.010 121.117c0 0 0 0 0 0 0 107.223 86.921 194.144 194.144 194.144 0 0 0 0 0.001 0h121.12c29.242 0 52.948-23.706 52.948-52.948s-23.706-52.948-52.948-52.948h-121.12c0 0-0.001 0-0.003 0-48.737 0-88.246-39.509-88.246-88.246 0 0 0-0.001 0-0.001v0zM1024.141 708.883c0-0.054 0-0.116 0-0.178 0-29.242-23.706-52.948-52.948-52.948s-52.948 23.706-52.948 52.948c0 0.062 0 0.126 0 0.188v-0.010 121.117c0 0.001 0 0.003 0 0.004 0 48.736-39.507 88.243-88.243 88.243-0.001 0-0.003 0-0.006 0h-121.117c-29.242 0-52.948 23.706-52.948 52.948s23.706 52.948 52.948 52.948h121.117c0 0 0.001 0 0.001 0 107.223 0 194.142-86.921 194.142-194.142 0-0.001 0-0.001 0-0.003v0zM799.888 369.206c7.547-9.085 12.128-20.868 12.128-33.721 0-29.242-23.706-52.948-52.948-52.948-16.39 0-31.038 7.446-40.751 19.139l-0.071 0.088-186.477 225.734-76.485-76.494c-9.582-9.58-22.818-15.506-37.438-15.506-17.090 0-32.289 8.096-41.97 20.663l-0.092 0.124-152.959 200.024c-6.841 8.832-10.966 20.066-10.966 32.264 0 29.243 23.706 52.95 52.95 52.95 17.133 0 32.366-8.137 42.043-20.759l0.093-0.126 116.228-151.99 74.895 74.903c9.583 9.58 22.819 15.507 37.441 15.507 16.39 0 31.041-7.446 40.754-19.141l0.071-0.086z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Highlight mode_ic-01"],"grid":0},"attrs":[],"properties":{"order":494,"id":108,"name":"highlight-mode","prevSize":32,"code":59700},"setIdx":0,"setId":1,"iconIdx":109},{"icon":{"paths":["M36.572 128.004h950.856c20.198 0 36.572 16.374 36.572 36.572v0 146.286c0 20.198-16.374 36.572-36.572 36.572h-950.856c-20.198 0-36.572-16.374-36.572-36.572v0-146.286c0.001-20.198 16.374-36.57 36.572-36.57 0 0 0 0 0 0v0zM29.257 420.577h965.484c0 0 0 0 0 0 16.159 0 29.256 13.099 29.256 29.256v87.769c0 16.159-13.099 29.256-29.256 29.256 0 0 0 0 0 0h-965.484c0 0 0 0 0 0-16.159 0-29.256-13.099-29.256-29.256v0-87.772c0-16.157 13.099-29.255 29.256-29.255 0 0 0 0 0 0v0zM21.943 640.005h980.113c12.118 0 21.943 9.824 21.943 21.943v0 65.828c0 12.118-9.824 21.943-21.943 21.943h-980.113c-12.118 0-21.943-9.824-21.943-21.943v0-65.829c0-12.118 9.824-21.943 21.943-21.943v0zM14.63 822.861h994.742c8.079 0 14.629 6.55 14.629 14.629v0 43.885c0 8.079-6.55 14.629-14.629 14.629h-994.742c-8.079 0-14.629-6.55-14.629-14.629v0-43.885c0 0 0-0.001 0-0.001 0-8.079 6.55-14.629 14.629-14.629v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Axes scale_ic-01"],"grid":0},"attrs":[],"properties":{"order":495,"id":109,"name":"axes-scale","prevSize":32,"code":59701},"setIdx":0,"setId":1,"iconIdx":110},{"icon":{"paths":["M1023.916 783.765c0 0.003 0 0.005 0 0.008 0 10.572-4.891 20.003-12.536 26.151l-0.065 0.050-167.841 134.274c-5.691 4.584-13.006 7.357-20.971 7.357-18.537 0-33.564-15.027-33.564-33.564 0-0.001 0-0.001 0-0.003v0-83.921h-738.501c-0.050 0-0.111 0-0.17 0-27.809 0-50.352-22.543-50.352-50.352s22.543-50.352 50.352-50.352c0.059 0 0.12 0 0.18 0h738.491v-83.921c0-0.001 0-0.001 0-0.003 0-18.537 15.027-33.564 33.564-33.564 7.963 0 15.28 2.774 21.036 7.408l-0.065-0.050 167.841 134.274c7.708 6.198 12.601 15.627 12.601 26.198 0 0.003 0 0.005 0 0.008v0zM174.773 178.732c4.588 2.043 9.943 3.232 15.574 3.232 0.189 0 0.377-0.001 0.565-0.004h-0.028c5.807-0.182 11.332-1.054 16.601-2.533l-0.486 0.116c4.491-1.646 9.696-2.794 15.105-3.216l0.204-0.012c10.644 0.235 20.252 4.488 27.405 11.297l-0.018-0.016c10.44 9.124 19.487 19.451 27.040 30.853l0.351 0.565q14.497 20.948 45.115 69.284l23.368 37.061q-55.592 72.506-88.621 111.981c-15.762 20.413-32.951 38.368-51.853 54.361l-0.516 0.426c-10.169 9.325-19.183 19.618-26.99 30.815l-0.397 0.603c-3.56 4.63-6.552 9.955-8.721 15.684l-0.142 0.428c0.969 11.56 5.692 21.865 12.93 29.846l-0.038-0.042c7.32 8.87 18.31 14.487 30.612 14.503h0.003c6.366-0.162 12.453-1.034 18.285-2.54l-0.562 0.123c6.179-1.685 11.563-4.456 16.207-8.123l-0.095 0.072c21.48-20.74 41.505-42.551 60.165-65.517l1.062-1.348q33.836-41.895 84.596-108.758c28.946 48.312 58.46 89.884 90.814 129.024l-1.392-1.733c17.764 24.004 45.044 40.094 76.157 42.672l0.381 0.026c0.966 0.030 2.101 0.047 3.241 0.047 17.246 0 33.585-3.879 48.192-10.813l-0.682 0.292c12.483-5.921 20.961-18.421 20.961-32.902 0-0.328-0.004-0.654-0.014-0.981l0.001 0.049c0.016-0.295 0.026-0.639 0.026-0.985 0-6.702-3.52-12.58-8.811-15.89l-0.078-0.046c-7.87-4.575-16.971-8.427-26.567-11.086l-0.821-0.195c-9.539-2.556-17.84-5.857-25.637-9.983l0.659 0.319c-20.913-13.167-38.356-29.841-51.983-49.374l-0.382-0.58q-27.393-37.056-71.701-109.563 48.339-63.643 83.783-106.344c20.296-24.892 41.116-47.24 63.303-68.153l0.349-0.326c5.648-12.294 9.157-26.622 9.66-41.712l0.005-0.182c0.039-0.65 0.062-1.409 0.062-2.174 0-9.328-3.375-17.869-8.971-24.466l0.045 0.054c-5.283-6.454-13.25-10.541-22.172-10.541-0.703 0-1.4 0.026-2.089 0.076l0.092-0.005c-0.168-0.003-0.365-0.003-0.563-0.003-8.977 0-17.394 2.393-24.65 6.576l0.239-0.127c-11.778 8.236-21.872 17.819-30.384 28.698l-0.231 0.305q-33.028 37.054-112.786 145.013-36.259-62.035-57.205-91.034c-12.174-18-26.874-33.213-43.794-45.565l-0.515-0.358c-15.346-10.609-34.349-16.946-54.835-16.946-0.831 0-1.659 0.011-2.485 0.031l0.123-0.003c-1.571-0.082-3.412-0.13-5.263-0.13-18.745 0-36.365 4.823-51.686 13.296l0.55-0.278c-11.422 6.052-20.533 15.162-26.418 26.245l-0.165 0.34c-2.040 3.724-3.241 8.158-3.241 12.872 0 0.289 0.004 0.577 0.014 0.863l-0.001-0.042c0.312 12.487 8.599 22.957 19.944 26.531l0.203 0.055z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["X axis_ic-01"],"grid":0},"attrs":[],"properties":{"order":496,"id":110,"name":"x-axis","prevSize":32,"code":59702},"setIdx":0,"setId":1,"iconIdx":111},{"icon":{"paths":["M639.998-0.001h-255.995c-70.692 0-127.998 57.306-127.998 127.998v0 768.004c0 70.692 57.306 127.998 127.998 127.998v0h255.995c70.692 0 127.998-57.306 127.998-127.998v0-768.001c-0.001-70.692-57.306-127.998-127.998-127.999v0zM639.998 928.001h-255.995c0 0 0 0 0 0-17.673 0-32-14.327-32-32 0 0 0 0 0 0v0-47.999h127.998c26.436-0.098 47.829-21.55 47.829-48.001s-21.392-47.901-47.818-48.001h-128.008v-96.001h127.998c26.51 0 48.001-21.491 48.001-48.001s-21.491-48.001-48.001-48.001v0h-127.998v-96h127.998c26.51 0 48.001-21.491 48.001-48.001s-21.491-48.001-48.001-48.001v0h-127.998v-96h127.998c26.436-0.098 47.829-21.55 47.829-48.001s-21.392-47.901-47.818-48.001h-128.007v-48.001c0 0 0 0 0 0 0-17.673 14.327-32 32-32 0.001 0 0.003 0 0.003 0h255.995c17.672 0.003 31.997 14.328 32 32v0 768.001c-0.003 17.672-14.328 31.997-32 32v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Indicator_ic-01"],"grid":0},"attrs":[],"properties":{"order":497,"id":111,"name":"indicator","prevSize":32,"code":59703},"setIdx":0,"setId":1,"iconIdx":112},{"icon":{"paths":["M747.131 616.42c-2.437-1.654-5.233-3.079-8.202-4.141l-0.261-0.081 124.904-277.567 118.378-71.028c11.342-6.841 18.81-19.095 18.81-33.094 0-21.272-17.244-38.516-38.516-38.516-7.365 0-14.246 2.067-20.096 5.651l0.168-0.095-274.672 164.807-276.726-221.382c-6.529-5.258-14.924-8.439-24.060-8.439-10.635 0-20.263 4.311-27.234 11.28l-297.638 297.643c-6.97 6.97-11.281 16.599-11.281 27.235s4.311 20.265 11.281 27.235v0c2.952 2.761 6.375 5.069 10.126 6.782l0.237 0.097-46.425 103.159c-1.071 2.323-1.697 5.041-1.697 7.904 0 10.637 8.623 19.26 19.26 19.26 7.773 0 14.471-4.606 17.514-11.236l0.050-0.12 57.635-128.073 133.301-133.302-193.845 430.759c-3.163 6.286-5.707 13.582-7.262 21.238l-0.097 0.567c-0.609 2.802-0.958 6.021-0.958 9.322 0 9.255 2.742 17.87 7.459 25.075l-0.107-0.174c7.008 10.401 18.741 17.15 32.052 17.15 7.96 0 15.356-2.414 21.497-6.551l-0.137 0.088 161.727-107.823 278.823 111.532c4.234 1.741 9.15 2.751 14.302 2.751 10.637 0 20.267-4.308 27.243-11.276v0l154.962-154.962 211.387 158.536c6.351 4.891 14.419 7.839 23.175 7.839 21.084 0 38.176-17.092 38.176-38.176 0-6.105-1.433-11.876-3.982-16.995l0.1 0.221 30.030-66.735c1.071-2.323 1.697-5.039 1.697-7.904 0-10.636-8.623-19.26-19.26-19.26-7.773 0-14.471 4.606-17.514 11.236l-0.050 0.12-24.439 54.314-54.826-41.121 79.251-176.111c1.072-2.323 1.697-5.041 1.697-7.904 0-10.636-8.621-19.257-19.257-19.257-7.772 0-14.468 4.604-17.511 11.234l-0.050 0.12-75.71 168.237-54.788-41.093 148.413-329.785c1.071-2.323 1.697-5.041 1.697-7.904 0-10.637-8.624-19.261-19.261-19.261-7.774 0-14.474 4.606-17.516 11.238l-0.050 0.12-144.859 321.913-47.060-35.295zM92.627 763.925l216.154-480.331 60.934-60.934 29.263 23.41-201.621 448.035zM262.109 671.002c-3.24-1.011-6.965-1.594-10.827-1.594-0.204 0-0.407 0.001-0.611 0.005h0.031l179.326-398.499 53.918 43.133-169.965 377.704zM349.77 706.065l165.235-367.172 53.895 43.114-157.017 348.905zM509.812 770.084l-62.132-24.855 152.273-338.379 40.481 32.385c4.407 3.026 9.663 5.159 15.337 6.016l0.206 0.025zM556.424 760.366l148.845-330.757 100.437-60.261-115.971 257.708z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Aggrigation_ic-01"],"grid":0},"attrs":[],"properties":{"order":498,"id":112,"name":"aggregation","prevSize":32,"code":59704},"setIdx":0,"setId":1,"iconIdx":113},{"icon":{"paths":["M438.886 768.021v0c0 0-0.001 0-0.001 0-181.775 0-329.134-147.358-329.134-329.134 0 0 0-0.001 0-0.001v0c0-181.777 147.359-329.136 329.136-329.136s329.136 147.359 329.136 329.136c0 181.777-147.359 329.136-329.136 329.136 0 0 0 0 0 0zM785.568 707.985c57.463-73.479 92.142-167.193 92.142-269.007 0-242.317-196.436-438.754-438.754-438.754s-438.754 196.436-438.754 438.754c0 242.317 196.436 438.754 438.754 438.754 101.828 0 195.554-34.688 270.005-92.894l-0.967 0.728 222.321 222.328c9.95 10.071 23.762 16.309 39.029 16.309 30.297 0 54.858-24.56 54.858-54.858 0-15.268-6.237-29.079-16.303-39.025l-0.006-0.006zM237.746 438.886v0c0 30.295 24.56 54.855 54.855 54.855h292.566c30.297 0 54.855-24.56 54.855-54.855s-24.56-54.855-54.855-54.855h-292.566c-30.295 0-54.855 24.56-54.855 54.855z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Zoom_ic-01"],"grid":0},"attrs":[],"properties":{"order":499,"id":113,"name":"zoom-out","prevSize":32,"code":59705},"setIdx":0,"setId":1,"iconIdx":114},{"icon":{"paths":["M655.986 259.756l-120.47 150.589c-5.564 6.916-14.027 11.305-23.514 11.305s-17.951-4.389-23.469-11.246l-0.045-0.058-120.475-150.589c-4.111-5.105-6.599-11.668-6.599-18.813 0-16.633 13.484-30.117 30.117-30.117h90.353v-180.706c0-16.633 13.484-30.117 30.117-30.117s30.117 13.484 30.117 30.117v0 180.706h90.353c0.001 0 0.003 0 0.006 0 16.631 0 30.113 13.482 30.113 30.113 0 7.146-2.489 13.713-6.649 18.875l0.045-0.058zM655.986 764.251l-120.47-150.589c-5.564-6.916-14.027-11.305-23.514-11.305s-17.951 4.389-23.469 11.246l-0.045 0.058-120.475 150.589c-4.111 5.105-6.599 11.668-6.599 18.813 0 16.633 13.484 30.117 30.117 30.117h90.353v180.706c0 16.633 13.484 30.117 30.117 30.117s30.117-13.484 30.117-30.117v0-180.706h90.353c0.001 0 0.003 0 0.006 0 16.631 0 30.113-13.482 30.113-30.113 0-7.146-2.489-13.713-6.649-18.875l0.045 0.058zM873.413 466.828h-722.826c-24.95 0-45.177 20.226-45.177 45.177s20.226 45.177 45.177 45.177v0h722.826c24.95 0 45.177-20.226 45.177-45.177s-20.226-45.177-45.177-45.177v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Collaps_inside_ic-01"],"grid":0},"attrs":[],"properties":{"order":500,"id":114,"name":"collapse-inside","prevSize":32,"code":59706},"setIdx":0,"setId":1,"iconIdx":115},{"icon":{"paths":["M659.617 193.757c-4.978 10.182-15.257 17.070-27.147 17.070h-90.353v180.706c0 16.633-13.484 30.117-30.117 30.117s-30.117-13.484-30.117-30.117v0-180.706h-90.353c0 0-0.001 0-0.001 0-16.633 0-30.117-13.484-30.117-30.117 0-7.146 2.489-13.711 6.647-18.874l-0.045 0.058 120.474-150.589c5.565-6.915 14.027-11.301 23.514-11.301s17.949 4.388 23.469 11.243l0.045 0.058 120.47 150.589c4.114 5.106 6.603 11.672 6.603 18.82 0 4.744-1.096 9.23-3.049 13.221l0.079-0.178zM659.617 830.25c-4.978-10.182-15.257-17.070-27.147-17.070h-90.353v-180.706c0-16.633-13.484-30.117-30.117-30.117s-30.117 13.484-30.117 30.117v0 180.706h-90.353c-16.633 0-30.117 13.485-30.117 30.117 0 7.145 2.488 13.707 6.644 18.871l-0.045-0.058 120.474 150.589c5.564 6.916 14.027 11.305 23.514 11.305s17.951-4.389 23.469-11.246l0.045-0.058 120.47-150.589c4.114-5.106 6.603-11.671 6.603-18.817 0-4.742-1.096-9.229-3.049-13.22l0.079 0.178zM873.411 466.828h-722.823c-24.95 0-45.176 20.226-45.176 45.176s20.226 45.176 45.176 45.176v0h722.823c24.95 0 45.176-20.226 45.176-45.176s-20.226-45.176-45.176-45.176v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Collaps_outside_ic-01"],"grid":0},"attrs":[],"properties":{"order":501,"id":115,"name":"collapse-outside","prevSize":32,"code":59707},"setIdx":0,"setId":1,"iconIdx":116},{"icon":{"paths":["M324.781 16.96c-10.291-10.303-24.513-16.675-40.225-16.675-31.4 0-56.855 25.455-56.855 56.855 0 15.712 6.373 29.934 16.675 40.225v0l227.421 227.421c10.287 10.289 24.501 16.653 40.2 16.653s29.913-6.364 40.2-16.653l227.421-227.421c10.47-10.317 16.959-24.654 16.959-40.506 0-31.4-25.455-56.855-56.855-56.855-15.85 0-30.187 6.487-40.497 16.948l-187.226 187.226zM699.221 1007.047c10.245 10.035 24.284 16.227 39.772 16.227 31.4 0 56.855-25.455 56.855-56.855 0-15.488-6.192-29.527-16.236-39.783l-227.412-227.412c-10.287-10.289-24.501-16.653-40.2-16.653s-29.913 6.364-40.2 16.653l-227.421 227.421c-10.47 10.317-16.955 24.654-16.955 40.504 0 31.4 25.455 56.855 56.855 56.855 15.852 0 30.188-6.487 40.499-16.952l187.222-187.221z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Arrow bidirectional_close_ic-01"],"grid":0},"attrs":[],"properties":{"order":502,"id":116,"name":"arrow-bidirectional-close","prevSize":32,"code":59708},"setIdx":0,"setId":1,"iconIdx":117},{"icon":{"paths":["M699.332 324.675c10.324 10.476 24.668 16.965 40.528 16.965 31.419 0 56.889-25.47 56.889-56.889 0-15.861-6.491-30.206-16.962-40.523l-227.563-227.563c-10.293-10.295-24.516-16.663-40.224-16.663s-29.931 6.368-40.224 16.663l-227.556 227.556c-10.423 10.316-16.878 24.626-16.878 40.441 0 31.419 25.47 56.889 56.889 56.889 15.817 0 30.124-6.455 40.436-16.873l187.335-187.335zM324.67 699.335c-10.263-10.116-24.364-16.361-39.924-16.361-31.419 0-56.889 25.47-56.889 56.889 0 15.557 6.245 29.657 16.366 39.927l227.549 227.549c10.293 10.295 24.516 16.663 40.224 16.663s29.931-6.368 40.224-16.663l227.556-227.556c10.041-10.251 16.236-24.299 16.236-39.796 0-31.419-25.47-56.889-56.889-56.889-15.497 0-29.545 6.196-39.806 16.245l-187.321 187.316z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Arrow bidirectional_open_ic-01"],"grid":0},"attrs":[],"properties":{"order":503,"id":117,"name":"arrow-bidirectional-open","prevSize":32,"code":59709},"setIdx":0,"setId":1,"iconIdx":118},{"icon":{"paths":["M340.815 665.327c2.092 4.252 3.316 9.257 3.316 14.546 0 7.963-2.773 15.28-7.408 21.035l0.050-0.065-134.294 167.869c-6.204 7.71-15.64 12.601-26.217 12.601s-20.012-4.891-26.167-12.537l-0.050-0.065-134.294-167.869c-4.583-5.691-7.356-13.007-7.356-20.972 0-18.542 15.031-33.573 33.573-33.573h83.934v-268.59h-83.934c0 0-0.002 0-0.002 0-18.542 0-33.573-15.031-33.573-33.573 0-7.966 2.775-15.284 7.409-21.040l-0.050 0.065 134.294-167.869c6.205-7.708 15.64-12.598 26.217-12.598s20.012 4.89 26.167 12.533l0.050 0.065 134.294 167.869c4.584 5.692 7.359 13.010 7.359 20.975 0 18.542-15.031 33.573-33.573 33.573 0 0-0.002 0-0.002 0h-83.934v268.59h83.934c13.253 0 24.711 7.68 30.171 18.83l0.088 0.198zM982.032 159.481h-537.179c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361h537.179c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.032 360.923h-537.179c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.179c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.032 562.365h-537.179c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.179c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0zM982.032 763.807h-537.179c-27.813 0-50.361 22.547-50.361 50.361s22.547 50.361 50.361 50.361v0h537.179c27.813 0 50.361-22.547 50.361-50.361s-22.547-50.361-50.361-50.361v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Row height_ic-01"],"grid":0},"attrs":[],"properties":{"order":504,"id":118,"name":"row-height","prevSize":32,"code":59711},"setIdx":0,"setId":1,"iconIdx":119},{"icon":{"paths":["M918.074 194.207v706.217c0 68.255-55.332 123.588-123.588 123.588v0h-564.973c-68.255 0-123.588-55.332-123.588-123.588v0-706.217c0-68.255 55.332-123.588 123.588-123.588v0 105.933c-9.751 0-17.656 7.905-17.656 17.656v0 706.217c0 9.751 7.905 17.656 17.656 17.656v0h564.973c0.002 0 0.003 0 0.005 0 9.749 0 17.651-7.902 17.651-17.651 0-0.002 0-0.003 0-0.005v0-706.217c0-9.751-7.905-17.656-17.656-17.656v0-105.933c68.255 0 123.588 55.332 123.588 123.588v0zM776.831 264.845v-141.243c-0.086-68.221-55.366-123.502-123.58-123.588h-282.496c-68.221 0.086-123.502 55.366-123.588 123.58v141.251c0.086 68.221 55.366 123.502 123.58 123.588h282.496c68.221-0.086 123.502-55.366 123.588-123.58v-0.008zM653.243 105.946c9.742 0.020 17.636 7.912 17.656 17.654v141.244c-0.020 9.742-7.912 17.636-17.654 17.656h-282.489c-9.742-0.020-17.636-7.912-17.656-17.654v-141.244c0.020-9.742 7.912-17.636 17.654-17.656h0.002z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Copy_ic-01"],"grid":0},"attrs":[],"properties":{"order":505,"id":119,"name":"copy","prevSize":32,"code":59713},"setIdx":0,"setId":1,"iconIdx":120},{"icon":{"paths":["M0.091 201.202c0-50.485 40.926-91.412 91.412-91.412v0h841.103c50.485 0 91.412 40.926 91.412 91.412s-40.926 91.412-91.412 91.412h-841.103c-50.485 0-91.412-40.926-91.412-91.412v0zM0.158 512.005c0-50.485 40.926-91.412 91.412-91.412v0h841.11c50.485 0 91.412 40.926 91.412 91.412s-40.926 91.412-91.412 91.412v0h-841.11c-50.485 0-91.412-40.926-91.412-91.412v0zM91.569 731.321c-50.485 0-91.412 40.926-91.412 91.412s40.926 91.412 91.412 91.412h841.11c50.485 0 91.412-40.926 91.412-91.412s-40.926-91.412-91.412-91.412v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Menu_ic-01"],"grid":0},"attrs":[],"properties":{"order":506,"id":120,"name":"menu","prevSize":32,"code":59714},"setIdx":0,"setId":1,"iconIdx":121},{"icon":{"paths":["M-0.001 891.875c0 27.365 22.184 49.548 49.548 49.548v0h924.903c27.365 0 49.548-22.184 49.548-49.548v0-132.129c0-27.365-22.184-49.548-49.548-49.548s-49.548 22.184-49.548 49.548v0 82.58h-825.806v-82.58c0-27.365-22.184-49.548-49.548-49.548s-49.548 22.184-49.548 49.548v0zM314.955 437.523c-8.846-8.337-20.799-13.459-33.95-13.459-27.365 0-49.548 22.184-49.548 49.548 0 13.991 5.799 26.626 15.123 35.636l0.014 0.014 231.179 220.292c8.874 8.465 20.92 13.675 34.182 13.675s25.307-5.209 34.201-13.694l-0.020 0.019 231.179-220.292c9.267-9.013 15.018-21.602 15.018-35.534 0-27.365-22.184-49.548-49.548-49.548-13.090 0-24.996 5.077-33.854 13.369l0.028-0.026-147.456 140.505v-445.895c0-27.365-22.184-49.548-49.548-49.548s-49.548 22.184-49.548 49.548v0 445.895z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Download_ic-01"],"grid":0},"attrs":[],"properties":{"order":549,"id":121,"name":"download","prevSize":32,"code":59715},"setIdx":0,"setId":1,"iconIdx":122},{"icon":{"paths":["M-0.001 891.875c0 27.365 22.184 49.548 49.548 49.548v0h924.903c27.365 0 49.548-22.184 49.548-49.548v0-132.129c0-27.365-22.184-49.548-49.548-49.548s-49.548 22.184-49.548 49.548v0 82.58h-825.806v-82.58c0-27.365-22.184-49.548-49.548-49.548s-49.548 22.184-49.548 49.548v0zM708.958 388.292c8.835 8.287 20.755 13.378 33.863 13.378 27.365 0 49.548-22.184 49.548-49.548 0-13.949-5.765-26.553-15.043-35.559l-0.012-0.012-231.179-220.289c-8.874-8.468-20.919-13.678-34.182-13.678s-25.308 5.21-34.201 13.697l0.020-0.019-231.179 220.289c-9.375 9.029-15.199 21.69-15.199 35.71 0 27.365 22.184 49.548 49.548 49.548 13.18 0 25.16-5.147 34.035-13.539l-0.023 0.022 147.451-140.504v445.894c0 27.365 22.184 49.548 49.548 49.548s49.548-22.184 49.548-49.548v0-445.894z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Upload_ic-01"],"grid":0},"attrs":[],"properties":{"order":548,"id":122,"name":"upload","prevSize":32,"code":59716},"setIdx":0,"setId":1,"iconIdx":123},{"icon":{"paths":["M292.911 894.749c3.955 3.955 6.4 9.419 6.4 15.455 0 9.673-6.284 17.879-14.993 20.758l-0.154 0.044-241.568 77.925c-2.005 0.669-4.314 1.055-6.711 1.055-12.071 0-21.858-9.787-21.858-21.858 0-2.398 0.386-4.706 1.1-6.865l-0.044 0.154 77.925-241.566c2.924-8.864 11.13-15.151 20.806-15.151 6.035 0 11.497 2.445 15.455 6.398v0zM688.763 150.282c-3.955-3.955-9.419-6.4-15.455-6.4s-11.497 2.445-15.455 6.4l-466.765 466.765c-3.955 3.955-6.4 9.419-6.4 15.455s2.445 11.497 6.4 15.455l185.471 185.471c3.955 3.956 9.421 6.403 15.458 6.403s11.502-2.447 15.458-6.403l466.756-466.761c3.958-3.955 6.407-9.419 6.407-15.456s-2.449-11.501-6.407-15.456v0zM1018.032 176.381c-2.766-6.361-6.586-11.774-11.296-16.262l-0.021-0.019-142.805-142.805c-8.994-9.44-21.663-15.309-35.701-15.309s-26.706 5.871-35.683 15.29l-0.019 0.021-30.444 30.444c-3.955 3.955-6.402 9.419-6.402 15.456s2.447 11.501 6.402 15.456l183.292 183.296c3.956 3.955 9.421 6.4 15.458 6.4s11.501-2.445 15.458-6.4l30.444-30.448c9.44-8.99 15.311-21.656 15.311-35.691 0-7.022-1.469-13.701-4.117-19.746l0.123 0.316z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Edit_ic-01"],"grid":0},"attrs":[],"properties":{"order":507,"id":123,"name":"edit","prevSize":32,"code":59717},"setIdx":0,"setId":1,"iconIdx":124},{"icon":{"paths":["M768.018 438.857v0c0-181.794-147.372-329.166-329.166-329.166v0c-181.794 0-329.166 147.372-329.166 329.166s147.372 329.166 329.166 329.166c181.794 0 329.166-147.372 329.166-329.166zM707.986 785.573c-73.507 57.498-167.263 92.199-269.124 92.199-242.386 0-438.878-196.493-438.878-438.878s196.493-438.878 438.878-438.878c242.386 0 438.878 196.493 438.878 438.878 0 101.846-34.691 195.59-92.902 270.059l0.729-0.967 222.348 222.348c9.928 9.928 16.069 23.643 16.069 38.794 0 30.3-24.562 54.863-54.863 54.863-15.15 0-28.865-6.141-38.794-16.069v0zM438.851 383.995v0c-30.299 0-54.861 24.562-54.861 54.861v146.296c0 30.299 24.562 54.861 54.861 54.861s54.861-24.562 54.861-54.861v-146.296c0-30.299-24.562-54.861-54.861-54.861zM438.851 329.134v0c-30.299 0-54.861-24.562-54.861-54.861v0c0-30.299 24.562-54.861 54.861-54.861s54.861 24.562 54.861 54.861c0 30.299-24.562 54.861-54.861 54.861z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Search_info_ic-01"],"grid":0},"attrs":[],"properties":{"order":508,"id":124,"name":"search-info","prevSize":32,"code":59718},"setIdx":0,"setId":1,"iconIdx":125},{"icon":{"paths":["M768.018 438.857v0c0-181.794-147.372-329.166-329.166-329.166v0c-181.794 0-329.166 147.372-329.166 329.166s147.372 329.166 329.166 329.166c181.794 0 329.166-147.372 329.166-329.166zM707.986 785.573c-73.507 57.498-167.263 92.199-269.124 92.199-242.386 0-438.878-196.493-438.878-438.878s196.493-438.878 438.878-438.878c242.386 0 438.878 196.493 438.878 438.878 0 101.846-34.691 195.59-92.902 270.059l0.729-0.967 222.348 222.348c9.928 9.928 16.069 23.643 16.069 38.794 0 30.3-24.562 54.863-54.863 54.863-15.15 0-28.865-6.141-38.794-16.069v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Search_ic-01"],"grid":0},"attrs":[],"properties":{"order":509,"id":125,"name":"search","prevSize":32,"code":59719},"setIdx":0,"setId":1,"iconIdx":126},{"icon":{"paths":["M219.428 73.148v0c-80.791 0-146.285 65.494-146.285 146.285v73.143h877.715v-73.143c0-80.791-65.494-146.285-146.285-146.285h-585.143zM-0.001 292.576v-73.143c0-121.186 98.242-219.429 219.429-219.429v0h585.143c121.186 0 219.429 98.242 219.429 219.429v0 585.143c0 0.002 0 0.003 0 0.005 0 121.185-98.239 219.424-219.424 219.424-0.002 0-0.003 0-0.005 0h-585.143c-121.186 0-219.429-98.242-219.429-219.429v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Table_resize_maximaze_ic-01"],"grid":0},"attrs":[],"properties":{"order":510,"id":126,"name":"table-resize-maximize","prevSize":32,"code":59720},"setIdx":0,"setId":1,"iconIdx":127},{"icon":{"paths":["M219.428 73.148v0c-80.791 0-146.285 65.494-146.285 146.285v512.001h877.715v-512.001c0-80.791-65.494-146.285-146.285-146.285h-585.143zM-0.001 731.434v-512.001c0-121.186 98.242-219.429 219.429-219.429v0h585.143c121.186 0 219.429 98.242 219.429 219.429v0 585.143c0 0.002 0 0.003 0 0.005 0 121.185-98.239 219.424-219.424 219.424-0.002 0-0.003 0-0.005 0h-585.143c-121.186 0-219.429-98.242-219.429-219.429v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Table_resize_hide_ic-01"],"grid":0},"attrs":[],"properties":{"order":511,"id":127,"name":"table-resize-hide","prevSize":32,"code":59721},"setIdx":0,"setId":1,"iconIdx":128},{"icon":{"paths":["M219.428 73.148v0c-80.791 0-146.285 65.494-146.285 146.285v292.572h877.715v-292.572c0-80.791-65.494-146.285-146.285-146.285h-585.143zM-0.001 512.005v-292.572c0-121.186 98.242-219.429 219.429-219.429v0h585.143c121.186 0 219.429 98.242 219.429 219.429v0 585.143c0 0.002 0 0.003 0 0.005 0 121.185-98.239 219.424-219.424 219.424-0.002 0-0.003 0-0.005 0h-585.143c-121.186 0-219.429-98.242-219.429-219.429v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Table_resize_resizable_ic-01"],"grid":0},"attrs":[],"properties":{"order":512,"id":128,"name":"table-resize-resizable","prevSize":32,"code":59722},"setIdx":0,"setId":1,"iconIdx":129},{"icon":{"paths":["M568.769 56.784c0-31.373-25.433-56.807-56.807-56.807s-56.807 25.433-56.807 56.807v0 398.385h-398.383c-31.373 0-56.807 25.433-56.807 56.807s25.433 56.807 56.807 56.807v0h398.383v398.388c0 31.373 25.433 56.807 56.807 56.807s56.807-25.433 56.807-56.807v0-398.388h398.388c31.373 0 56.807-25.433 56.807-56.807s-25.433-56.807-56.807-56.807v0h-398.388z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Plus_ic-01"],"grid":0},"attrs":[],"properties":{"order":513,"id":129,"name":"plus","prevSize":32,"code":59723},"setIdx":0,"setId":1,"iconIdx":130},{"icon":{"paths":["M512 1024.019c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512v0c-0.335 282.636-229.365 511.667-511.968 512h-0.032zM512 128.019c-212.078 0-384 171.923-384 384s171.923 384 384 384c212.078 0 384-171.923 384-384v0c-0.239-211.982-172.019-383.76-383.976-384h-0.024zM512 400.004v0c61.856 0 112.001 50.144 112.001 112.001v0 0c0 61.856-50.144 112.001-112.001 112.001v0 0c-61.856 0-112.001-50.144-112.001-112.001v0 0c0-61.856 50.144-112.001 112.001-112.001v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Runs_ic-01"],"grid":0},"attrs":[],"properties":{"order":514,"id":130,"name":"circle-with-dot","prevSize":32,"code":59724},"setIdx":0,"setId":1,"iconIdx":131},{"icon":{"paths":["M831.999 0.004v0c106.038 0 192 85.962 192 192v640c0 0.001 0 0.003 0 0.004 0 106.036-85.959 191.995-191.995 191.995-0.001 0-0.003 0-0.004 0h-640c-106.038 0-192-85.962-192-192v-640c0-106.038 85.962-192 192-192zM804.717 370.112c7.017-8.292 11.284-19.107 11.284-30.918 0-26.509-21.49-48.001-48.001-48.001-14.698 0-27.853 6.606-36.658 17.011l-0.058 0.070-260.614 309.484-145.984-131.385c-8.5-7.777-19.872-12.544-32.355-12.544-26.509 0-48 21.49-48 48 0 14.257 6.216 27.064 16.087 35.856l0.048 0.042 182.859 164.569c8.467 7.647 19.744 12.325 32.112 12.325 14.697 0 27.85-6.606 36.655-17.010l0.058-0.070z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Check_rectangle_ic-01"],"grid":0},"attrs":[],"properties":{"order":515,"id":131,"name":"check-rectangle","prevSize":32,"code":59725},"setIdx":0,"setId":1,"iconIdx":132},{"icon":{"paths":["M375.392 874.29c10.978 11.519 26.439 18.681 43.572 18.681 18.368 0 34.812-8.233 45.848-21.21l0.071-0.086 542.912-641.631c9.098-10.482 14.644-24.26 14.644-39.335 0-33.221-26.932-60.153-60.153-60.153-18.591 0-35.21 8.433-46.245 21.683l-0.079 0.098-499.636 590.466-293.118-307.924c-10.978-11.515-26.437-18.677-43.568-18.677-33.221 0-60.155 26.932-60.155 60.155 0 16.090 6.317 30.706 16.609 41.501l-0.023-0.024 339.316 356.455z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"2102122201284082165751091":[],"20115230165751091":[]},"tags":["Check_ic-01"],"grid":0},"attrs":[],"properties":{"order":516,"id":132,"name":"check","prevSize":32,"code":59747},"setIdx":0,"setId":1,"iconIdx":133},{"icon":{"paths":["M996.075 624.001h-33.075c-4.647-13.098-12.476-24.833-22.776-34.142v-267.713c15.113-13.653 24.704-32.384 26.97-52.65l36.621-10.595c7.095-2.078 13.082-6.887 16.644-13.38s4.412-14.139 2.364-21.257c-2.052-7.121-6.831-13.137-13.295-16.73s-14.085-4.467-21.192-2.436l-33.57 9.707c-4.074-6.272-8.964-11.973-14.541-16.952v-115.188c0-4.95-1.962-9.698-5.453-13.199s-8.226-5.468-13.163-5.468h-74.466c-4.941 0-9.672 1.967-13.167 5.468-3.491 3.501-5.453 8.249-5.453 13.199v115.188c-8.661 7.74-15.617 17.211-20.417 27.81-4.8 10.595-7.335 22.080-7.446 33.716l-220.703 63.834c-3.537-4.872-7.583-9.353-12.071-13.359v-227.188c0-4.95-1.962-9.698-5.453-13.199s-8.226-5.468-13.163-5.468h-74.466c-4.937 0-9.672 1.967-13.163 5.468s-5.453 8.249-5.453 13.199v227.18c-4.493 4.011-8.538 8.49-12.075 13.368l-220.699-63.834c-0.111-11.636-2.646-23.121-7.446-33.72-4.796-10.599-11.751-20.070-20.417-27.815v-115.179c0-4.95-1.962-9.699-5.453-13.199-3.495-3.501-8.231-5.468-13.167-5.468h-74.465c-4.938 0-9.672 1.967-13.164 5.468s-5.453 8.249-5.453 13.199v115.179c-5.579 4.979-10.469 10.683-14.54 16.961l-33.569-9.707c-3.528-1.032-7.223-1.358-10.875-0.956-3.653 0.405-7.19 1.523-10.409 3.303-3.219 1.775-6.057 4.169-8.352 7.049-2.294 2.876-3.999 6.183-5.018 9.72-1.019 3.542-1.331 7.25-0.918 10.91s1.542 7.202 3.324 10.424c1.782 3.225 4.179 6.063 7.056 8.354s6.177 3.99 9.711 5.001l36.624 10.595c2.262 20.271 11.856 39.006 26.966 52.659v379.701c-15.108 13.653-24.702 32.384-26.969 52.65l-36.624 10.595c-7.116 2.057-13.125 6.866-16.704 13.368s-4.437 14.162-2.384 21.296c2.054 7.134 6.849 13.158 13.332 16.751 6.483 3.588 14.123 4.446 21.239 2.39l33.57-9.711c4.074 6.276 8.963 11.976 14.54 16.956v115.187c0 4.95 1.962 9.698 5.453 13.197 3.492 3.503 8.226 5.471 13.164 5.471h74.463c4.937 0 9.672-1.967 13.163-5.471 3.495-3.498 5.453-8.247 5.453-13.197v-115.187c8.666-7.745 15.621-17.216 20.421-27.81 4.796-10.595 7.335-22.080 7.442-33.716l220.706-63.834c3.533 4.872 7.583 9.353 12.071 13.359v227.188c0 4.95 1.962 9.698 5.453 13.202 3.491 3.498 8.226 5.466 13.163 5.466h74.466c4.937 0 9.672-1.967 13.163-5.466 3.495-3.503 5.453-8.252 5.453-13.202v-227.192c10.299-9.311 18.129-21.044 22.776-34.142h215.087c4.65 13.098 12.476 24.833 22.776 34.142v227.192c0 4.95 1.959 9.698 5.453 13.197 3.491 3.503 8.226 5.471 13.163 5.471h74.466c4.937 0 9.672-1.967 13.163-5.471 3.491-3.498 5.453-8.247 5.453-13.197v-227.192c10.299-9.311 18.125-21.044 22.776-34.142h33.075c7.407 0 14.511-2.952 19.746-8.201 5.235-5.253 8.18-12.374 8.18-19.802 0-7.424-2.945-14.546-8.18-19.797s-12.339-8.201-19.746-8.201zM139.706 810.667c-9.206 0-18.204-2.739-25.857-7.868-7.655-5.124-13.619-12.416-17.142-20.942-3.522-8.529-4.445-17.912-2.649-26.966 1.796-9.050 6.23-17.366 12.738-23.894 6.509-6.524 14.802-10.97 23.831-12.77s18.387-0.879 26.891 2.654c8.505 3.533 15.773 9.515 20.889 17.19 5.112 7.671 7.842 16.695 7.842 25.925-0.014 12.374-4.92 24.239-13.646 32.985-8.726 8.751-20.558 13.671-32.897 13.683zM139.706 306.666c-9.206 0-18.204-2.739-25.857-7.863-7.655-5.129-13.619-12.42-17.142-20.945-3.522-8.529-4.445-17.912-2.649-26.966 1.796-9.050 6.228-17.366 12.738-23.894 6.509-6.524 14.802-10.97 23.831-12.77s18.387-0.875 26.891 2.654c8.505 3.533 15.773 9.515 20.889 17.19 5.112 7.676 7.842 16.695 7.842 25.925-0.014 12.374-4.92 24.239-13.646 32.985-8.726 8.751-20.558 13.671-32.897 13.683zM456.192 589.855c-16.274 14.669-26.126 35.183-27.417 57.089l-224.014 64.794c-2.799-3.537-5.876-6.843-9.203-9.887v-379.696c3.329-3.042 6.408-6.35 9.207-9.887l224.009 64.79c1.289 21.909 11.141 42.423 27.417 57.096v155.699zM512.039 698.667c-9.203 0-18.201-2.739-25.856-7.863-7.655-5.129-13.619-12.42-17.144-20.945-3.521-8.529-4.442-17.912-2.646-26.966 1.797-9.050 6.23-17.366 12.737-23.894 6.512-6.524 14.801-10.97 23.829-12.77s18.39-0.875 26.894 2.654c8.504 3.533 15.774 9.515 20.886 17.19 5.115 7.671 7.847 16.695 7.847 25.925-0.014 12.374-4.92 24.239-13.646 32.985-8.726 8.751-20.558 13.671-32.901 13.683zM512.039 418.667c-9.203 0-18.201-2.739-25.856-7.863-7.655-5.129-13.619-12.416-17.144-20.945-3.521-8.529-4.442-17.912-2.646-26.961 1.797-9.054 6.23-17.37 12.737-23.898 6.512-6.524 14.801-10.97 23.829-12.77s18.39-0.875 26.894 2.654c8.504 3.533 15.774 9.515 20.886 17.19 5.115 7.676 7.847 16.695 7.847 25.925-0.014 12.374-4.92 24.239-13.646 32.985-8.726 8.751-20.558 13.671-32.901 13.683zM828.523 589.858c-10.296 9.311-18.125 21.044-22.772 34.142h-215.087c-4.647-13.098-12.476-24.833-22.776-34.142v-155.712c16.278-14.673 26.126-35.187 27.417-57.093l224.014-64.79c2.799 3.533 5.88 6.84 9.207 9.882l-0.005 267.713zM884.375 698.667c-9.203 0-18.201-2.739-25.856-7.863-7.655-5.129-13.619-12.42-17.144-20.945-3.521-8.529-4.442-17.912-2.646-26.966 1.793-9.050 6.225-17.366 12.737-23.894 6.507-6.524 14.801-10.97 23.829-12.77s18.386-0.875 26.894 2.654c8.504 3.533 15.77 9.515 20.886 17.19 5.115 7.671 7.842 16.695 7.842 25.925-0.009 12.374-4.916 24.239-13.641 32.985-8.726 8.751-20.561 13.671-32.901 13.683zM884.375 306.666c-9.203 0-18.201-2.739-25.856-7.863-7.655-5.129-13.619-12.42-17.144-20.945-3.521-8.529-4.442-17.912-2.646-26.966 1.793-9.050 6.225-17.366 12.737-23.894 6.507-6.524 14.801-10.97 23.829-12.77s18.386-0.875 26.894 2.654c8.504 3.533 15.77 9.515 20.886 17.19s7.842 16.695 7.842 25.925c-0.009 12.374-4.916 24.239-13.641 32.985-8.73 8.751-20.561 13.671-32.901 13.683z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"20115230165751091":[]},"tags":["Params_ic"],"grid":0},"attrs":[],"properties":{"order":517,"id":133,"name":"params","prevSize":32,"code":59712},"setIdx":0,"setId":1,"iconIdx":134},{"icon":{"paths":["M512 0c-282.769 0-512 229.231-512 512s229.231 512 512 512c282.769 0 512-229.231 512-512v0c0-282.769-229.231-512-512-512v0zM99.097 512c0-228.040 184.863-412.903 412.903-412.903s412.903 184.863 412.903 412.903c0 228.040-184.863 412.903-412.903 412.903v0c-228.040 0-412.903-184.863-412.903-412.903v0zM561.548 247.742c0-27.365-22.184-49.548-49.548-49.548s-49.548 22.184-49.548 49.548v0 264.258c0 27.365 22.184 49.548 49.548 49.548v0h198.193c27.365 0 49.548-22.184 49.548-49.548s-22.184-49.548-49.548-49.548v0h-148.645z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Time_ic-01"],"grid":0},"attrs":[],"properties":{"order":518,"id":134,"name":"time","prevSize":32,"code":59758},"setIdx":0,"setId":1,"iconIdx":135},{"icon":{"paths":["M738.883 141.242l-0.084 1.222c-5.293 62.167-27.789 119.427-62.062 166.078l-0.877 1.127c-44.64 55.488-99.241 102.622-163.859 140.177l-2.767-1.491c-61.847-36.065-116.45-83.197-161.965-139.814l0.646 0.922c-34.919-47.573-57.416-104.834-62.792-168.222h453.764zM845.274 141.242h19.831c39.002 0 70.621-31.619 70.621-70.621s-31.619-70.621-70.621-70.621v0h-706.207c-39.002 0-70.621 31.619-70.621 70.621s31.619 70.621 70.621 70.621v0h19.831c5.821 86.996 36.113 165.929 83.972 231.17l-0.859-1.228c42.627 55.122 92.83 101.805 149.583 139.385l2.301 1.432c-59.055 39.014-109.256 85.695-150.826 139.395l-1.058 1.422c-47 64.012-77.292 142.946-83.040 228.602l-0.071 1.337h-19.831c-39.002 0-70.621 31.619-70.621 70.621s31.619 70.621 70.621 70.621v0h706.207c39.002 0 70.621-31.619 70.621-70.621s-31.619-70.621-70.621-70.621v0h-19.831c-5.821-86.996-36.111-165.929-83.972-231.168l0.859 1.228c-42.627-55.124-92.829-101.805-149.583-139.385l-2.301-1.432c59.055-39.012 109.256-85.693 150.826-139.395l1.058-1.422c47.004-64.010 77.295-142.946 83.042-228.604l0.071-1.337zM512 574.153l2.769 1.491c61.849 36.065 116.451 83.197 161.968 139.814l-0.646-0.922c34.919 47.573 57.416 104.834 62.792 168.222h-453.765l0.084-1.222c5.292-62.168 27.789-119.429 62.062-166.080l0.877-1.129c44.64-55.488 99.242-102.622 163.859-140.177z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Duration_ic-01"],"grid":0},"attrs":[],"properties":{"order":519,"id":135,"name":"duration","prevSize":32,"code":59759},"setIdx":0,"setId":1,"iconIdx":136},{"icon":{"paths":["M966.67 606.722h-216.091l15.789-189.446h200.302c31.388 0 56.834-25.446 56.834-56.834s-25.446-56.834-56.834-56.834v0h-190.828l20.13-241.561c0.155-1.568 0.242-3.392 0.242-5.234 0-31.388-25.446-56.834-56.834-56.834-29.911 0-54.424 23.105-56.667 52.44l-0.012 0.192-20.915 250.997h-264.835l20.13-241.561c0.131-1.446 0.204-3.126 0.204-4.824 0-31.388-25.446-56.834-56.834-56.834-29.765 0-54.186 22.881-56.633 52.015l-0.014 0.208-20.915 250.997h-225.559c-31.388 0-56.834 25.446-56.834 56.834s25.446 56.834 56.834 56.834v0h216.087l-15.789 189.446h-200.296c-31.388 0-56.834 25.446-56.834 56.834s25.446 56.834 56.834 56.834v0h190.825l-20.13 241.558c-0.124 1.414-0.197 3.060-0.197 4.723 0 31.39 25.447 56.836 56.836 56.836 29.728 0 54.125-22.822 56.626-51.902l0.014-0.211 20.915-251.003h264.831l-20.13 241.558c-0.151 1.558-0.238 3.367-0.238 5.197 0 31.388 25.446 56.834 56.834 56.834 29.893 0 54.395-23.078 56.663-52.39l0.012-0.194 20.915-251.003h225.563c31.388 0 56.834-25.446 56.834-56.834s-25.446-56.834-56.834-56.834v0zM371.692 606.722l15.786-189.446h264.835l-15.789 189.446z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Hash_ic-01"],"grid":0},"attrs":[],"properties":{"order":520,"id":136,"name":"hash","prevSize":32,"code":59760},"setIdx":0,"setId":1,"iconIdx":137},{"icon":{"paths":["M871.298 80.842h-89.824v-89.824h-107.789v89.824h-323.368v-89.824h-107.789v89.824h-89.824c-69.452 0-125.755 56.301-125.755 125.755v0 682.666c0 69.452 56.301 125.755 125.755 125.755v0h718.597c69.452 0 125.755-56.301 125.755-125.755v0-682.666c0-69.452-56.301-125.755-125.755-125.755v0zM152.702 188.632h718.597c9.922 0 17.965 8.044 17.965 17.965v0 161.684h-754.526v-161.684c0-9.922 8.044-17.965 17.965-17.965v0zM871.298 907.229h-718.597c-9.922 0-17.965-8.044-17.965-17.965v0-413.192h754.526v413.192c0 0.002 0 0.003 0 0.005 0 9.92-8.040 17.96-17.96 17.96-0.002 0-0.003 0-0.005 0v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["Calendar_ic-01"],"grid":0},"attrs":[],"properties":{"order":521,"id":137,"name":"calendar","prevSize":32,"code":59761},"setIdx":0,"setId":1,"iconIdx":138},{"icon":{"paths":["M997.161 28.923c-16.026-17.696-39.048-28.801-64.667-28.922h-841.026c-25.611 0.129-48.608 11.215-64.561 28.807l-0.066 0.074-0.066 0.066c-16.61 18.321-26.776 42.75-26.776 69.553 0 0.103 0 0.204 0 0.306v-0.016l-0.009 826.44c-0.002 0.24-0.003 0.523-0.003 0.805 0 26.637 10.184 50.896 26.87 69.095l-0.068-0.076c16.016 17.703 39.032 28.815 64.646 28.944h841.024c25.605-0.099 48.601-11.185 64.537-28.785l0.066-0.074c16.67-18.116 26.888-42.393 26.888-69.059 0-0.3-0.002-0.598-0.003-0.897v0.046l0.011-826.441c0.003-0.264 0.003-0.575 0.003-0.887 0-26.625-10.184-50.87-26.87-69.054l0.068 0.074zM107.796 916.196l0.011-808.391h808.395l1.781 808.391zM756.336 270.027c2.327 4.923 3.687 10.695 3.687 16.785 0 0.033 0 0.066 0 0.101v-0.005 66.288c0 0.033 0 0.073 0 0.112 0 12.208-5.465 23.14-14.081 30.485l-0.057 0.047-0.638 0.556-0.674 0.507c-7.986 5.839-17.999 9.342-28.832 9.342s-20.848-3.504-28.973-9.439l0.139 0.096-1.315-1.064c-8.67-7.388-14.134-18.317-14.134-30.522 0-0.043 0-0.085 0-0.128v0.006-25.24h-115.152v420.544c0 0.013 0 0.028 0 0.043 0 11.952-5.577 22.602-14.268 29.49l-0.077 0.060 0.212 0.242c-0.253 0.219-0.575 0.283-0.835 0.499-0.204 0.161-0.27 0.409-0.477 0.565l-0.142-0.191c-7.722 6.436-17.75 10.342-28.688 10.342s-20.966-3.906-28.761-10.4l0.073 0.058-0.145 0.191c-0.205-0.156-0.27-0.409-0.474-0.565-0.261-0.216-0.584-0.275-0.842-0.499l0.216-0.246c-8.772-6.946-14.351-17.595-14.351-29.547 0-0.014 0-0.028 0-0.043v0.002-420.542h-115.152v25.24c0 0.030 0 0.066 0 0.103 0 12.211-5.465 23.147-14.082 30.493l-0.057 0.047-0.638 0.556-0.674 0.507c-7.986 5.839-18.002 9.342-28.835 9.342s-20.849-3.504-28.974-9.439l0.139 0.096-1.315-1.064c-8.67-7.392-14.133-18.325-14.133-30.534 0-0.038 0-0.077 0-0.115v0.006-66.288c0-0.032 0-0.069 0-0.107 0-12.208 5.463-23.14 14.077-30.487l0.055-0.046c7.741-6.96 18.034-11.216 29.322-11.216 0.006 0 0.011 0 0.017 0h408.236c0.125-0.002 0.272-0.002 0.42-0.002 11.417 0 21.841 4.254 29.773 11.261l-0.049-0.043c4.381 3.728 7.912 8.316 10.354 13.515l0.103 0.245z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{},"tags":["text"],"grid":0},"attrs":[],"properties":{"order":493,"id":138,"name":"text","prevSize":32,"code":59757},"setIdx":0,"setId":1,"iconIdx":139}],"height":1024,"metadata":{"name":"icomoon"},"preferences":{"showGlyphs":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"icon-","metadata":{"fontFamily":"icomoon"},"metrics":{"emSize":1024,"baseline":6.25,"whitespace":50},"embed":false},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"classSelector":".icon","name":"icomoon"},"historySize":50,"showCodes":true,"gridSize":16}} \ No newline at end of file diff --git a/src/public/assets/inconsolata/fonts/Inconsolata.ttf b/src/public/assets/inconsolata/fonts/Inconsolata.ttf new file mode 100644 index 0000000000000000000000000000000000000000..65324679d0396002a0f1da9afbf6c4413a4b7ebf GIT binary patch literal 338540 zcmb4s2Y_T%mG-;uRaeeA=N!ALy1F`d&rEkuPo80hAtNjUqKJbHGGve-ih!W}D!QVe zfEYoLAfo6R&;|8J-PP4KqU++K7(fB1`v1VW+PAFVdGuQUe{B7`#6I>n zNiuzPY4@6=c75=SPfP5xUjTyiww;aEYyMBBDKYE!f%TM~yVmTwe&KIVOYFg)OA_;+ zdj6@)KQ#X4O%i+bWBB)})6PEioZ9I>xkzHR5lJ%7op%0tN&oL`pO;watN8cl&p79` zXa6#E+wl?$oCkVtIRnp|PWb7H#2&)<%Dt~W_1tp+=LEe!!FS_p-*Dj>Q_lB&2V=cK zlKyhyYXSeqZ~Dp@?-@yXtx^woPd)^(v`yZ6p?3^U!-+#{X>E~2lUY?Lx!6-@cqmm3-CH9Pbk)%jwDKcl% z>1D?B24&f-H!e$+uU1^+jkarixS7jz+XW@#X?rs4^k3S)dg4bHeq;R2(u1SF@8#u- z_Pegm625#j|Ou$=mv}fFu4O^-YQ_EyaE`) zX4xzG=Ilz?&)CTB)hATED`&H36csO?xz0k*5cc4lRf%x)vdhfa!zZ!Nct;(Dg_GLM|kRvgPwX|<&Wx9aXfX#5uRG* z>79aK#8ck@zvQs;7J(VFer!eJba*U`-MX9epTiDvO2w#gitrMr0vz#?ICZ-=#uouk ztKr5N?>ux2&LMTKpy*3~7tkR+sPQZZCA$eRTllk%{Slkn=41>&$Gzq%se&sUo-dI^DDNEGz=e!YoRd4gx&xz zK#i9%mgPKwt{cX`d{c%#k&;qXip|+AsZY?etNF_I(nhe*XzH9`RLn^Jj$bKN7CzYhsoHL)xrBWr+ zvdivt1}qA(2>cOD0(XYeb-6P#qqJN8fWc50%@;sa+74>tGEvqI==B*EYahEVA03{V zPtTtcoH8kj-Wck{3bVC9q%oTfHH!9;_^xSlZtDd*H=Mn(>RmS$)ftR7dpeL=cgpnS zDT{e`CXjCNUB#*6+>HtDLe*OyWMypCWMAS0ObGHIVD9pAm>OVWt1y!^OAY1*6Necu z!R{Ua(;o{G2^d;Wj0nvmujNBB?FpgX4yNx;F*eZ`S;Y$uD^YFi+dbMG)^Hfe>*&e~ zdlC}jkiwGlp)dr)*%yrAW&k4L_Xi*qc11`-flI^a&7&JfyuOG{NzR?VVcp!)2~}1+ zdT|qz&++D>(Z!w3rRD9F?!-CUk2-ILc10YcJdIJjQifLBCn-renaN0rA$ge(C&UmU zNP8jRg1m8Qq@fRzMA{?Un$34K=7-Z(liQkEck0Z{)Z8((!clYUU-vr3>J!Z9O_%)6 z(JieF=WQ!bOrEoK`*|}@O<>RP*($VRS-z@w{gOB$$FXP9eXgmr%6cg$(LNi6<^+ed zXH?CZlE}vXfU6Y_b@~BNH_2STMmf}N911c&iBTVccCbjHIqQ(oC~>9GXE^Od+J`A$ z|IZ}5toKzm)O&@EtJ|L_;#j!6l!a`Bf5xCfcs+y{wpc~SI>?rbF}|o$?E(C!4;=%% z{8xo+xq$xCkf10GicUT(^dkz{asmCgiaP+@PaFZ7Y&k)bE&mI*RN~dS#mzXMU5(w|GqSV4_8a3Rj9KLgt|}Qk_rNf+vpdi z_j4(6Voi1mF7u}b_U-Jy8-oD;}c6DuKukHQp zzyDi4XZowty>HXg8QAJ4<@4cBKzmopWpid&*y^Bpz*f7t{u)YSUU_b-`^Fk>L)s3X zf{gWy-0eWU`^aGXHl97f5+ieKBDwXGuBK7P3>HT+7l^dVNmsBoTeK$LZFB|{7LEdZ7+g(3pX8N}OF;?pRJIOB`W%ggdu1Fy% zIp+xAh+whkd?DkqO*b&arEpn?n;yt#?yy4{*w1^L28UyR>UJ+ZbVRIGYh?$`2b|f+ z*Xo_zYBIlz`1iFw|M;xA_7_mX`^Wwq@WootcY~NzeHZ1JgiQedc3_luV}{)R8g)9j zAIxMD_SeO|P3!~s9vRwvuC{N-#pkik#c!EpFHKJN^yEQs44js2oZ^pg4}w{T2F~>Y zhHS5Zx%&ma-cG;__t*PiJa-Bh!jtU7%o4Q2-i!VLVWG^{ zsA<{nc6<1?A<2SQo6Z-y-2nV)uIWcRs+9S0()wz3W2|TxVg{Ql<4>2p7qHkVa(H+u zWyz#lMxDuSvDxDb6KoH}@PkvkIsr%`jrUtFi6?VOyc0x%rWnk!kRZ@hUimxwcbu_& zIN92nWbx<}H@31@;fGLYi~tUP9s?AFx|3O4X}1-R;jZSUjnEZLr?=YdhVcLV{dhJu z+Up6$@n@E02%q)-+`COj{%9Fm5Tk%Qr*KNHhkQW`rWM-7KNr5QtkQBWtYcP+&$+Vh zxFMC+NlACm3L8Rs@fQam@BX!LT@1zMY+{06Q2{-cI;AAfHq zJ+3ob40?x!*8X{{y=!XMNbtQNM=?70KR*rL^LcP7IF0lEBad<^KvYnTGZMvouIEWE zE}NDRXmx{De$0LnTpw<-f;i}RMn-YsqZojy+KCNpXEYGQY0u|Nd2+p{`%GaU2>P0K zi`#4SMshL#@W?~ln!GecR6!!ZT}XtW>UukuhyZL^Un2UnuR_Ub@E3C90?7}r`1;y^ zEp*EuE>*V-#yDZI)~+1I?w8*w8L=u&DKY1)=JWA{emP*mkyfvsuqf(+&TShk21M>IdK7Tyn^Wl66YEM64PU5u4 zteig|6g!6Dv@EeNLel&=<=B`c0Pjowe6SE|d56zQbDkZ({%U%HMi5%&CNR0xqoi*}$r&Ga9X? z2jR4SEE*${Eq?-Yvcu+BtTMCMjmrv_h&wQdhtURPn&-mcxXd&CTI|Da@40mtv&Fux zIxWxk{1}zvmvrZ;(D!_MCQ_sgOO5XLQ~XGZnE;=D|$0*ii%)=tuIoh#e&m zI|>>V#E$5c16P!rJK93Dhqyv1^ka!>Xg(ZvUS7XvWMt3!rPD@6PFosYm(8vlZp>%1 z^OlY8Jma)?ZrSqA)6RJ3#_6eZcWyg(ZtmP|JI^J(!bjw*eZjzL%Sq!v#6rN3)fX_7 z8$paG3z%x(<{yklc$6GZbO1)pHV8cZY(oKv-m!ZXR(MGftoo1ol&wZ6Fg9fys(2>4 z8zd2rf5!JWk0=W|C_*8|=w};fj87b94Dg#rC@Uzl&-pp+RXo=av~ypu{}gyHpR3U%b{u|P<@RA@N6l>i z6kO198?+!Z1CoL9?$XBl_^*BhO~)tm@XAN~c579}-ZmhsN*S26=o*(Aj!D1>%9Y_G zQ7)ha zLm3n;ze8Z_4&W3&)e3%U`5l5f^FSzy+W<cxc)UlU&HJcWcm7m=-D%E; zK1X@YSAVW>fV|w8HE3zDgqsowP)^R1*x0XS28Kf zp=eYX8`n5b-Xo9IH$0Rp;)W*xhkG@trq{y;bzS|;k>CHx+;llm*f8QNx&P~)cfRxP z-?)m-aM57RCp<_|g&KzZwhNAW{f$d5Z;Yqj5?=RoImPy*yP?U`Hy?H0H0Y$bAo(*k z#B1Qu*pc81k~>2OERodU-X=GKIOt_uaMt=swaF(IcbEK)rS>(K*2lu(u^ODJ;cdj#_+<^$l+(<5RPDl*pUhN`B#$ z7`V7={@QCRogl`&Lf(t>lVUR+H@tm#cx(N(AIDm8F?NjX8X|vjc-4qGmF&uLA~q_p{@#E$BEt&F; z*{mFBEYxIMBDzCCz2}+?ES>Eu6i*W%j2% zL-S9B#!pzg>#V6@Y2n!6Z5Pgy#EfAjzKfM`AbN#!nc3;I+oceAq^4ZOYV(tGc;gA>#CYMRt=C<6;kqfX=0bUIb^B;$am3tvmU(DdCYy;i`S5%^z8`NJ z*pG4;oYbNj0){+K0V6z5IR+Tb^BeXk!a3$6f8(cxHHm?& zu7G(L_(v<6Cm2B9Za$whn!Ete2X-^<386v7Gb9TF?_CsLeUQxqSgRTmFrU}(0tRb+ zJE9b~am-5q{>kpuXZn~YX$3UQH~f}k-aa>wV?KCRcZ$)8#$ewLk3bR!@mw!Xa9ieR zy|rkzz(i*tF^}8L8h@tfaMgo3oBy0^;)1Khkx%hS7dLdBF`sP#J`OM^&{3lF{dq!iewPuHN z%xD>MXWFU6bZPv;SSw*qj^uke_U(!7!@lPB#?8sfvGeVvx?l6D;Gycdhr^)9CH5Vh zyA6_O&ZL)RWz}Nv=!A$rfA>Ci@56F)c6R@Fpx;)XvEa0BH6eT4e^Q#oq)|;GLL1^? z${%qAUt;qD2aAl4L%um4o&&$1%Qx{Ja%jQHPV*xY$ohgltg(Q(;ddM+0QPGcu>_=L z5Jo*Qd%1QHQ9l|Dk}wD*^bxajC`}(FplJr7)H5ke+@Pju;k-#_<{(a+_MmCm)6Yt9 z71QZQ4ZM^{!*BfD{K}rw=Mg=a+_-6KUF(Dy%f7SN`zV0Wd-vw!kKe}L(>rV1=}pkd zar0gOd9mwxO&<&C2DG_=p_8S65hqI)a}UJz55}YBDhQ7j*B3CP%L&h_E|>XmtGZmk z(OFB3C(c>|iXXzcheh!Qa7BYsIh;UNynog_%>2X|f`vf4X060{bcPUg_0JG22`GNv zB3Z6s75*qc1t^5?v0pz9`9YkAX87>RclvvqLveooi{R(eBtdd!ke@YBE-(q0>;6EP z+kVIbHCOFl%pPUPt{S>(R@`7_LIK{IR#49cTAfP@YMwC`hKOY7)?ZzHA5j&@=Yt^Y-}!P;Rh)pMlY@X$ z<2@wX2l0kZ4uFBxJLu#fHv#`uk&a4F|kw*uHHpf6nGK%u% zJ!{tO@t;0Ed0ONwl%e%bVEcO4vb*=+%--939j!0N%H z9KmRNSisQU6nH+2`VXqqAfVN~c`&9sP#=mFvLPlab{*zPG1%{eKNcxE=P)w^rm2Tw zM_N}+(llIrnjWPc=pr|hDHuv0zkAbFZ&|$UzHQgN6>;6xbI#;w2c%?i%noH-qQP57INA3hTdsS zwldr7NjklGhW068bu{uJ2DFUs{QoxX>DPZmr@_S&so8uwA3z*v>zmUvBBH5r` zgSif_1NiRakzy^9O}h71%<=!nD*y8M6Q)f=N@v}CXS#OO*x{`*_(wU;$JqCzu2h)w zHqFacqtWJaN!f~FxgCi}7LAW^ec&4n|`U5(ntPHd|!SFT#tcXN{^ zKU0*hqR7@@KH`hHjG^Jh+Wh8ZC|pk_{q5ar{=67Ux(rw?PQUzda1bszw9Ta=%Rg3O ztk~Dk0_H{y<}H8YD=`Ha&602!rKZ7r4ls1mSU<(sp507?73YB__RC|kiV=Dm9s$NC zyi_f>#1XR@zIz5@(Fc$5;6E4xE2GS66j5UcQM45lopTt92s*7nKl~Q~y$R4CI6Soc zDGmB^;h_@Os)Jnnjgr@39(h?{oE>BAg56Am9ps3LQR4{VC63H<#7E-Dq&CLq2gbPJ zFk`&Ho=~zH^rI_+qD4>yjvPV}ab!$`{({QCb%1{I@X!Nt^j7%eWNkD-;$Df6q+2zd z7lDF4)Tx^9!li?KPlHnZ#X)&EjO1Q&M9F5Apx@%x=uTh2t1$DV6J>=b^fbfwUG1o2q?$`pkN6u zMQzCcaBpkZ9K}-vZ^cu68N!OmpU|*hC8};|?}^Gq#EQ+(SHI`_YMr!M8lQ_U%+IGy zQ&XvQTG|ke25nx$^2pd&ad^0|ySN#kT6a3VL50yDuEn?-6Q@;GWkI8<2Ug^G2MgaR zhmE2FiYtmj!mj$9{>H{cBr>vn#F>fu^UjQaJQu8_&DK=Gi-6;I?a_SD8TOm-c_!2- z*e#igKbtgl*2J9255LEr2!*m9OLjV!9WVIh>ICxF)o8>K@p>bU;p1lVhT&Kv?KZls z!O zt*E1K;#BX}HJdTZvb|XJ7?6uz)|)Aqx@s{|SCKCmw3-#F66x28YvD#pGD7V$bF@`* zhU!$bV2Njop7KH~lI+fBO~G2$=T6llx$&eO^RT#*{weuZIvPIfj{7aK$zvy{Pn?d= zxl8lS+PbQ*wxd&+tB273CNd;y-m^lMJ)cZULE{k8pEj~c{YpI8qE}4`bO(wIj+72< zy2D|&CmcRK?8~zneYI7*B$qd7Fc&8@ zm}58$WVeQR)R!TRG4 z;-Sb7bo-Gi-rRyhv1c>uy2+?)L8YDl;m)|N!GJZG^Ug+^YjW)!C>WT|kMBlfkSrBf{(_2)4?|j} z>5Sz{c%!;dXappegnB}B{}O)28ju`+fHq&DTbB!6XryjH?G{oa{Yt+rhe?&KkfVvE ze7IJ0I?K^3+-Evc8PASD#rFo+(b00u9%*lGg&H}(Gn~nLg3UtEpKn<+v%A}^W9Rdh zfIGhs&kjdzexK24i+f_#P;&kDV;WQcw2+_i)#ir_6UC6#UtLovts4&0zN9+apUVF% zrKAyQy_A`A#YRR_mXLX>)3Hl7R4p5%S*X|9cH_xe`hoOpKWX9bFNSMyG1N>=zthMg zYNHGV5l%#w>7i(+912xOm_7@qpo>{TG49d-@x_K7+OCE)=xBK!-5f;d%3e~U4k*5$(7&tlA5Pchj zQsewx4y9Hj$?#=gga!V-lte}j9kfBolS)Yil5bVRz<`OEYoDj2l=X%bN(!lLC1978 zwwelJ&elIb7~0g5{i}=xI(o@`@`_i3BUzkU24R-1x-t)5&n> zs4=6w}3yS`(zV86ukw>fI zy_}!OIDM5t`kp6`R)u*4V-v=9l|0&2*gi(`@l}kV;<^%PJi<%$CS#zYvRiI(A78}V zdA$jrp8}6o9pm!@W883p0{Y3rLl3Oj zTj5_)*Q&N;sz*zFBl#8UaS@NQ2&hwtaRX4Kr3KW*Fed8iAHB+5@C$L4J`DIpvBp6T z9Y&5WIieiF>s3d)hTAo{4VG)&uR@OC^{Oz}3R$DcX}zxk241fUbM>lBaA#e}8s@Le z3mB|2V7RYJkwIFCVes}8!CU@JUp5Z+)FqhTt3OpefI}bporAd8fh3nX7rCwb8~Ymk zTR%?Z$gvs=g+@b4I8bKUHyGr`^0=PJ?{#0@18TQgU0?r{?)U%C*fGQYLL`=`Z5^IH zd1UmT)>LLQsp)c}=yes-daGVy)~Cec6hGT zZVj}n`SIR4sK(E)>|#G={~?V^i#U0mEKSd)k2&$g6LQ)0>$}@#OR1X490?e@UFp~p zW(~_H7?wSfgHwdUXmqFq#_5RT9_Qcs7Fd{v{-H($YU&E;CaWP@qlAb5kE(3C2<`*| zdHr99w{&B{LLlz;o4vVCx;`Ftw%VDAdcqkC;RG}kn(1`bX6(ND=FQEeLSd=dT3;xv zZ^dfia4p8a-Vu$>R!pghPdZ}Nc(fWbxGnye*A;P_(W>o_+Vyr{+#4SDM=UOf$>}w@ zlI2jOSqQN8l?~PEQl+v~t!}7HMe31gEfT3k@x#Ybv4}FMn6VQ%7v;A?8f)BQy`RV5 zbg!9JlldgE0*0)SfVtwAq}OzN0HZ~Z1Ps{$0dqM5O@JXhT0D@$C>0InZ7;q^FlPZq zi+Kt>q(cRsi+`oz+1A&g0){k}fVp~gtP{izV$uf8=3aQiaqJ(P3u0;T`z_c#l6nfE z(on6uU!-3t6U&pb3X-xL7T`s>o84$>HnZr@2i^Hh)VU}QW-mlbf&8w8-tU-acsyhc zW~!0iOW+g!qcK4jB^=-jtz64}A(pVv6&f%T#LW%pHClzzD{8M%f_Dh@dyQ6pNVt?W z8m>E6EYIM;Km>vDuoCZQ}=Dvi0xtwc8(8-v%*8q4n^109{UcmGtPz1CZTM-n| zN(iWTgCdGR5fl%S@Ri_D%8Y=5RYRPLTeTOZTcq#u@73C)%mFLEp0lh{3S~-MpNTkE=)$-H-aLv^a4hW zZxJ3XdMjXP-w2qiSNW@D6ZW7BNs|@u1T%xg+<2-u!6xy9w3~B-&r?XWz)KcQ;C(OSCE#-u2K$8&E&nkLHbb+u$*LV`>8h zd47$CC5IvW_|H%J_1LF`+UQ;PeQHLt)u!=N<3z$!V(9GeGFys*7RK>SGDm zAlAImr}x5|$*V6pU2XS)kc%##A$?!SsmJG&>a^t2K(Eg>oUR9FrPj7khgQGe0(+3J zCT8VAt+7+F>n%ujo1|sj#jq+3YR8Z0`JqN7YW8XSwq3hz+grYM!U=Dk_|M4N2-8pW zew12Bynx%Uq&(K_-*9HHfKMJJXNg1{j-0`;%=F7Czd(#V#lz3S*1*b$7&8wwqmr|4 zoT*)n?6jzz%CEJ=GH!1=pfe>({y^GqW@{~8D;%SBzL+K8wX$#4Tp_zF?)Ao9?nEWj zyPeIK^Onp=7|G3<@w_8a4EMf+HP2(sK_O)CSkT&!P_R~NV9lAdgn#=C<`E>XLUFsr z6l`J!s-7YXsm90qL{pj9(xQ8KB9WiUk~a}(6hrKrI}Y$8yt$E7?oGE z{!O+Ox7*;0g?lf7wZ3%F=BsTO`OoQN$09UKNdMprZbG;UIb;N@HR)G*@c=)Y30_>q zPw*@TUT9~t!ph&+Q#hMZw-M}=6A|~-*prqsd6kBvnb(YtzGg;zEly=JQ^mq`CNpiE zK5Jp|tZ6zyo;5vH-#&s9WR1SoNhbKHTqej%>Su6yuZQM?3mEdT1dQ;pcm=)Y0|*%M z(*=z1u{a(rr%5n8r>VlIIZdUIWFI5h6f`g+@+OrC-fyDiuH@0(3a& z0nQ4KQuG9I)^cA_@QrMfpg`m_1=MOzQ_PA9DDXmflvhIo-a%&Nn@GvBvIkPv;i3)A6q~P zADaVdIb<<^^05Vs@Uc0JmO~a&LeVt9KuQ3^&mAxHyMUGkllA%9p`619>s5P4n63_`MtsFeCJ%a!)?6D6KE}IZ#a|hFzKP^k2+wJ1QNK zNYV`%Y;JR)8Vy#i{FpNv3m5!W96-Fj&Phwho>>pzztWEBnf03^9#16_nHjR!O|r!t ztQOscc3fw2S`DcU({sB@&kRpQ5|i-ar&f+*-{BG5GG!}$fq=`htR$1dqmt}&>=Rxy z&yT4-m6~3syt}WTqAbv@MRDEK21}`%%rA5jsqR8H(k?qM3D)!eXeS?S=6%fSkLT}} z&pAF*^~ENRokE5(;Y#^`^i zec6!99S}qk{>)$;X^=uKi>i{?p5p2MgUH^7HHmQUKmHXbsqx z{fNG%(-0yS3=VNI5;cAm#9@ahyQ^gzaVZ4c_XC@w;xb#dS32>+LOYi1ZYTwdsgP;@ z8{t~UgV16)+RFLd>Bim9hw|Rc?6ITc$Ic`z-ne_+{+oW{t1Yz}YYJ{(WnI0zwh@Be z+lL$Xz6GBUf<0%4D~R?*ua_JqM3?vii|BA0L2LMa2le3iGW#|uCVjlzie#sQNwnY? zZO(`*)G7rxuy0=DNDQZ3q0pE~XSAEm1`jfoeMFOWfWEZiNtC|1JBLRHySry6zzVS?~8F^sgrG5w+ww@Gh<5U_1nwV63FLylb?J z%dPlLl-K)f`2e$)JF#Rd9M|a;gVhpr2I~3126x+$<+iIL*viK?IY ziCaA^M#0aXEtqo2fHD~6uG_0|m#m=R+_g!;T})T=GWWsT9-Qq>xWxvXi}Bg2w-Cz6 zlMC5U;7OyO5XL8N(CdRit6>=dj=p#_kjX)41GTBjk)$NU?4LiPpnP(CoW%|=E8zGz zvdIraJ|`vADZ9GihHkPNH!RyGRrSlyx>P`OVC)I`W36)xn`j`TL0JNRT_kk$EBS?K z9+?`l_$KSQcGMcFCP%iG^P6x>S~ce?(N#N^z(k}t;TsznUr3a8&6%Ca;5;PSW%Whe zDZeA&^_m^UPCC<$ncNX~%Q$3oSlpgy%n^$@+_~XYer*A(!so%I@ZCb@VS^y^Q@B!6 zlX(uK6tQxEf!~1&DA>k}5y5yL*+zK|S91hV1=)W_*hYbwc8b7!g}}T9P})urm@^t? zz;Mh=dN;?sZi-1(bfWd2>0_QG-fNg|5STY1X>IPugv97{UJ;|KF=3*yqQPLF4&qVo z{aKo%eX8|~2~2d(6__p-qY)DAqOuu`H&12D#lFgKEj3qnAw8<_mq8s`P@{$x5 zd6l?iWX3BZ`ejd8Y?ttpCtvUQUgw+G55 z#h}=;@l-qNPcIdI%{KHNGQ?+3S<4np%wVv)-sHY>^Ug%rJ01$M??NyXXdv>%{H9y4`}+y`1r4mOcwSZaprsSS0G&<;DN6E~ApMK+xie`z+uuADinpbh~Ni1C~McCO5KV_XP~a zKLm`LV=4ef%P|QU(kB8&)h8K5c(feT!DIDvOa!!Q(FGJm1O%pjl`}!{qXp;x9QY5O zX;9Z869tWeDj7(HsCw5Zr_+zXrDlN+Gdnu#3K%sDRL1PIEKm_E^kW&lAh2k}rMLf) zk49IC5A?(dC>rfv!OLHet&ppOyexulfl0tz_Z(qT>r^zl55{!KVKEU+M7O|n%`1Gg z_Mvps$xgsLz%$J9FkrL{67l;{na=29{^E=-a}iiWTSw(LWR&W>RVXzNMvJ0(Ct~I3 zj4m*VGdd#}Ef2&G4%aY2(KR)|>8#e~Yj))vzSF`a4`u zfC_Pyf_{ZKEjTaC8JG)kMbIhEyNu-d0IqzVpLYQRIuAPU%9Cw6@2)-rQ-qyd#FuYi zC);41&1lRrArQ}l*i>4g_OfN@7Oyr`xbmN$Te`)*BN#Kx8`Gh^?3=x}f4+NivAk!Z zhlHu*gctV<;PR4(ujoCBWYYniTMddo*%mI8=#GOC>$Gtx16t(XaN_L7t<_U)E|ap( z9EdpQcWr0vTfLjveDAU2mN&FQjxD#oZ!;_Qen@+pkHYu=mxRoUJ^&x$1KR!LCtoP*AmG^ZO1sGLraFZYdN^7xnt8U$xnMd zO*oboTu2`tEiqgD_O3y7Io>RmTyRIW3&aUlUx0wt{9zLEagAqQ%!Tolm``?Kn4#a6hkF=! zTb=<9>yO80YTH_tAgHy3LzZki>WaG~rKrPKNd>FkL})fsTbEm74#nfQv6FfqVe(j| zFcxRB+>m94QZ{eM?9OyDt+9a1TL=f@8`eIKJ#8CmjFLawp9|%aGT@~-lT12sl)yE1 zkQQ7M+3r*Rs!be3>C3hCrPBIZeX&$ptVgL;A`&U%>$^Ewy86y;cV}IE9Z5|Ui<7C; zWU)AvIvwvL=;t>zxW0DlQ$HofHo}P2MZ8nR;;l#a{R5W!o+E zJ4ZXL9SHDV(#)|Twnuc2GXHQp+}q3kx%Zcr&j+C{H|24cuhQKAf5C%sZrjhrPZWSeHvyBUXFFZ+94nhKhyJ zXk~l1v}NPQZ542N8sta|;O-|t(-?7fm_)m19kVSbi+#HKwXz39l&I&RE*m=iGbpbt z9XxeXRlPp*eDnBZ9dQi3#Z^rdN5Y}{Tyc0hWwixTUT-1iE~j@C+e-ysHI*5SS9VTY zvY9T$Fsu$way*-D#VoopZ@LzwgssWzDraJa#d>nQY_U{kD$SiONa8Ri@k6YI8U70H zeaB_?FmpDONoTe$^ChXE-eX*JtqnIJd5}N^j5D|w+{I>ke`2x8?b~}VJ$7rGeYAJl z%j3=7W;R&G{4@24uaa|CeQc_?Vs@o6uF`xvI&$oorByHM(XfQ35?_8S zo$2Pi_OQpzrf2WRbuO{)mf^XRumNRh9pY0D;od9J8-rGrb|PV%F4~rT==0)IMYS#@ zS%?|*_k7{8Z0pZmp_k!m(%A7-7_29J?(-3>3jj$!@4bc37*z}rA??rZM zbhK6To$|=TC$23l-Sn<^Zz7F31)e;Do1Rk8{|n?ZRg9q#oiyznT25=7Z**5dUrnG% zXjNO#m0i2snz@io<I=MzgkFHt+`q|(%e#; zjWy$eN-l0P#d4)Uyp>>0b2OQ82TS2lF%Upvg}5}&*Zf@Q64ZVtip7?70_)uxSZ_YH zfrunYrFx$bKX}76M8WcEoS*ayJo#tp8)FqLv(ai#`ikROS9r7>Dkq%oWGRqo7TrUh zawlC_+l)lfqcyp^(LQ;tITmeVg>4p-vA*?`7Q#Xv)TzW9DL2wU>wQUgq_t44ZtTYA z_iefCqdVZ|t!i_NM7QQ)4thzlX1znpQR@MHiG#&XsL<+5?_o9i%WA<^=mZQ#wR*S;+4baB6@TwyBwbk0Y(ALg)7gp^VvRp0_OEz!6$EAd6~V7U5ZZ( zDxM30`6_k^J~67FT!hTxW$Z2Z1m!?{tSj-teOKH%T`bn4mf`R~ipA25$gWIg9BsFYr0N%=zj4!#2ZT>O41|99dlo(KH-{CCiZ z-`|LTe;0=*j*5T3O1=Qk6F*m^i=^k-W%8x?owy150DmF>cjD!W^k)3~74l{Hcj6>H z|GYXL_=tU=(#O4;6!OSc+&aT_UfsS3xi*#7GcA7YJz5w0ifTacR&|m8eGfVw+*z4U zCZ{XnYoX%Fg~K^dg`M>6?30`8$IZ?hH;h*3+2iW9?Hd{kx!giy!**yAl_R+G#y@9P z;Ef_7$1Ub_Fd5t(5l+l+ciQ%rUS#vZ)M)QgJg0IFb$i}9lN68V_nCYu$@J8!s#JZL zzFPp@s`@aQ%NiTn5qHw-%{k1t{KZ)CFV(W+$>{KG_8M|uR#>94rqhZ9qgE^KDK`%3 z6PZG!nMsUwCsOcS;KsB5ioq9!jV^n=9#6JqjkWe=iI`{Fvt;|oMt2YNT!?q77Asj+%AChLD z8*jKZKP89P&v@FXo5Up_?G8&n@OX7>>{I8zcv6nBm+B{8_aSxukVsVi2kVU*;m z9*vG>_jwGefPgT(zLeLo(m87&HwNkGJG=0fy8Ql8kd`SDq{eTz=zg+Gj%i;r#4|vP9zyp5`4_7@e zPP}Pvw;7*!^S&AEVs*bGQd5dH)i*yp2z(# z#gxSqO}R_s-GV0*Gn!Ba7JD3WXNC)#@+6i^Ffn8Vz&qEcE8OX#-(_DErmUW zy&Z)IzRz0~{$vDq z6Aq`c;`t*0ok2s&J7&);%Mst-TnkBAKLz(9we<~*HMFHqGQSU^&1z8nTVY0h$N z?(O-Bg3lgwI->zo+BK1h!O71yqu2J{Lu9c_{_agwdf)ENWHaqz9=GP3Ode+>n(!4P zp-QP1E=4)vAcrV_mQ(J+89OMgnTz8%V6d4z9;er0G#V@xLog6{l?g!q35CLE1jXE+ zMTT-Ps%jbP6Tbf)@5$F{*BssZ{egsTNPhDx#ieu3dx8^&mpgE}?!&ojQkp@H()3(x zZgzIEJvur*J~chkY)+1hOs-wC##8nx+2P?V@fAT{gevHVK1qVhJmfOqsd9Nbf^Ozs zYKCdFXSy9E)>+`S(T*z$m0-5%o#t5FUy6m2Zll#_cP8vH&v2kR5)Fj1V{Mk>6Kt}h zALA1|-|fz#1;lDrlvuzYGAVh3!)-<(li3#YI4hY@)@aD5a-H4{Dg(~jMI3-7Utald z_-yCHoAJV%dHL|4Xx;~4pcVVp-htag91l9BeF1Sodq!yKgT32RE=aFM{M>xMUgQwD2d*`0{63gYqa!12 zNeA#1e@TbmxpFLP;VF+~{;c%4RceHvB%L6F75zu;@;B1aoWtixg~MfAr1-ITc*6I7M7&y>{frCjOt^W6cEOm`!gX&>~ zjidvD$ljN6{NUsQGp7-lJyHTWGjCXW+(vYgni-&!j3e2G!NF9r9T8W!9Be4+aI56I z!cIg@r`E8C`UBJ28Zna}a83pgJqyiQf>tYZzh31kZA2b>3Jgr8eT1Las!abs>i74m z-?c^PFGl}6=1VJC!F?BI$ZCoo1K@*H=Gv_La6MjLWZ)CA`2#EnUm2HE_;fz1G zN@TJ@M3%-tWGyj3B$MuEZtSP4v7e0hLAf*z+DE_d@0rzBE9_?J2W%U=1ici-`*7x> zXW)O(0`d?&ZI71&g+Q?2$Japq2Z6jln8(d80e?O~+Mpy|%)TWDk!Oj_Ib;e%DLS*s zq(>1a?d3*`Us>5L;7_2?Hqc4SP`GaN%1?#waBg*fDEx`bx^K9+`kv03&G+56G(Ga( z%3Xx@iIvOPR_Ps*lQQ+v<%Y= zxj-j}d#a{$ShJ91WGqg>2}d4}fEI z-o_2r&}T!ei+8^CzCOt&%JN4O`;RBvqe=qK#n@tel^((>?c%HCTwNtvBut%NLQd!4 zS6`)v4q2s(R^G>MlYa&+YrWrO^k@{R7d`|is)y1%_KuwwuUmV;4$ttm@kC-`NBhje zRd*hD-0hd=XTqCLeErzi>tC}aLR2mT-+NSi7VCh&Ngg4hgm{A*$>TMi_Kt}}Vtm`M zXU7F=*Ij((RAkF*2+fI`!!!BIZ$Iw1JFfz^&dTlVeez?7e+6&@mc?Q=<5lH?MwnVU zvr@cPT#!c9T`*t;l6v@TX}vFif#|4ez$pPAv2&MBX(&2hG3NCoN-fh&(8h2x*&Xt2 zxKYA-zmD#}5|S0bE8nOk>?#)j>CcXn|2nn*vhjnUhx97(U}lQ9P^Q=&y{@mrS;_nOnv#>8^6h0o7FxHCq*aB0v^Kf4uE!IfIrNG3>`eXyaGC+} z?4b~5_VYeY6$fylYz||nPvCcyUmRx4%*ws&X}o1-fXV=<%&^aFpQg9#-MMlCyq?#? zADxk;{r>~)GKEh*AiW;aUy!^Hp%x#CDg`&A9e$G9D9O_hsS3^7>JRW%Jw))PH10)6xb&)oL`>7 zw~sJFI7HG3c<_@))9$!N%JB0C{3c%(cNH@>vsTXO&>{&>J|Z0{j#I1FPTB@cj_HJlpz=a}tr&XVwxUhp-^O9)3w(D1U#pJ~E+tJ190q$2nbJ4@5yd>SBu%p~vYTKiZPD_^Q#5c_BW?(snV=>;xseri?gR=%7T^*P9^B^oAt#3GdkMJ>6 zZaOy9wOABr z&j5VNTb=3AO3sZQ@o=!S1pZYezw$Bp^;iQlJQ%B99zvu-XEdT16kC~gkBi&JTql?7 zFy9b#0{axZt9LwmR0P~e;Sjgk>}On2EZ$aJ|k~{7C}WZs4C6jx&R5$ zRhtp9-=QI$&V;-@_Zi7=?EeMP6e1wx{lD_-I&5n6@7E4p`ASh&f2BBd{Q_;Jp zr@u5k{Y4s0#(NeYVLy;Rg3)S}>&{6?o<^91&XZ5I@jp}$$S;UqlYVcWqa(i=maSYfsnh%{!ip+?a@65lnwUVe7Je>%7If}I=A z-dOdn8;j};Mw>ky$gDeMdh(RTyc^DV3n~_G;aPbI6)f})=_*b{=4@4xs$sh<+sWGT z@DEp#8C=({b;G>MZImyLyr$XtUtCDJL4J7uegEiEN;%Xk<`IP1`aXN_hB* zobC+ZE+^e5kH6jj4Ie-GMDB^#K6pq5J1f`QscGvnTRAXxW~XU6OfyB!{|uO153z4*alcQ``PdN^8(;(y$3M7*6^ z`MMXb-6?1^h@JqQTb@f!#u( zBLcm@%g%NJ6`kVB*Fqx;nc`x7j_FylQ+HQ}*pSH^j5sDXWQ&_dlJ%gkmYs+fz20JD zTJfZVQ;J>Z4mp&cxGUq?+;mBgo2r>?GUOF+(myKOhs-XkN%^w7JYLSNZy9DU)F zNklBieo6_Zyq*+%ESgo~sa_}aHim6H5!r=6bjZIG0!A-c3S4awGPp(6Q7aZY@ zay0EO>KjzK<25Si6~jHDz5}ia?PnasMB7y0eU87%lC#ju5jwL$>VKFL>-&x-u+ z0uE9mxYY~a)V8y_j&78oy{m(M??ZAEJ;iZZ%mqusKqGjZaO%n)KS|%oUv;&dI{E*A-FnjWor3s5K z>YeCr&YL{8RtOgmAP&5P{an5sU0>*eDmxqnr&CJ%nRaagZwnEENO>+?G((ipjcUjs zz-I{{r~>&T$J~HGbw;tvdqPE5Nf|P_ot~IS@n4A7-WS(a(_{V=YV2g2hpu7`==2v~ z5!9EaKjU`IF|*YapRTgX_=yY0lq2D_Lqk@N-4I+ebJTe6=?%x`VFeLcL`41^H1n^; zPjtW4Kd+oe6^2w1_AXvw2+f;;U3ik)g$B>sRVunLLxLnL@k%ak8|bvrw-3-Ad2#PU zz`$35S7Y!gB11+O)Bbkcy7BA@mKd3t300;m30oe;Mu}D-&?qI{wXIEmvEZ7$qI#k* z4_j|MdB>YJmRt_pDqT~&p`g=|nb=(5q8}0^E=27*~*wyob#Z- zYbfHe8cjN#C2Z9#M=i7^cp1?6IEtc4FVNYc?ZZ*S7dXtj%D=MG+j8_VhrY0UJ<8=Bkf&64~@|ZE`Qc(r?b@(_6xP+4|lu0OLaxmmlo+1wd3kf{| zEvZmMq<`NDjf;~j&Tr6^KU$ZXIia;KJlSeahIGp2+VQ8!qx-+be%(BMTknHxPiIr9 zw6WcL#Dup#von@X?_g9rc<|qx2X2WfzL?&Pl1QDyZC%EDN$6}L7KV}^m@u8f`ixR>ir|IZ}e?$G?(6kBYw6Ayf6vowVB@Sh+9RN+{JmvE}|2Hcb$*|k&~ zulfC@QWZ5lwxX?QJ+)@5S*>S5jn1}aaceK#+>0;7@k`)J1f5?cCmj2bhja02MT!XG zXy57Z7N{61tp+-vpjx1T1~Vc&qy)D}jd~3vOsVKZ^b%$mwmc6#WqhNXnlp*`6mBs5 zT0CQuhepf{ughjSyUiByINim-o9{5*&h*JqUkn|eLuOOZ?etqreqXs7D27tQo;aGt z3>K5i;&X*!2#Su?doLyPZg)Q6l=qhAi?yY4?`ziRMEyejgjqHi9Ik-=+-w2WpADyr zIfj1`40O;V>b4>2iZVQ>!(h)Q0tuHtROB~q>2)@X)oHN=qu#@TaZtCH#OxN8wB=V^F^<^rCSv z8$x}+dn|42*V~-Ef3xghzuxZXJ#C8}@?J~!bg8tXRO(%RxEEZ4K17jl!?)ObJ}D_B zac9R6_Maa;%Sr4!+IFHc5Q{HJYx{^S!x2dGoOBWk{^n3RJTo)r&&+)AaAYX(uO#+u zP!Z%k0ieN)+UEEbrclTl)-C%v4d7Aur%&=DEkv&`8=ZhEh5Ut*^y)S8=ttgGQg+SN*0Z7*7Bt9G^Oy;-ugw%n^+WF%L~ayKq?e1r2Y5-Zp(%ITif-f`Z7Nfm){mFaZ4B=e0PeFKzy20sykH^DD=amH=>bBvwmJo?2bDi3M3h1+x;i0cl__Ph z5@2jjVYywWA6KK1aRg|1Y;K9UsMJ&F)M)l@#j*rbrl+Q&%wY|gb8>2OjHPuocE>1v zqpf62xwX>QX!d8<&n|W6)Z6mB^^q*UtueRK<}SxHWri8*W{ur$G#jnM_=`!3V3d@t z)fq6F)L_z8tJ!SS5O;-Lk_0a}EVvBuRgAq-k9Z;$bKQcb<^{He)wP|jt{&!%Mia+Q zIqXS`d1=C`O@gD-xXdNh#&WRPNW-&X4mMa^b{tJ?;0Ck9s@ZH-QLM3i7fq@PeN=pb z&xUH7I2Ls%7iY+v{I`a)T4g!mI{P81$0 zY^Y+v9wb7z0R3j1w7R}=)%gCq#x5)`T`>Nx#6Fx`uc=)=e!|MeXvy5s&9kG?pGV0% zU?~e>S5FtD@p@qmER|N{T-^+er)`g8v%JP2Jq?3t4n_(l8sgTIiUNHAMcUu%?{9hF zfz?lre&B)8Pg2X&ywI{?w#QPCU5LieOlp^|W)HJ}Aa~5jGL1o};rcYLm_X6_WCy{r z1dOZ5Aj5W_ySwC^bINy}Q?d8ltM{E(a{j)u^Up82@IumOCZV2>aPsYv4Xpu^+T>t+ z3^>D!%)5|PIi@5hEl8PxlT&`fz!|sT1PvVWV6o)pna!RYGH2d^V;wxXIMyL?$ZfUd z&@a*pN~ME<(=#YfhglMhR?Dc?Vorc4h1d?-DOk+D(W75ObIDGS4_LN~G#QZVbe6SV zk9FKg3+sepnE*2($x0oHh5iLe9>&fsPP|l{r)0_7-6#L-VpEii(Zr}!4hpM>9mVpv zVnh+uQ70D2c%rpOu?gZHc3=7Q=lUnTPfN-%k}Zcn86_11o7c!<-bzV@G*G0p?3KiP zb}texDgS51`;+>gL)$}=8FZ9A!fL~$J;J(znWE&3hElMMHO(Qm5P962K>%4d?$&cB zJyel+zva}tlxmRy>eG(9s!TcjVZ6Gwrc?Fr7Peoi3U<&en#%{UgFyZgvzLpkH!zAfP@E-I!k6;bj z0?WV3-+94wKE}aOT_TM{aIzfD}P#A$I%R&K5#rGwkQU zo^rCHhOx{az*v$v$y#qax8(@pEru2G8pzEw;6K(k;IO$tyo7|JITvezwHh{wE30mD zTvXf5&Tuhl!2Jl(k3o8veZn3A?G$0%bwSL6{Y1LzT)W2LvseuE8cl(L2#M?gU^t3# zfF@oQ^Tx0xQHl}7p&b->4l$Tf*Op^ihi=&?zIs?B+&QDL_}}lZhZ{JzYg9N??@N4Y zi@L0NCR3i(n&&=>@vzzJ&dSQkGuiU8Sy}$5V5Bfw5EvB>BWX!t#6K!h;IsJbHot{V zzww*1eJ&hJVDY0>S>OsEVZ0_|jf0qp0>uT5OmY#iRRbH)9569h|Awq!WW+Gy6dz^! zK=@gNrM@7CJ?s9gbQT@SG7Em`$YWhwX{ed}RAc(Hxzz10ZC;(rzL%Tm3gS&^TXQhj zOxMxDx|}lHG*Q$hJS?Lz@00-(JHWrh+-T;bP7_&TQ5&cZP>pMawv3Zgm04h?T?Hha zqk5GsXf}E+IT3rPwbJI#%JLhrMlsxaJWV$yP3NvF;oD+!qB`wpZJM*O=Hz9gXGI8u zutEoCINl8jh!M6#L+fDB>kR}lGb}Wi0MgPwE&X6(sW)so*#1>rhMB*inP?hXtCk&{ zHa)%29VaCG6;gJsR$=v3a-yzPvN`IBo+6I!kHQ#z{GT{(Hu zmFrtK&T+R+aJHS<(z%U%Ao-#7{t{y=Eo{eFC6A?<>2S$~8i}P7=0;SDxS$myPODX} zlv(7V#EeG{Uv&+?>Ev~#Wqj?)yLs^BduU(Xz&Q3}V19;VI;h8N6Q)%qI)IoUY7UT1 z3PZDyxsF|em2{K-c0?}K=+iV`f5bmODJZO9pdFm>R^SV`hF;d`(z(XKGO(-}IuOJM zhQFdN&RQ!m+ZHg{H(=yUI{2xk?c$EomV{K`u|TyEGU>W4~d@ z3gcod-I8U@OH1=ui*xMx4ml%Q?sk=i4D4R>y$(J@J6km+i{R ztj_g7%;yBn*?wnkV`D=e`p`#fZ}@f4@fyH&GHo8Vxja2>b2xbp0pS!42MZ#^1+nW8 z7I2j?YASo?R@oxC#=NY$c@;)uQ&vXPhUxX&H!i5H zFQ497oD+6t6i;Xid*Of{c$bTvCdc?$;19I#u38$85t*eXKYuhlJkoZJOdIAS#GVZy z+esxBWLnLza|o?UC6DCdRxv+}(LZ#H)4UgL7rI#)>ugMXpJjWoqp8~KtMYoQ^RP}e z%W2MXWt-f;OFsAIRr|9X#&n}KJ=2k$?c^IzUTp|AVX0^+)C3k9tb(sH5*fkV+biJ8VKMT8eN`~Q$8AtZN$~IWlQ0vO+EA`8H27-PuZAYsF|WbFpVkm_;yA& zZjA1vdAv#N4e+@Z%%k^0yZ;%UEM?o+b^LP7>7B)CS74K*gQa`|I5Ie4I_#-H3JpA} zDB3CMrQn3Z=0)p;p-Y(G-dg;m|I`gd>pY%Snpr} zhdEZ0j(liX2cgS!1!1RLP|u8P&Y?6`Y$|KYNyKkrvoWt>O1zgDPdtKrOvvZA>`%zY zgMFxA%v2vqOG}b)Xo(`X$O48j0?v=G5180gwHA-F$!g7rqZ*|G_Ad6#DD{ysZswW`|_~ZdT3l;eA^mMIG zuZIgUTDC#UNB|uACwrI~W0nxA^>*vps)rm;7H{PX6XUK7eELa<_Q__TK5q}!Crx(> zd|+&MY74ARjFaC^JbWlE@hbulYhyN4qlLeCyG9aIi*`F~ED~s8sY;2#%G_b6!G@95Y!I}m&83ti7rYBgbKWVrl zdQh!qpn$bJ@K9t~;^eBxLk~n(Gi?w1^Fhb{s@$y|U|*fCJ8zHIHwo|o1q|cTuq1I!lx=Xm{<;hK z8>Ci1=IjxG$5~kOLIu!F z%pr`q(X`9nU-OdZ<+ag$mLDD7%6BEMp+eb&#CNGlYy*{)+N$!HLuC%S&rcDP6CZF+f&WNV0UoI%s70XKxbZ-e2<}L2P~Eno~>Hq@&-{)lMHQ zJ)8td5)`jLDEffXONmYFivb@b&Y(rbOryXr5}O_&ZmGO~b?`kHwb>jn(|e2*zn6?5 z?LJ)$o^|qX$r!BUv@s5!96uQ2cc+UXulxGCWDMSSx)_?Aul|^fAvc~j#*1Io561ZO z>0)SmPh3nfSPA<=K1~dGE>LSKH=Ythz)NmS!b@rynM1X?C9z2qq0~a!eQJ!|!($vi zHOArLF;1Ks{v$EEbXR>gFI$wXI5ZBLFL z!bG%Lhgj;$DX=c0KE$J#{4kX`Ebg!z1BlJO5C9O-MwFbAX8<`89Z`+~`v8NHuu@v7 zHUhkS5SnBog!c@gC5WkCv$@*MmBvs7m1+)BI9f!tR7*!(wcTpjMUpvj3Hwlf4YZ-G zbh1JVpmo+EsQ`A4a*SkXl|zfv3JcaWcpaE4odGM-QfT_Cq;=9p>~Gy6oh_XUUqTmQ zo%faSQh9@Pi*$!{w{)*0(HyU^>Eeo$IsVW7Hdk$}+E$f#6JJ}a5@r8^yGyFX-}3+5 z1=cp6IE#HQzxV&|zT|E5+s_78kf4Ts{8 z+|j~c21SH|slg?&0Mc9hJYkK6cbYUw&#}as?8B;e8X0R$FkUav z{q4Eu0?$2Xy8QAhSd7-XC7$m1^T!{<4l)pjd>qd{Kpr&DixGPU77t_@bh=Eee82!1 zvX2~+(RvYR=mCf|tZXndsALnbXU1M;ygtGCwa7%@dvXuo(|htu{$(#r6`XR$Oresq zIpZ8`l%9kMb&rw>iF@&{WOhCBqHw&I>j^3+zf>S1^|FVBra*JE28{dRgh(+mL_k&4LxG4!OoXaktTbaHN>$WHq04F%EKzH2hUNm8ShMX}S(Z%r zh*75?m2s(9&@~KGlq^Mc1~EneDB0O6(hPx0V5JHv>H*ASXJr@$3!(w(5IREF74Q-` zBp{~dOH~IhQnsKyfl0&ql%;F2$kULOl?0!_b3t+hJb~v}w>m>x^h4<#R@5gHt$ zbqO^op|(h=QiqyStidPJfGL8YLu4vavV>CTm&3~hO{@k*7!RZk6{$iMDfhm?uYDs~ z(_}3-BZZjJ6i7SR2YcUO&xoieF)CNuvl)ne7AquV@-maG zA}Th7Sp-2*OC^Ury~!++eg6H^!H?#61Lh-%&%qTxr{)|#e)4b`4`mQ5NNkd8 zs5+_eGd%{UGK1h#+Aq)^X_}9}p)^9SIeB=f9fCUw=wW$DO8pe*DK*5ZQ>Bh-4ydJ) zg^&z_BhyI8hSd+lL_;zUf+C5TBqYyLrOcp&Q829z5{4)Td87&EOcG1r49&Kyu*G_9 z0bf1%8Uzbd;iRO5UzH)DqF@`!rrHz4XstJ(wh1XuehL2Df?ZMv0pU}4CrnUc+|{ys z_wED7@kjD&?|_eO7B&;HS5R4UB4&*NVPY1YDvf3HHGbQRm< znOM#_D7~=v2sKFdLUJ^0TI?79qDPco(SUc{ie5P^`jB$+#j;@g#7-mfmkC~?nm&c+ z6$P1;&Y})Wb{ge{Y|`KXcge_a;!j6Tg$^AE0-U1O%UCCQfW0-?8dyg4*y{w_qyh%? zrXtK!2J^Wa>o?VJR2zaE_9l*?6*sG`z)n<5u@E8%?mtvv!Z1|z2&+%Lh`FSO#Lw6- z={NN?ynhj=PWBKmjkE`(5QvuSW5f`Bggs`Wk7zPUwV2x5-Z=io0fn>$k3*{{N8;Zw zA(I6@85c1rA{bl}$3?z_HWS4P1iscRxY{170$4rO5_qQODR7taq0#j@HSN) z8RCjWTZ+U{cpI81lByJq_NCJpWJn|kibU%ank1c{h!SAg1G-eX5mIF!mCk@8x)o_p zZ6y9H(uwkvlu4KhVXUSWwS}*KbyiNTD~+oa84Lx3`U2%8Wsr&!RMQmkP4tgcq7Ow6 z9%v?^eHgrWcs+-up@GdQ{Vt@v5P3r>vrgASH6?mPNaQ!(NXldaPpaf!4Gw15pQg(u zB1KKHLtpGu_tHtCN4zx?3fkJL7td_;^;Q*3sPXpt8fPx9PK*H-DN+pS-HBED`#i-&T;xRE?GDl5L2no>=q zMjsI$F0hjEmGVSM$s&k1pjROuPm%LSXn>F^=TEDpgR&GVR<%qqqENA1 zWrFgcMGRuqDY~|*`A{{8r2zk_=TmArBGm{z(c5b9fNFgIrQD>yk7ic6T7?bV zX^J+e5=|{lNKmRLnj%KCgLNed1KE_cGEq4s1*sQQNthhZLbxOqlca1ry%bd_Op*AY zF)^G|1u6BTqFbFtjwYd_w2&DGMJZAN7f2G2#2+C^ld075)Ruzf2r*0}PbKv?=_fET zCbgSqRNZD!uNkZ>My$|I6#gn8o76@_LLXHWQnXR!hiYA6Mf#uUe5v{g+Dbh`HbBD2 zLH#7DH=wo9#FArWRp(G;zlzT^($&l95P3;rL8m5lV?ky1HenT0Xl5AQkj;>+DOkKP zlzezP_0GQ!Git#uO@6 z3l1|l{1c-lC8feiQ^#0?usWrj6sww2h8S%Tl?yH=S}-&!qx>m%by${a6G|DC5hMlg zQ8|xXGsJh4Q7+m%$kmf$Glg5LgELrsq@+ci=m3`26jBoQO4SxG$`bZ?AwPhc=s`W1 z&xu#{idIk$3UjBcWpJQOl-ux)g?tbVLO-s!?hy62emcCDNw! zCwwBtvP=eT29Eu+q~azZgAcM996%sD8k#8vTS3i9doR(JpfBYzI6nf|DONB&w*3wX zm{YQycs*qYx+L5`aj_WC(rkcAsj{%7Wq`~L*f*oFC^Zl2Kc!lN(p4MwX=D%e%xS4T z$>mZ;#exEdIHamKoFWaBlCU(Lb7{kqj=D|VWF?(`h&Rmikj zGZD^Fum5_A_F7+#FUOtb%nsywd?GESSHp-_*JFLoENXSMVtm8YG5?!Z(@uJ2^9Swt z_}{m>&Y6?$_L)t2xmh-A!}9-ev#UJVtLDneAi(+0OSU(8#V9N)^r|;&v`s5xK_|(B33pfD?1!)5Xc99MK{&K`p`6BAZtlT`) zhtneAo>Nd-8g}MYc-xCL#qD{Od9Fx# zS;Tc>=JG0y#UjHy1Y4S4TNExRZNg6Sy!!gQ+E77LX+gNC78|N%;F82X<5RHPuLvHL z;7OpwlAWDqx968vR4{OVS^%zaYntN3Pg2ydb{Ko*K`e@|2B1&M*1hVK{VH&z0^bYH z(1|6o-+g0fR4_Oy6pa~;EzuD6ur-CWCVb(sX=BjsmzSJ4VbQGLaWx|0bx9B(@is50 zqzvX=y<@$`0?i30LtrP`EGZya_vg8@4h;JMjnf9gRhSiek+~wbd?%`lDS0<;4nec(9!k?cT^XCF+* zx_k{8dxXgpj_YLXF>sEN+4e5S_<0LTZydcaFs8ng@9-`^aO>XcAJ(iZUw_^$B$e<7 zPY*k>@4$k!6zK+JlqO^iVL5rg(-mO50S_EkmYe;H%HDh1!ZKTIz1Z=<_Hf3ast){fc)EN=(I-L_H z#4fvIL3zjZ=l^xqcS7?VO|xn;8@ukmr=xN9z467{S!BO^<8${-rW`c`C%K7VjaI`O z^a073W`lbxWge&=wM4F3CtN($J1ov+OB&a%-O@Uxe9n|{vDoKj(_1PnoBZqMr_F7< zbl3K#Sw(YZ&pTu3n8u54eWW}3gT#A#D1X`~_B!BEC5?e!Hd}+Y+HN-6z4(`c26=Od zlukR_23^34*%I;*O5Ubu=NPujV0lv#S;uha@bi8I_al)Ifd>?ugB4URomN^jvAsAv zvEJWot;~xwhjJU+8~x2i`LU|J{L#~J=7rnipJ;Lh9ESR7k!VK2th46L-8nOo+tA+d zQ3UR`n>pX8<0`ba5`UQ1Nay41n4{>4GWdv?A%$Xg zR$c0^@fpYHwG$ok=5lTN<}!3s3z~+;QRiz_en#yQj>D9Val*?!P^%tpnFu|cVRCXL z&Svs*<-if}J+X6)-C1v|8xts<6tx7(b3^&|NL6lOa}ejHxi*n*iIexnX1H^V6BD1f zildfuZ9Ye)(dCO;a&3k}oJnHM%FXP^DX_}74Rb3j+xGg)! z>B^F|ywp|@u`YCASM5WY!AR6*4|%d#OL|TqWD1nxY<5$m1ehKhIEH>I4Ds)uTtqlBcHrmmgnB1V z1niN#F^gsLgc-AQ&hQ264N`T4ZKfqeNg&cbSvZ1%bC~4Oh2l7R6{70SLd7ka0yVH^ zn8s-*sNy-r3S1$twkm*~4#%g}3w<>>N+%;b!M|X9K(^d0bAGAU?Dg2wYz^Va*aCYrw~D99S#E2lJqT|%E|)38o$I&QB6;bK`e2|T z>SQ@Oi!0mgc39K1c;$#rx+t7uZ8zqZg( zU1Y`B!kD4e8XWmQpk}Vb~o3^LOSc*rEq9M>5A&X!g6$Vl^O(xD_4Ao-yiGB6_cNgpk zO`aAgYBtp)V=LUU{Dn1LeRbmb->h5r8=|zGSQBs&{Nb4-Kd9C$J&nU5r~qIKq|*?t z2rXgc##SbU$K*S(`CGX9jyTB6p2HTh*@A2{Tz}_P=Gzq~;PsBM9WKG0`3@Yn15WW% zC?)y)ps=!{62kW=Jkb5E#4(BU10?4zMU1tG5s}*`!q2GO{v65D-wv!{x%@JuGd#*r zPp}u-*IjM?ZR-tk=<9c>MMH5g4txyGG$0L{QHSmH^@^H9+d)Bs zXfV8rC;5O6TmwgW%{L;%v8&CEt%N_^7%CTO+- z9r*@!T0}-$C>M^39-Pp_jK6_VkqxP1A zaJcAAw~#y%Yg&~p?h5Y&pMgUU8l8|Bx7La=sm}iO)D<<+akHaiS2ibZw~a4|P4{|j zHB+XTTFZ)CY`XCqTUr)2=Qf==?Iv5Gw%qKm_cO;1bI@y}`3|XK;0SvTt2N2Sk;e9r z(YFe2Mo=!`0gI-+qMX%MjJtT@!izyA$rZ{zoR?5U_Jn9*p&<|o*$o9gN~u&@L2s)# z9*evL041w|eTqEAY%+Em(h*wNF@PGrSKZ8311$HrPTdUXMtAM?g z82{cucIH7gIdOehL@Rr!GN%OyEDMzY|IdJMqMox|?J>8j^Y0?cpdI6=N&05OwrO`{;Nio-xBtd_@Od1Wsr-BmlqUe5O)zw*jxa$BY5>1WgTMQ^z! zI&I%=v<33E=c3obwp zR;*v2`10YD61d^L_t@dYnFkLht{v838s|vt3;4kxtETmFxJtsZT^dEf1%~LqfN-Nx zZI?j;?2KQZck8eB_V=^fixbO=@m-9uu}jjkci2nV5j9rqgX+far%ACuaPHjnWp;aO zYx=sJoXKW$dZ?{!aYaRA%XA_7L8qaArYmNMT9P zGVEBkS3`$)i19zRVkn9SBGh6-hD~8sh_7h!*w>q6_V5_tL`KdeGeczfkN_J|+#XVb zZIOC+vAd=QUl=&l&B1Zb_3omanwp%VaWANxDjf&w&UrU-&;n@s620Hmiw_XD~JS3)k@m;k3tui~&(p= zoe83op%K3gJK^Z8U1NQT4?7`fBZNYVID3#x0C3DaXho`qEQUiBVPHyw1Niz#9jqlv z4;p279X(3c0+Z2!v!-pf>}+eU$J$(;R}wVk(z${eSw6GHYqjKhEG*<@E@4xsw;QvO z(r7=+?Fr_%Lpf!2raYTN95JXjWaPRWzMR~MM^JaEl&*b*Ju5hgg715nBo-7@zgi^@ zU`e_b6Yj-^oRhN)2OX1Zp%D-HR3~ZckZNMCESrsMnQS*@;#4HN-fT9BE-{H-Aoz>E zpq>D9aDf(xBuvN79Qq9Ej8xI~M=7a5r+)oK!? zNU2oaqhV1oliN{Ao|wiSKN&-16*p;#-=nUH??ZM!G;n}bNwi)A)+a^lbwca?ZONEP z(+}YN0rmn5^E)6ra8AOvpKI`oT$3{k4hcLsBi$NiFSv~UJcAx5ac0;&;XHdKI2V)l z;_wv(T(wQ# zsE?n`YjFg%Xx72e7`e3&zsos-R;$*uJID)P$0 zE|bSh`8LzX`Y`iNnR4VEynh$|8uL+; zl%B`oe$_00(j@lOJ2c+e#A`4Py9py5xCg-fOS}+gT;NO!`C4&*Gy4j-aX;>_6Zdc7 zzDL|&FZ~tq&jFm{fODFBgMeWV8(>%Shd^zxQR5h3EN~(sgk%=JQb+|+ytZ5#z0`GS zbR!!GUUpe<1M0dOBd_auTuDjRV=c^{T9Fd&KZzk&No5HYTm@e;NXz3JHXtohZsj@b zDt-ktd(6ec#gKjvj=>Oy2ZfIS>ws>s9Fk64#}?H%rj(aWan_iNah_`qzrs~gQBmRw z1&ls|z&&77i}+(`5zMH_eFYx_zm5;k{^nQ)vQIbd!Rl%|m4I3ey4n+k2;WM|sguW>y-j3LJslJd4TB@5wC+D8BZBWpt&IlUSW5-zG}FiDxj-GxSQ} zW7-}kO;HeEgmXADMZ$WgNQ&e!nJi{@K#ti=maHsyTG&$PafBUwyWMHBTXmRLv6$11 z#!OqpX|)8Xyrt;NKJ;Zo-t|0)7m3VD_4>t`0lPuXk;1O0W*MhU?`yqDAaZ;ed1H@oc@BoZ3&BKlg zlxx+q0&T{@vjQ2rjNJ%NW_jSRnU88UdytnHeF*n|bS4=4*cgqPj6AQRDW}q3gVsGc zu$~16-jsCm*#pNnTt0}I$i13%_E`7E5_6G8p@VU{Q#I0{Zh=Z9pVg2YGALQ;x` zw5Zp-u0bZ1_{#_;MUedAKodiq0K?ny&7>O!@>nr)r4_OggDOY)YIS7Yf=LylGO`dm zO@XSs+`0mfJ8bhlTA_7@-5#j^W?ONQ#qLF}Tj7=ds)6TG-}6x4dOSIMU_QO+5%P zb^>ha^upUD+$0iy zB)JQDp2dt2D)I{Lm;j4#4y>r3$G*BK3bwn3_!DR)=HwYyx<45+5t&!d4LR3E ziP0qa5sihwfxt&}Sh6Nun^spP-C`npoQvaR)2cdJ1|)oOgZG-Eix5!OE*MzP7aR=h zGBEWbT*n|S>cwazQSD@BbS%x^>A*4NtJZoiyBujQA4P`TDN8n}t^3bZ4A>vyrcqY4?UnnRI$CJsLJ+vH)C{6G!^oGi_2xGn~p61WD zHii66xw)3|TAo=DDfLD}p(0nl4ed^HE$n%fvJW`)drTrL;l2Ab9?}LiPI&q&%*iQq zLGQ*l4(v6XT`sQ06c>F8-1si`SgjrkgiT3qm?obuFg?k$lIs>n%HbqsI3?>rc!1VP zd$3-doQeyM4&Q8Q6RARwZOZB3EHkId>9!WTb6mMjZ$?R)H*9HqKHG$o8LVcLxxJj* zaF6qO`OB6{T(Dadx3>2mL-Eq}&VqF;*();{L(EQmZfF*RrXy6Za3j zO7{=pe!aMVSj6AN_px8fMR*Tarl{2-ekHq+-ls@GMTC!#g1ZA(I&Sdp+}cCGA2PMDI${h9m@cCl>5egD@6+~2|1vH7wG_xnZ3U8wo}avtu_{|as^*%gph zf90=WbPkG=_CS6r7FA)QqVovYjRvb(J1R5G$5a{%3u;<&fj!Cg6Hmy*S+Euy>#FSc zOmR<~$`S4Y7qEf!Z?om)(Ur$Xas<@%SAb$Ops0f`VUP&pp9I`?0WL(xp!Xp<7P{Gr z`=dAUYe!G)M9d_FPfPL7Id6>eYl}K362&KBPZW=JC4%Dj43hkyd`{B*IRE)&iKqPM zm-BsvyJ9O4P})pDy^o--^cNVZMmxN};CPH&sj)RmhskcyVbnvL_;u_uc+XCg&-?mp z)F;_PM2VS?I`o1Ng|D={;B3EbsQcYP=W{u`pyg9DSESJ74qta~& zr*l=JC1IId3K zhxp6!{7gK*S#F@`=@O*n0o3$zJO^EJk9;0Vy+_pjZs}oZt@0f7de`9d@8NBq`uqj? zdxOvSNf%1T2IJo|`24`Ye@iFO3zGbdbRR69TcEgdNdI!_W}xWrvd;&`Ymuh}duW3+ zRay?uH#bXz{ ztoGO1&(n-){|XY_CC|D->Wo|W!PuS{Q)es=o9=|3^(4PnEXhI0&$8-8wh*Kj;zQpSReOEda2 zp3C?oBavy!3}x14PR`tyd1L1NnIC5UJxiD6&Z@|ombENvXVz6&-_LqH>z7%d8kx~* zj2Ih@(~L`un~dihuQT3feA4);@#E~YY*%)7_Ll5@*>`3i&VI{OVp?Ll)$~_$p}EOC z!`x-wYQD&Pv-u&5-BMr~Ynf}=VA*5&uH_!f91+h=xYVfF(1DEkciTKg{hRrc@MpR)hfp~0+K z)Y0Ua;n?c9&T+5f3CGKh_Z)w9%1(!~(Anf%?%eLY*m<+_A?NR0O|BWPrLOI+t6lfG ze(d_S>(8zMcaFQ#J=wj~z1h9beWUw+_hI*|?ho9b=V)^RIn_B&<-F#Jc(!<+@Vw-C z*YjC!daeh@X7%NMp0_&h?7S=T?#lbj%e+=^*xTZr?Op9X-+QyS-}^J~@4TP-B%jq6 z_SO5Q_!j!M`>yug?Pq?gzstYIe@|d?U_s!_z&U}d0^bW92z(l3L0hmOI4U?jxHh;e zct!Be;G@A8f*%I|9@2+$LM5Rwp|;T4(5}!Gp`V0)nXk=vj?HMz4$B8+{`BQuMv(@j_mhhvSM{3ok3Yy)a(*QsJM9c+mw#zbq~+ z?k(P5{9N&`i$5y zS#i8lu5?sJD_bkqRNh+oaOKmLzpVU2ReIH|s_v>SRToy>SoJ{FQ&q239j*FXbuMPx zW7Tu2S5)6!lU_5UroHCUnm22X*N&>ax%T-wSKYaF->bLOZ?1p3{+|uJA)~?8kk=4t zC~s(J7~3$lVQ$01hMtBq8@4r^({N$K6%E%n+}`kmhKCytHXLbqq2bkrUpKth@W+Nv z8~(eozHx5j4UM0Ta*kRy>d2_~n#ML=*Yv~YwB|X@zifV|`47#1866s3GP-7T^XPq} z?;QR7=+DO#jafV9<}p8O@wBXOxv1sdmN#1d9-ACn6x$p-D|S!pmDm?!$BeyX?44r| zjeT+K>tm0N{oB~D#>wL{#(Bo&k6S(N;c|x~jFW_0HDETAyzHUF#pm>&BOj zUvbL+feD%kizn=#*fjC`lMIuVO#05G=O(95Hc#%De9hz+rkp$FwW*e=XH0!|>WOJ% zrmdNF$+X+1{bJf%)Bbz9ZhFb|<3RUIX|59%ACK>EtorV z?m2T0%>8Jde_m|f(s}33yJOxX^PZmf`n+TF{?@K(x3@>y>)R)_ceJl*Kdb%H_FLN@ zYCqEcTKm!V&*#hYZSxD}kDfn!{)+kA=U+Ad?lUgw*w{I`v%B-o&i$RQbbhuVcfpti zT?=+DxM#sn7kspkFC4Y7XW>-~;|pI|`0*lnk!w-iqG^lPEb3eI{Y6hK`t_p!TC87O zxOm3mwTmxWeEZ@T~oW3cb(UDSJzLvj&*CgBi&=VJGyswU)TL$_fy@!>HcIH zTV`GsSk}0#XW7-u?ppTDvJaPi(PQWd_0;!F>si!uPS1@!`+MH#`E+^u^62vM%a<-c zcljO5f4uyi<^Nofv!ZIntQ9>g_N=&e#Um?zw&LiDzppf|46Yo%vTNn8l@G3bb>;C@ zrd5Tj#;sbiYTK&IRz0=q=xXiiJ*&T7vuMpdYo)cL*3MqLb?q%{?_T@z+OOBGUiZk>z^2HiHJk3(^!9h0-)Z>H z@y*qnuh`tb`O7WAEz`E_+;Yj5{w=@Ra%{`rwraO#ZLQooZ|lmf+qYh{^~$X`Y`tUa zy;~pI`tsI~wwboMw$0eqzHQ&OtF|57_PcFgY&*FHTHzpLZH|Mt4^1T()!F&O3KLxbx7?XLr83^X;8~-1+&=#94;39A^d3Dm$wTG8l3i z@_5|q1ylN$W;g#`%D{?h{Jrf=n=P*Qw~nJ-J=#aaa~xwpPm$~k5lp!Lr$aW%piqHO z_${Fh@4N`9SNh%b9}JU__e_M)w}dLZ(;?6`8D`^mYG@g8pZYHKcN^kWs-XziWEh9v z|0>uJCkek~J-+SgLHz#FP#0^JxP0Q|`YRPM0^;C5b2h$*Te7P-sRVIDT8-P@SR(L@TMV`cKs_2?Ofmg$P7r zk#7l8@Q(Nzu2{(+uF`T`Q$r8#r;d1*`hMhZ;#tX%N}sdvJT**E@2x4%lXabpXQvC} zQ=S*#_y2{EhI$Y#P$1s4V?@}j-V@#@-w{5*FYvz|s6Qtnj8?Dodt`{=*}n>ei>C|! zPC66Pjtu2^=J+?m>1dYfGF=VS-xP=7(t$7vfpCOyiR#yiK=?y&COk;OkKlVT!WM*` z2piPvS-9>+*rwk9e-)3~XHkO|SE|Rig#&nh55lABRgWt@qmb;Uo^5YMPap!f7VAA$0_ z0)d`K5mNbWJMO8S$!GMQ+L{dXoZeF)zPT8IU_)h1L9ikC5vY7B6MG*d7Xr!9Tm*Vg zxx+eKi@>%Np)ZZd5(IrAMZt^M}IrX`CMsjRKnvv-RtSJuV zL49(X_@{f8Ec@H8lqbC(tP7Qq3V-!|GEQn?qpJpiXoTo9hCp;q z^gw}VeJ8?C5iUjetr|!-B08aK1p?t6U8zihUl4)hAV+W@P&q`4#6Pl$2N5qqxCSAH za2=jMgg|_3KLV9?wt7!xKZo!v!XboTBfN{D-X?^X5MaHP-a1f`?+I}wQ2ZbEno;bw%l5Y9o^g>WIl3IyWA zbfvof5aBCIhwuWzB?u28P#M^`B6T2~iEsx(7wT{Y;!_#FLUcBrI%JRG^TL5~Se^0CK>Xw%wBps{zwRM z(i2%(U@veL>x!={vkaWXYz6&g0csW4A#f+FVN+FD+{qrnT*FVW|%_vU+xyk*`x?E*G4WR#=- zI5z*o&@uhd7mr?p|KmqHj;=V0Io+dA96d~Nj^0Y&$0i+{c&ze+14lcK!8^7jeXti{ z*$3aj_q-3<@V)qhIUkgNfMsXzfBwOe4`$*?!~1W(f7AO-lJu_ooi8Qnoxi-Rf9Ln_ z9DC>JJGJlBNYZaKZ(8Mbf?_0wNj4T__XFpNuJI?&mpkMI@*=rQUM4S>e;_}oJXgNy zUVd2qk^G$ea_V#S?F;hHLTNP1m*L;4Nm$1z^cqoA&{cmr0^ z{h7&3%QBgTm9SD!VE&axEw13+?bhkVpW+R+>y@esDu1yljcbCu!nC4W;l03PF*kU#ZKRArJq2SJth5E z`mJ;;yIuOH^pSKN{PiDFg5lI6IGwZNh+r>kWld}}YhhVz8P1?w&Q`MX*m}N^oeNLU z_p$rggIHmD5&M~Bm%awK{unEQPr`1Q23c-^4xRxWK?geposgD|@j$**!mw%@D;rx_ z0d#gdbdw5<70NLFsDh4NDa~N@(lk~JJ$*9t^@*@6HcN}xBxyby1^s)P)XiqFnUJ1s z(keDbT8UH2RIqZZa-Y4C``lP!c!|!C5 zO82sBr3cwf(gW;9NZ{*n-tzaP$JkxaB<_@6V}~KV4@rl?OI~G9N-wg5(ktvo(wpoj z(%bB(((j}X*)OC&us5XNv)3^`-2xpW4*jPXbH8g@J4UwU(lzWH><$=!6^TPj*@HFX z{|#yO6-I1%7#)P9xonKIfK8CjV`oZNva_V`vCF0JL#iHO4@f^}k3*{8EIrQd#>j4i zbQ8Nkx`1tzK47oNTjlS_o8*o1c6pn8qkNORQ{F7^khjRa^3C$K@-6Zm@~!d>@-BI| ze6D=He1UwPd^Tp4_sM(ZbL2hHqtc<Tzp!TGFOp9B6srwBgTC7pU4)%wyVxq|2y3Ks*;;82TPN*?XS++-R_KY_rOR-}^5v{o z>SNoar`bc&GdQ34Io2<|z#fI(dH`eZ$E4@ke(62z?|7H}Tza3qEFH!Em??Z3pUJ24 zS-ch+Mh&myqxl%#$eVaGA0>Cn3wa1S$09zTpTQUMZoYu`@Wp%yU&gP3o^%<%f`6A^ z!>{I-^2@Pe;Rb#!zm8uock^BRTz(#3&sX!kd>h{?uKh_=mEd|C;}TACn!>V~Y84*)EsMh5S=FM;5#%NfwfvgI`X2mT5Fh<^Yb z&C37CKjYu$xANQg?fedYC%=n-kKfH7BXkrbmI-zUv%NV3(ntr-kx*M*}d!Rvv&6G*uHJ+md)SUv~k1wGuN$MvwGFa70Y{; zb$2aYvUt(L1)Uvd%x|AJcXr#XnKPzOn>uCkq=``&)|COm;c_wv4;6F;=Amv*8houT-$;!q&eu>x83V>xbMURNuAWhQ?y|0I;)KV*`Y zA@rOPI>gjp3p(Qdu9cmW5nJNnxcJOHB-Ms`mET=)e~;fEPYZ{ZwRQ9b;;bv=QSaw; z0Aj4$(-#N@{GFYL27Z!Du|omm#ieomA$IZX{usM>?t%^!8uwp3uVX)FytQjwXMaB4 zbsX|b@tAnZ=_x&=D1N$uC_&Hc=Xw#}b0{Xo_lUO|@j%@7pcUeo66uK;^njj2TzO^^ z@%kfF5Z-XS(I{_X;tif@@Jz2f+oQyes7Qb+81;@nu$TaM|>m3IQlCsnb6N?7Ket=dUgjoa6&(uS=qP9P~0vLa6Zu4Ili=nu*=^OTHy(G_S8b6+hHko3Azb_u^?&(5|37sNxX$h*(HzCyRUk>Jh<^pnaL-@I10hKauK}TQa z^3d`SARLSJb)(rHe@~~Uud_!$9MwV9q|y@Y5O-3U6DJ-J?pcX1kj1jD&@$x#QRm2K zt42OpiCC%6LQ|mUJEcCQEpz})eyQ@~YpA4;DJ4C#nVp1!_NU!0+e;faWh>?85C$P~KZv#B`L zy#k#`<@vi;h_n+?T>%}cpJzfS(1|EKOmHW_fm6*83iDut#|{_#xlNe{>MVRUp{gE}a$b<~_>p5iwut)xMf zP+g?~_>H1S&e2CSq)WZggaLNsCqyGPfOgTF%ixy1CL2D+q& z8u~fYf!l)zhfG&01tFDKIq%+#G2-HXgwODEKpQ@htj1W zE5L;!48Gq1PDs#FAgQN!eSA_|w-@V?->Iqk^#5LAKn2m8@pMrU;zkiY zRqUIKl9djcN(F$qa-|tlsVQ0j8Z_P4*V7FRYq60iG&5qxa|_zkh^95FZ3Ap}q1|m% zI_iK1i`#h})cgz}fk2)Nyf6WdKT%LS120Wz_)oyl)Oy1Y8v#&_t$+^jMScR$)z^YB zC^Jg8qqq~lCQ|4^tces08G=2EX&|qdH=tF}!(p^8xgfgu0Xi;Ls zZvwbRiLQ&FCAjY!)z5ShH3Bfwgl3NF>&pl!A|*uZ{|QNoNkX}lI>DWXKZx%}*Z1}5 zvrhj;KQexnNI=AoUd|f4QZ6bv7+T{Qt)#!81LNt$hsw~uyPqd?16BxiB1IgEM?{LL zLefRB2cVGz5Z@@68AVLOZKWV-CA*PN=XLBxAq1)C0Sr@|;i`=UD0m2T0_WnOjE%*e zipsT{aAU6^slCO1{~G97tqj^01SNj^!3_{w9}!Hh4+_tkZir^^A>uooF6dHoNIS*| zAY}5x9@MN1i$V&<&4momggcr&jhz@*92)p2m-rPx!y)7m=JomgCNp03`7Ib|#P<;? zYSecj@eEQtEuzMv7VInT>r>*9PM*p8rp*NqXvAh{@EB01!SUCP#ozWC!l`v0_|+k4 zb*MK$us9?w3GIZs&>D*S{fod9A?goFGjcoo`XEyKLNuYL{kq*kj5dU zBASR=cHg4D1sE;{4oO}rUab$^8*_<`iwa#s6^adPuL=6L)lBwnty%8dQggz$xn{uk zotk@no2mzV8>>(FHdIaat*^S*cV^XqZ(ZepZ*9eZZ%z4tZ*}S0RzLjMsd@ITZ ze9Q5>r>w=dtaQNFT{7V7Dp~GZTD;u1r1*qyaq)m}5v~i1PWToS4fr~X?)7yP4*1T9 zRQcvdcl+9-1HO5Y0pHxn3E!N80pIL`6TY@cgKt)Nz&A5I&o?7~w{Lp>fNvVEQ$zRq zri2E3lS3zblS1=+6N3Z32|mAXd|<%W>buuB&Ntv2i)+k(!q?&-@Qv~B_Ko(>^EG=1 zd`)@FeWUUQe2sZ0d<}W?eD%2}V($i2RT$Z}uA<8dzvdm4QC znjH6{kbA%vOvjIauLVW5_qKWUh%X;x`8><;^}P*SlH2z zU2L8EF27vL8#gU})!dH#vV@;dbb0ISj(&}NMd!FJTeiS*U0hs@i}-~v`ct1O@35<8 z@E@-k-qQnmNx%Oe_TD|ds^aP&UNigTBsnKHawmikAY4R<$q6Jt5g{ZI5djfU5ify+ zi-tgxfPjjDAR;0~sz@#Mq1MM*Ypu0PebiD)tyM~?MM@D75dkSg2)E>rgq-)gW@hhm z0!Vq^=Y9WqKfmO&_Fl7Q&6+i9?)%I|J#;X3sXs+mf^CXsb4Z#2=eh*_fu$1fpvP~M zE(UzJ#IKKma{&Ct5I7gOGteUEDq15E&QKbG6ML?wk@z)kFkIK;?9@W~9&X7V0^0ZB z8iwZx_}vJ<8}JLm2%JaQ5Br9Oz>j^3!N<32UypFPG{E4)s0bl$#&`T7pqJ212&M1f zz7|{s_}2eDoP0S9;ctY@!QdW=H%qwz{Da}cF21q5SaIk$uU8?iBOfFThGga)g>U0T z_q*EgEnm1IfxiXNxWF*%ErUyZr`=|73t{&d+=Xxb>Q`HY4Wl%Cv)5tWpieM(1lHOt zGI%7u`@dmuFTT|K4IV{nv3pjBjTV_!s=;HZziXhz@sT9TRbg;J9@hecOY*sv8r-7Z zE~B$>QD4_SLl2`qxI9hC$8QzcVLpT7w~Da)3?4x_VMYi3ZXU*G%fTl2UBef~H)=EP zrQTcv6dpx=-L`Jg)W=gnd2T{vtU<+u+TyaV+Pk2iQcaAP--KpEjv z4Ly;%h1VK9i88}qGN-@3Z;i1F?cHVjF1NJNEs2m4W33h5hVui1fKZ@Pp3W+ z8w}o=dPjU{@C@o3al+tTC@V6};F**iIn>}?sb{2}7u_f^a;>3vCr{+d2G0tX8T{@L z6>0JvzeB`D+BWHhGc~pw{@xTHxy#_!K#rZRK8Ux$(66N|Plmz!Qg2V8!TV89&;16^ zraqoE2EPsm!oF+p9O~<_%R??@;kqiFFFxw&?Q8HnO81U8cz??DRvLT&Wq9p8&8KeO z*9^UY(!4tiJ`ggG8hj9?M@1QYFy%zqd4YY8QFj>n5b6`P*x=Vw@2FP{K9u@KePZw% zC@ZSf;KL|8I@938sb};UgBMaxbdAABfX??Ca(OGFKGCMm;+Lo1(Ps_4g!;y$8~jGf ziWzC}k(3=%Vep%%XUy{k9~F|1H;3fcXiAUSVt8%=ZrgSY#mD#!eJrKL@@ZzQ&p3*T z%`*6{lp333@bMHEYwK_u_-*@40A6KyCWe%;Ng-wI_7L6f2q|NChLo|%Av)g`QpTpJ zGByIg_0Glbq*XKvYXN3r{Y)lW$Q=CV1DgO!Io>y6rNA_BR$^_?9IT}&1z#!X;}C8R z-4C8=D&%mi!>K`-IiOd=zqgWDgBYsO=3>hm;+Um4=FwD~^UE@4gE~!VP!5?D@LdT0 za!@ZH>owm&ACE9I5I<{Ig)_>sRVs8pb0_+eV)O}@m)H-!p0~kVYbQ%c5_a1zUW+e5Wki`2#awHwkCG&WYWXX;qv^U`Ie1%s-WfN_@^r!YGAEw za0F9h$8mY-|6ggtcIOhwT2-miQUlvm!yc@kE|XmHnU;z12iuG5#cjZ*1A9<~;d-Gt zD)64Ba<3ZCGSKHCL>cfZ;9MV=_coNi(RhzV+?>;)l1I0bzB@y>47yHUE?!%k zQsiJMLH`n@ zqkWEDU6|XEZo8Ga9ax#N%|uAAQTf1ak+vJRGuo2HSc#&2*+#mBx^jrCuj7KewzuBpI6`f9Isc0-bvYh8 zy_fU5)GC+b3fjVs?{Zv0S;16aiT~=j+S}+#@ZOTf8MYw(S-2ld2CE$9_bQT#{1=>YqVl8wx(H(1-w}~G3TJ=}aOY|1kh(7q_%r{0 ztfjpcYrhBJp6LS2Ubkai?cc;8tRx;x&Ek7lT|5NqsfS`k^)Re|9**_5g<=GD-xY~s zQ6g@{ewLfWD6Dfnh!w7*v8olTow0&^oVZnt7q?-y<->~F3G@#!QA`rIV`cfBVlq}j z-zBDC<@2ZF9&xX@Pn2S<_B5>3F2`!^8DgfGCGN+1-3PEnw*n_oRpQ6=JgltkkJZR? z#9XZEt`gOv2J2vP5f)a(9>S{F7O_w)5)X-o#Ut2X^C(tq*J9oGQc)+CVI}oItc6~V zmAsE*?ez+*?0rJ46i?zD&!@0E=?7wscpCe0ekh(1&x&ku<-xEI(FJLA7M(o;o5$lkDhV{TN;e4!@@$Gt+_&HXV{{m~ve<@zWI^rpZ>-`I{A9KBbVMX+pSP^{yyS~2?2gTP|Z+=J|#%`N$#8IqZ z|F<}X_0-2jJ$5yJD^7@$qCuPzr^OliTJ62PRh$!zqDlC%ld4&?px+sf{c^3?4|YMc ziGU=mZ;+zDO~P`>u5?&-qgJd>&XPT_C!!ZULAPV~!Zp|*#QP%p$!zQv zSS+ujTA4#jWG+1_eQJ&K0IYH@kOQ&Gd9YgN%qyO6ki+Osnkw= zyRt;yC`V$Q^eA~V-7QDcH`v=SMvmp(6LOrq6)V0Iv0ES+`xH{KUm*==>7`@m!)@64 zFj1|Vz60y0Cu8mO6t!;pUU?r@QBTDx>M~g_r^^{wAw5gpFCV}zj@hzO&cW`D?_>W) zwXDIq>G|?O?4?+U{TL6?`&dnWjvBGD`VqMpKUURZef3gVM;)*lzcWr&{v}p!{*1cO zi}WXYoT70qE>1_J8{}j7<$-St;k_UHt4f@FoZh70$`$enxf1i(59rVM9pr7=M8Crh zz*ljz>>u!3hX*UVS7A-}YOLyBgS*Zwwa#0u?xtn(Iqb9u$Li!CVgE=IcBB3H;&sjR zn0$%WVIA|!Sl9fD`~|*ao}>o+G@MC4z`6Hb=vnO8_#yoqZSG6>TCo;q`)hFughP{H{@^RoAS5vE%~9pX#|r7q*af#m{!wnlitP{N zpRo(1v7g7P@)p^O zHQ#M&)wi%DR(-p$`rB=VTM*pn7-C0L1A&z@|h;Do%6Skd0e zO2-=Y46BQkX?3-_S>3UNuZPtWYu0;P*We7jYq2`LA9k@_XXRiuybr6;`&$FByRX0+ zXbrLkV>SB_tco9s73ssQ;Z~tF!YZwfD2tHPRXRbqF> zTu1(W)_-F^*Uzn2tY28KTEE0juhp~mU6^m)Ip*y%@BaEd+R{Z=aF z4D^neHmhpdyxG$$$`^P>l+CFroi?q!vc_FBtrPk&q~5hj%*RO+B*e^0R!ofc7O5?E*_Fh9K5Bt&VOYeeSu4=>gUGvQR! zIk|-c-8U+Yyf+3D#Vk3wKA-2ti(>QTxJFJbt^RoWFHhZ+WG7R zDlK!1M<_b{hlk%}w7p4d=f0_CRz+F4cT{`HIk|Z%Avw8&bkN)p1@6%*SKOl=i-N1r zH5xi=1??a@w%p=86MKK3dyEb`CM0P80XkHFQGU^rE(hOITF@5Pd1hP`yD!%@GuVz6 zdS|u|gLZU)dzO=*NPyASR}wiZyJF6?iV5Ry*6A3b^hb-T_3-5shR-tTm}OejSxzC% z@#PhG?{6O$+RTEe2WC{2mseJlR+i10=B`k==B{uI4wezF3M4^CnWs#XldGddvuaf6 zpXaXBK`TRo_E+UNx7cZ33#@XdSsmn_!}0liDJajYX!E7U_t6x^SS`GI^J0 zXS*pDBTB;N1gn0LQLosRX1Iz>;VI6Io^xr{&nXF?6Ivbyn9u`MTxeDcy>l*UR*mHT zN;32-a#v}CRD~F1fJsHJ(RzSMMS*$e+A$d^{fpeyPCd#k&Ns%$FYs1hl#{+(W4L@H zI^T%OALOdxX0;|n4ef_^)0k(FDe(Cw5&0$Vc~0Jd%|u&lzYD_V1#MhxA}%oz7uz;B z!ir0x=Ur-Ju4AD#W(%0+b)ITo=Q$-ex42-C`$1&}?}Nc)M?UB@uMg_xbz#s`m)3zM zn@a|`7lt;kCKvLIiAn~!7b)?cMHki8L3!4^>{%?#ms6mG`Eq^zBNvrd&B^A6#;U6^ zgj75ORTqPykFo{cHeJO8x9XtqR+hwDRS>+DMtG~P3hzN$a#`h^*%26#W-FxT!8r=? z)XYScRcPe&IrFLvHfz4&tDdz$^HpOkU8&LXSud=L#*FQhU2<{?bxV~~sO$o_u}gumOM$UVfw4=0u}gum zOTnNhW9Mu(dW^~lwoQnWV^vPgT96as7?`87EhHRE&`uSOolZD*DE*6beaUmnt7gq9 zGbOwgswCv`up?d)RdP^ zt>6H8amrPV;Y3BbA|%XQICo}w<-KT=OCdPBtYX%Tl=21BDoSVHTmJodr4{RjCPN2l!9QE#MSfQRdNMfu!{dDXF{Xasc!r>q~R+`0|W*-=_m zHRr*3bG58N1s>(D;+kMc10xlwY|evf91g_>X-Y-;bekt%Q>M%ClbCRciqTAUL?*K9Vl|VUfbA4j@-9&|M&*-u1vy4(#IQ4oa|1|?=r)uO2j%Cv)x0Y|j* zQ8B~ifh&XyMIsnPC(#5kNiad?mshc@7=&ij1hSnbrdZ=^$At_su~k>jKxpk|X6=qs z{)$@@P=05Ym(E|v;*~uR$fj{Ho0eqwmAW^$HX6=T-;IHIs zLV^kjoO>RVDeY(`-#nVH5;9{9YPfADN5U~0Ulj-3QOa$2wZm{GD<5_Q(}w_wip&)u zM5Xpbqf@lvv?J0iHC1y%lhU5pE-mxsI%&~13~?F_JE#auo|kdjb?Sm8TPMiKjZ^IG zFv$%P+6iP1TkACTxqJyrWv^foO)-EH7kLEBq!Jbk!SN{5+F^orHZfl65iDRzSTKZ2 zmMN#o%W&$lq>CuTbxEP)P* zihObTZbvjJi&jKCA|3AH@~v2Gq6w$dqRO|nw8^TF)CEht65!;6PF*k)bn1-UIK|5j zyL>wYlVlwobJ$v^88a&rFjug&rYbMTBcyz{_Xvj2!kiEskJ12E)xwmEV+kqWN|@sj zQoh@JsASpYTX`8)EzXVy9W{z1r(btC+RZ%L9jE+Ncuhc0t`vqwp?#8}hSF@#_7Nt8 zs9`ISY-lQ)pxqKf$u=(!RJeQ7@heqeE=W~Wj^C!)obByrb28QDMEokWiQgt8{vg>V z!ay(t$D=zO?N)K99tsA7zm}v39XKc2+1RFVAZ^rm!xL&}Cj;Br)S+@`;{e zo1DaC#>MmtLC^OtDhFeVWx+EI)5hWcBP>U@VXMR@qU4ZiXvkzVUXw%Tt?|YY!iAYcb@jb^j;rRdm}-Ea!a8%>99(eD zTIBfjToZ5gNeOSIb&k*e;Hf`=g04R+`1ChnxRtixv-#DW6>jwzAt%qwk@Ip2BGqT1 zX>(>zjZ|NN7*lcQ;bSW6kf%TG;H_oknW<=A&hSX}g(@UO|LB=><~&e3b93x6YeVJbKC{T_VCyCnWq%)MYFx24-b&Lpg;Mk88^5 zQF>`q>7>vOp`Qx1r}}WIQT0($p^^NNP!p8`3iSqcndQ|6$%j#LL-3psd{79UXK?(i z;qWtV^D}PqGoBY`N(b|+$U_J@7ZV0uOvqCN*O-Z;M`PWYAb}HjWAV1IZbbhzgFFzc z)_Q{45s;46X#y^G_r_Whf%PNz;yDffxFr_*A_R6N@R_Z%v5rIFjL{$C`4gfh z1ka;b(U@e%yO0Y?I-hopZ1=fBo!*e;-X9=v!T8-x# zu@=w&!g-4VtC{|VOVw|cx8XTSA{5rz+==JC5@C6r4W8w)oCMY|%*At&g`J#OZSXAc zjn=Ec->{$?Rtcz`en>gt#8JX36~g{Fftxbz^$J+606SQau!0C-e?hS-6kA1NUBjz* z6K%jcJcS^AB+>xA0hL(z*99;ffb($W69C+sEq@F63ep|~{0M-($<`j62Mb9q$Z^#I zj^R95oFI!Gv=p%u=cwfpdAb8`1H4V-MOg2D18@eo_awFu-vYq--cdNmJL&=sQ%(Wg z0L>$|@KM#y-!Noe=-;KjniBdXgyB&9wE2S+m23%b;g2DHW7!v3f4&iCUuu_&+)G-q ztvnH&@BuW}3aX{HCDgiYP2mSKGLELE)+Z)@n~-p_Lx)qbv8Q8V&O}EyMMnA~B3fOp3zpR; zrEF^pYiV&eH;11;AK~{$HZ^$~8@=bwMV&nxedbKe>C>^NPQ^7ebol)94ku5>pE!~5 z?YD{b^-0H%C-2^!eC$}tzyFMp<@Eigq3Y|#Qsw7?WCutf{KycT{NT2%5ie;E1e zEbuqbg~vF&Eys;;f`0dOBWNf~oH=YTzsKc@Xl-o75-X+(0I1R*6&3D3Z+ZMKSF|6s z(;o;V`Oly4=>O(yKmS)>VQHD>4rA`q{+Jj*dYd1HZBB@n{moF{>Dat z%hMe0j`p891AxR+rvQQ2W+~$RCr$ub6aDq|faWCs@#BE=T@VxCWOx4;UjUA0`SB>8#7`FvU&UX5 zYj}W~1CItk!tw4f0GCH3>Ud*gQj)u|vAH?o52O74xa~6=8sKm9C^NNTp<|p!G@WzB zi>7Z|yNjlM$NPzH zv|pJDc8d2a11ak$(sZ3Py7Ap$Q^%N9OUEb z^z)~hT^|35M&vJNiyyh{IgdxIpL4{I%tmyrtx0~wgva^wouJ3z?r+n3+y4>Xw@B1VOwAEon>4mn(@cgpvX^G<~1GNH=z!E%L155F2Q_to=9q<)P7XGlKkb8SsF$ke*P?d8UFNnoJt-3JaB)+GQVHMMm+96L;EA1 z22PQ+O-&*!a!FGYor+w6=gG(?@NABJhM%4~RM#V(r|{h3+1S`9$Xk2v95s2D;d#RQ z1fIvePvTi0z4FW%krcPA;W!=>*-YD3OtV_ zu2j#b@I0Ql8qY&XtLu-eCw!BiI(CfqcKIQy|65&O{_;!u$hTp~4n83SInPDils11% zM8xUSDCnxBbK#0e_xleWis-@6y1cFyY!+$XXcJ)Xc^(WNoM z&n)ahlZxg)FhSgVK0G{7C?07E3u9sYS}ZJnJt|!MS}0=BORyim5Dpy%Si;b0sK!}{ zz@sQac%jM0Ac=|mO2&!ifwsUcVg|p^l%tD*tIWD^Auvwd$1ezTwYCNx5?*vX?BZ9I z=oH>~I*==V65&4)=r7izJHqAgAEHYN^bo7~^{|NG*CQwwc;$%=F{h6Pvc-QVeEW5v zK&<80Li&#b?88+&n=PhnRKdgsqD~&{@VB~zfLtRm2nw#%D+^`cBT{O zm&urPk=Fb~n>!5c!s_o0vPitnxqsZ&d|qTkEN}BS;aHa1NL0ZKo+TDuUwBr@3tr*!{IIR@96i(F zzrs+_PQ^dgc;W>8JMl^MY;+{)smSBU>FcD`7GB)la391Cr>QutvhBhJDO@fW8sAn| zBwkHTTrV2-9z`|d23A)Ll>vcSBKyncu3ZE3MfTTcV>$=!7Zd7RtweS=o^A1{qTGT) z+)W&|TI+TBYe50z+-^a3FA!-NXFflu-u}-IV%d5y29*b>M5$l2bnlHK8+IJMVPKND zuD&g?BNyTN2voUS#Jk^SB%BD$5ci#I>Cl1s8(QL$0uPGF^Hz8qs)+kSBkIpXLbO@Z z%W~R~4*`$(OQ21(BIfXbB|JcYCD#^c9PnpdP+M~|X-Vq|P=%6+^_MN>2~*+S=XdiO06-uO<~ zI3d&pBRmeegqxE8dVTA+$Bv=-B0>WOn+W8SUGSAeYWw&H{+48)h>_3v8?AUq5de-o zBsax%&7LQv>&!XPvDv#sx=)`IDb3MKrMuw_kPblVPl~YSE>BAL{;z1a+x2)@Gdhlc zy2Dn4HKXr1nV9%QJ^rA9ga&rb>zv^nXyGiFgTAw|5!ceNKUdH&@TyUqNN+pQwl{I< zVbQJaXxlCz&=G@w#Tn9E2fB!@A8Z~nq_8khA-dJ?NlfhBo14%2&k|G6@}fyP9T^jY zmS?f((wr#W|E>=V5Wi{8knS({1V)ILW4>-qai0wI6Wdb$DwASb5PKN@oq<$fBFBI& z3BOb^vvxdCV0}4AG8vS7py2`F&tcOQ#@LOJk3S44hzAS`#{)BzAdaB!z{fb40dqA- zj!_3|okp=DN(j6q)&}Mx>_Pfb;2%^Rc#v98)&^QtXjg0n&{VfxSQA zP%~k|JoZ)UsOGU*pmqmWN66w?en&OS@1|z?-PJ6A2=Od`vYO@JrDpl}sabxhn&q!n zv-}^ZS^m$|EPs!h<)2cs{1&ypERkpV*qw%1K6Z^^mXDodnB`;l7-sp{ErwaXxSwbF z;sKuJV<#78`Pj*YS-$uM&+>8q3ugJ^S3JuXuk$Ql{F-O^;tihVi#K_eFMiAOd+`>} z>~ZHo4pG1PfLg#x!1I7t0q+8~5oJGv_bvc#dFh9nS^6QLvSR=lfZim0nIx~p47M*S zWZx)2GK%n4yg~2V2iD!GfU+S!+Xol|z}J-QNr349#GQQ*!2T;CFCTBj>A(xXUpMd$ z-X8(>05}Zh{n?F(?>zFv1L#ZyF&GJB-<>CCI(8m)sU@)qy&}briNA-a1GF~SKnLsX zV4!u_r}zpT+8qv7>0qlJY?*_BX2L>a6UQqK_NIfq?_k?)jP)~Nks=cog=W>90yMb@t4hCI}l;sX>je~7;FxbF^eapc%I~b%G-~Be0twzOWpguRGYDq@#V(;qoW#aIhc^ zSSrWkPijwFY|~OFFxGJ&QCDb3q_7tm%LcGy(2m$xYQBxJFH0s$LwYrzqCqlIazr~C z;s75~srgcSrms(bJ$-Zft`rALPPJ*teI2ZugMpU(GKWYW;?PDr*c1n=aIl9RY?Xtp zvoY4d$lGMolDF8{<@CF9h?E>VZ1QdgJK|ssHilyb?UcvaSTMFA7PL!Ha>_6}M9Me^ zn{H!l`;@tC=V04(wK9Z}~y z9zD+E|(sg2SdR=CEmf9N)n=dpER?>&uJP$7FfbdcXnqIV z?_lg3xIas1b%%>0pZ;Y=whC1H*R^*iNEM*`+=9j-qXC z=X;uInIGV}Kl22hBQJx+JG5>N=5w%Mi17|BD37t3O7a57ceR7PH22Z_j#1jb$8cg4i=;_wqE%%_M(GrR~X7m zSJn4)1=bB^24m;@0kw>EOLj1n98F{2ZbOuBNjuskrYYa)%6G2q+x^X~oUD?paaq&5 ze`I6bmOI!+2V3W0pmp!dA-ZjHXdgP*J_oC}F&r9U#}VaV=?(@Bw7l*^9NK6HyNrIU z^A$qucfw9}umujb)WOy|*ozJpj4g;ccIh6Je8LWq<#Mnz2SdHgTE%wm5d}c0g?od8 zy=i0Yn}zy-=k|8AgNk-Kl-5HsEhw+Y{2r@%OabM!@5E3?j4w(Au#$EmP!5bQYxY{N z)LwV=n%N7rq{mhV+v#BY9PG4>;SdlLg2VQV;;=o_ZCcO14mP^yD?K;&L~ZIh#KD+0 zMbRo8+QSaE*1`5WQcgIS-^O~i(?DzAtDEENbFe}OLwnT=^$pKgh>US#j)r!~ z!J2KXcP6kt9HRGf0NMmR(c2qroP)u#hBn{9IK(;?;$?^SzJu*_u%kA1O%ZCSYICkZ zn`5vn2MhW#hISiIr)3Dv&#zet`t!>7RbcNbY}+*lu0bE%$DIwQ9`E+)2`qh1ivW;>=kxsJzdmp1w|@3{SH1CDp*$@5WZ<-Ck!npyU4<_xE*enF-%*;a z1QD099oRS4d!X}OvjiU(byWV1);dK^pn;0oUs2Clw<&582}R9U)MhI~eT1~cTDceg z7#vZ8@%bse+GUuEFNHRC8LhDAXk8aR3HpfDi9DT;Am$9k?Uxte-U4@`4jq_Co-Wz= zA{U|D-&iT|-vqaZ-T0-ym^=|#&2kRD<7wYcl#wx0 z`94jFo#Peefy8=9h}IIo$@=4?ExU1-u6B2&aOIA%qEkvbFNaTzJe)G5^Dwq-U~EcZ zN1T2wUN)&uqTY%-N`6V6^ah-eqtmy~il%Igbf6XFa%lp_Y0MbKKSppE+6R4E1AH=8 z?&iQ`<;J%+?Z%oU?a#So;qaBibTs`P#vpxv`Z0wi&@RNwv<%t?X_ol0(XA_m>2TIh z>5a}WE1nd3x$~O}dyY1A-V7~Ha?YfW#>qM^#f_f@;qD2y(ozVOvShfmRt?CR!gQQG zE+RQk-0xCX6VgJSj7+{yNspwV5p4>4l=>&!gLoRO-yk({kfY09Cl#9o8zhoSorU~S zdg%Pv3U21_YWP*T5IA3k#-}rXJZvzs(-B~=Iwi4#k{J(~T*2`3OWPUhpMuy$9H*kw zIF!~X&4W_oiI@Vn&TY0cLmGadMo8pU5oM)}LrA-vXOWVw@{>8U>~dssF-uF+HX1Ah!8N9)ptAK?zuYiae${t5JAr)f`Ip413vcdK$gVCn&~UAeiQvnC1jJ?+M=v#GIsUOrkU851+X z&b63PsE>UO&rii!gmS4*)XbS84k>px8a{JFi_ul)OHxAh$D zPS1u^X-QnmF-uJ*mvVDUR+fO4O1EJs(FrsZKKLO>`EyI=Nz1@jZ&mKO zWfP-P`3FC=Y+{&-(^$}YROBdkk_!2asZl8u3%859YI*1fJot9N;XQ)$%te_drdpg$ z#cuwYz`{?z>)~R3I883{De5_EL+Xl@x8Q#_=^XD)j@?tXfCkCNaYsM zvL;eh3ff^2hMIXtD%yY09>IBB9{j4K)7BIiOW6sB;PVrwtZS{CP*W2VIMyZ;YXaR+ zt7Fi)okVWswzwvzEJx0AeF8t*JM}E=t$PktI-&rQ88`F1y8gQ?k37wst?H>XNQ{a{Sb& z+r(}vM_klhNl_&znfpq+ob*X~BW@2g^IOlwKaVgj>TEbWrL5yt4P~P?MUN49`eKO> zP0UGJrpPui;de6lPy_8#WFOqZsDO3J*iY<}E z{lDtZ)$f@)WvV^qzB|H2oDUesB%e;&37K}wo1~^#NR7PEVS5s{e||0lNlPJJm1H5= z?yz%5T}Cj@;n)_yBB~7zsd+q#NwoV{D>8Y7;x*M|;vUm;hk zQrE$*VOFN-4gV}slCVaDM+7`x<6fzQP7SmbG)hS^BN_Q?tUi4a@jWTI49B4tiwA$Y z-J-}H`2CJ!Rec@8_b^hq#&mE>jilEUm+k?N$a#i~M~NLwzO~4^4b`Qnx}2-Jku(>2 z>oLME`Co?1t+;gGO@^9ATysu_MGqS)r?~^UG?jGjW@)!rqTFmRS1tF=T-Fhm`=1UgDAU%1bf`?@ ze?bf)PxNY(K2@v4Lvo~wD~Spa-lg&iQcS1>>ItePx`2oCCP}qZ9$U5;n5fFV$dFT_ zJ_LtX+eKuEkE1q4p-&dMvQ&jkQ}KH#Q_0H+jE!0svmXAxc5!%gTI5IXRX)GQD)NoMo^{f}a{?@TP_esE zdh1n4F4J5Ob?MDg`R~;u8c-!^>m@548=TV1qZ6;z9K97vuPX-mtxKc}?lo2$q^7bZ z;$O#!jk*l%M_HY&Vpa1K;c?0?*UUsxH3{ikhPz`p&+M8%jfN?=i?x6yTHxaH#cA=9 z8Y$6!3+2ap2en$Y*H~l+`+8pFvaUk8xa^{DPSYbykxIJ!rJ0-^iX|6XD%XQfrd8O- zQsQ$URk!sGDipUJY_~X*u1#W#3Y$Va{_bR`2NAX~W*thvK{v%!#tF@AtsH+n z9kEQ`Js&4+dSWnIFnXzWr9&!VahT#?$|cQJLs)sQ!^_pQ8!^Ufe%=0|G$rZ&l@398m7 znjXIyC89`ar2DyMISs8FYiMhHH)`ef3%o@7eNNR(C0ui9sv zIE?(pjbI(MWbv7)Jsp)MiFSN}LX|?SjDhah`=V0BZBrJ&qM2;*s10!Gei|bql*PVi z5p+G6$+1K|42zpK*ovhoF&QTB#w!^dW@MzFX>7UJnXnv}OitsEC_8E>EPX)9=}%!! z&Q3-x(q-T<#?KqUZAJp1dH~2DErUaPn@Kt$ISv>6l|@CmX&sZ4+e;Z7N<_*j;oK^F z4VSC!Ow^9Z3Cid0a30-wjh$VrbIeggcWAXBdC_r)&ixR&RZ+-9Qf$J5d|A8`;=gy+?7rjoa`rcQSFRQ7~?Y#C??Dhy6{RN>F+4(!C_kXotS;^^lsyT=Wgu zn(9%~BIE9A*AV6x{Cy@^qc~+)_^QHlt*=5_H`WNtaBDf;ai(@AC{B;&7pqN= znWVmxXQ}qsqBf-gzG|zIXwe0@c_fHgG|Qq3h-H#;>pEG*B`2Z=byjQfFQ=sV!0$0O zupH_LP!o+MFCb@i`C%JCV;zI(cM_<-qUyR+MLJDM`a6@;iY6#o@pf52iR3v{yj_Y+ zD9fbIZjlqzcd>XoM>!4QZ;;!xJCU5js%7M{iPunF*weKV^3ZbPTN<~9UR~SKl3vT& zgT`$Hw{H5I4R*UIw>^SQGWF)L_)N)9pfT`|H?707Om)vkIn3rzXonv#T(`jOA~iY_ z*UN5-nxwv0xm5e2avV3ba;Wo&yHaC#mMJXw#gNkz{IZp$Lt`9oe`C_U?+k?E^kAj1 z;tv@A1k(O?`ARS&`g5i=PoNm^<2GFt>aZ+z_qNU=z6qGausu5|d9Vij-Ea#Pi=Zg{ z^RD9sc(&h*>n64;e)IwK2Mh&_1dNB&lX$b1$tD+DflmgYjmPso#sqpE-1fmVKb{L5 zY#A^&Ms*qZQeK2mJf=9wr6BB8l>9-p9HQ0C^RTHKjzOMW9ULA5lt1u!Z#7U(7mNw3;o0rt?{$32K>9bhBiRlvJ| zZGgRiV;I=Jh4)!N8*uc3JZBQw0N6{wUScBvqg62l0DFk}faL(l#O4|854kMIfz7~o z7}$gNQ2?yS{4xrVj1;wqkL7ESYEeLZjGH8oFSyTy+sBb8$7;l9+yh~^l3KRHN#&2( z6b0KYk83{sSuO@cp7-2+`OK9!lodbG$nqJc3H;gtU#kiq@*9DLJYtef${et7mlU!-eFg8l6g zoVv_GnuJxgT(n>unqysoGHc<67j98_{I6Rxq)~3c*hX0pKHT1VIR+JGJ18#GVzJzv zN-pA-$OnXJ19r%vaTAzY`+k`DNimEk`7+rY8E6~WJWYt?f zNMflm%6*={-%=*x&NS{X;pV!Z4Y!L_IiYj>ofXs+(&@-zUX&g^g2rtjidWfCbmQMS zz}rQYB$x6F{l?pm!(tv3ZQ|j&gPLrp3Fg-qT?$+HmoePZkYHv{E&Lr_Y1d1|sB%e2 zD^pRiWk*qU+Z{09R1;JhTxK-lMy9ZYB$dN1)5j9Nta3l+QnN75H{Fh7%aoFsp|opJ zU!+Q)jqagv0gRCquef>}E}n1j`0pC!ZpN>&93!?hDXzYX+GZ?@joylyZg`(lyb0>p zW^CL7)owj`6PNBk649bSMRiJpB=yY)yIXkU8~<9n%Cr+nss_TFB|E=3B&lCZ1jruo zk@QpOo}7H7AAi`B6N?vOfSb2!#X|cI=)Exxgx&aNnEn(od~$In-GS3uGimXN@p!&; z^YF=;wC$F$qcf>t{McJEMe+priXk{!J5x*zk!x>jyHqa69oH`I@XN%0DObc*aYbGg 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 z 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 Z_2KIt%A#=cIJ1w;PmbiMuz8da{{zR>`Op9W literal 0 HcmV?d00001 diff --git a/src/public/assets/inter/inter.css b/src/public/assets/inter/inter.css new file mode 100644 index 00000000..47a79cbd --- /dev/null +++ b/src/public/assets/inter/inter.css @@ -0,0 +1,6 @@ +@font-face { + font-family: 'Inter'; + src: url('./fonts/Inter.ttf') format('truetype'); + font-display: block; + font-weight: 1 999; +} diff --git a/src/public/favicon.ico b/src/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c81a3c0ea66e3aa97716df7e69587d80e92e95a2 GIT binary patch literal 4286 zcma)<4Qx|Y6vs~)>WIb-K@t;mg|=unwwVZm5!isO-N30RuEiKkoU(Qk1x42RMZ*Bw zt_)BRO4OLB0by)obQ|oeUAuvR(00J)*g8o}3~V6*gNkBS|EKiL$MRld$*=eJzQ_CB zbI!fD9gzb6luF`v+Mi4`g@_&l7@};zHpqqQ_l!Zo#vn(}whshrK!p|dZBvj;>(e2)HIAZiMl*HO@1rU;tfWn}Gc)m~bm z`kmcRgJ8@n__=KY30}n2mA{4KW_K?TySaZH+}HKY7V0U5x1{{3pxN>%=CBRS`ti+; zia^N+cg&+fy@$S^yNM7#=UmFo{_XWszfd$6>>yvRWZc3$KEw6#2gemr$ZS~xcRz^4 z2n9;YW`;`2NBu{pxu`|!BKP#TZXd2cdSJ?zh}*FU@m-LJoBgeRon5s*aW`^q$sgn9 zIgEfc-DboVQ^gXuAqFuv?F3i|Z}ao%7xRG=iHa0Pm~dhJ>Hzl-}~dE_N>f z=YX)j#BCeKwVtf4?AGDg7lGgu+Nc|AQ5`BRr@(9P{a1UHYZ*LO$N0POIkQ=doa-Iz z4#~Kq^*)e%kn7FvJ_$F^p($i8)A+OY&_JbWYS>|#k2a-mt4ZNj?M{YkC-@!k8PftD zZ+oH&aaYcVw_C>T#W|POlIx^Ui6s|~pJd!e10@zsB$7elO4AZ>8VrN8V0pd9MU86L z{n+=}X!CH!K6HFu^lXXe_V{vbX`L@t5cW}yjGJ@b1ZKQN*Wor7z&8jYB6>y(fli0s zNqgVwN8AosH}+qfM2J zE%jh_6}uOK9w4kSaoZF$Sv2k^x3haG2uryC!PtKGH!s;nrxsPPdmd^Xl&N_HW~!FudMEa&gBs9P#-UTdw`2ikM5f5hiGyZeDSUheZ+11DyE%9X0cR0_>7r=222sIYBt=RwC-qr7L&U1iN+)+37m%93i zJ;=G?`7v%`4sKx~1mFCSf?0D3zZK_$ZW(twzQx@~WhuKkZaKFH?zE8c6Lv2Ky)y15)C4&vb}t2C3HJ!b4h`2B zA7MZ83AbgIjGOD-9xS$`oi8e<0cSMlKgDwsMFe-hlpE`=?n(&ePmfB-n@5X^jv*!G&58*D17x&?z8lw{TMBV%bFa9pE9F*{TaIU3Y zct7gSj+=AT``2$?VRt%W?v;ugV~E=@4UD>DexAdt;JRoI9(;Jg9KtNs7SDyA=u7#w!voC5}t*CXY|B zDiaeZJNX{6Dw7oGj6-J=Iyce5eT4f6_bJBQHxZW!m$PkS?(^b#Ry@yZeLShdx+W!J Ly_OZ}xVhn9K7oSh literal 0 HcmV?d00001 diff --git a/src/public/index.html b/src/public/index.html new file mode 100644 index 00000000..74776c49 --- /dev/null +++ b/src/public/index.html @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Aim + + + + + + +

+ + + diff --git a/src/public/manifest.json b/src/public/manifest.json new file mode 100644 index 00000000..e866a8da --- /dev/null +++ b/src/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "aimui", + "name": "Aim UI", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} \ No newline at end of file diff --git a/src/public/robots.txt b/src/public/robots.txt new file mode 100644 index 00000000..e9e57dc4 --- /dev/null +++ b/src/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/src/setup.py b/src/setup.py new file mode 100644 index 00000000..d1135d0b --- /dev/null +++ b/src/setup.py @@ -0,0 +1,35 @@ +import os + +from setuptools import setup + +here = os.path.abspath(os.path.dirname(__file__)) + +version_file = os.path.join(here, 'aim_ui/VERSION') +with open(version_file) as vf: + __version__ = vf.read().strip() + +# Package meta-data. +NAME = 'aim-ui' +DESCRIPTION = 'Aim UI' +VERSION = __version__ + + +def package_files(directory): + paths = [] + for (path, _, filenames) in os.walk(directory): + for filename in filenames: + paths.append(os.path.join('..', path, filename)) + return paths + + +# These are symlinks to main files +files = package_files('aim_ui/build') +files.append('../aim_ui/VERSION') + +setup( + name=NAME, + version=__version__, + description=DESCRIPTION, + packages=['aim_ui'], + package_data={'aim_ui': files} +) diff --git a/src/src/App.scss b/src/src/App.scss new file mode 100644 index 00000000..7e1ac126 --- /dev/null +++ b/src/src/App.scss @@ -0,0 +1,27 @@ +@import 'src/styles/base/_reset.scss'; +@import 'src/styles/components/_autocomplete.scss'; +@import 'src/styles/components/_tooltip.scss'; +@import 'src/styles/components/_inputs.scss'; +@import 'src/styles/_global.scss'; + +body { + -webkit-font-smoothing: antialiased; + overscroll-behavior: none; +} + +#root { + background-color: #ffff; +} +.mainContainer { + width: calc(100% - 75px); + height: 100%; +} + +.preloader-fade-out { + transition: 0.5s ease-out; + opacity: 0; +} +.pageContainer { + height: 100%; + display: flex; +} diff --git a/src/src/App.test.tsx b/src/src/App.test.tsx new file mode 100644 index 00000000..f7fd3928 --- /dev/null +++ b/src/src/App.test.tsx @@ -0,0 +1,13 @@ +import React from 'react'; + +import { render } from '@testing-library/react'; + +import App from './App'; + +//@TODO: The next action on this may try to solve the testing issues by going further with the components used here. + +test('renders learn react link', () => { + // render(); + // const linkElement = screen.getByText(/learn react/i); + // expect(linkElement).toBeInTheDocument(); +}); diff --git a/src/src/App.tsx b/src/src/App.tsx new file mode 100644 index 00000000..2572a4b7 --- /dev/null +++ b/src/src/App.tsx @@ -0,0 +1,90 @@ +import React from 'react'; +import { BrowserRouter, Switch, Route, Redirect } from 'react-router-dom'; + +import { loader } from '@monaco-editor/react'; + +import AlertBanner from 'components/kit/AlertBanner'; +import SideBar from 'components/SideBar/SideBar'; +import ProjectWrapper from 'components/ProjectWrapper/ProjectWrapper'; +import Theme from 'components/Theme/Theme'; +import BusyLoaderWrapper from 'components/BusyLoaderWrapper/BusyLoaderWrapper'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { checkIsBasePathInCachedEnv, getBasePath } from 'config/config'; + +import PageWrapper from 'pages/PageWrapper'; + +import routes from 'routes/routes'; + +import { inIframe } from 'utils/helper'; + +import './App.scss'; + +const basePath = getBasePath(false); + +const isVisibleCacheBanner = checkIsBasePathInCachedEnv(basePath) && inIframe(); + +// loading monaco from node modules instead of CDN +loader.config({ + paths: { + vs: `${getBasePath()}/static-files/vs`, + }, +}); + +function App(): React.FunctionComponentElement { + React.useEffect(() => { + let timeoutId: number; + const preloader = document.getElementById('preload-spinner'); + if (preloader) { + preloader.classList.add('preloader-fade-out'); + timeoutId = window.setTimeout(() => { + preloader.remove(); + }, 500); + } + return () => { + window.clearTimeout(timeoutId); + }; + }, []); + + return ( + + + + {isVisibleCacheBanner && ( + + You are using UI from notebook env, please make sure to + keep server running for a better experience + + )} +
+ + + +
+ } + > + + {Object.values(routes).map((route, index) => { + const { component: Component, path, isExact, title } = route; + return ( + + + + + + + + ); + })} + + + +
+
+
+
+ ); +} + +export default App; diff --git a/src/src/assets/experiments.svg b/src/src/assets/experiments.svg new file mode 100644 index 00000000..6b5f7f33 --- /dev/null +++ b/src/src/assets/experiments.svg @@ -0,0 +1,15 @@ + + + + + Experiments + + + + diff --git a/src/src/assets/icons/arrow-up.svg b/src/src/assets/icons/arrow-up.svg new file mode 100644 index 00000000..75103640 --- /dev/null +++ b/src/src/assets/icons/arrow-up.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/src/assets/icons/debug.svg b/src/src/assets/icons/debug.svg new file mode 100644 index 00000000..93d065b8 --- /dev/null +++ b/src/src/assets/icons/debug.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/src/src/assets/icons/discord.svg b/src/src/assets/icons/discord.svg new file mode 100644 index 00000000..20d0506c --- /dev/null +++ b/src/src/assets/icons/discord.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/src/assets/icons/github.svg b/src/src/assets/icons/github.svg new file mode 100644 index 00000000..d3ec91a1 --- /dev/null +++ b/src/src/assets/icons/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/src/assets/icons/notifications/error.svg b/src/src/assets/icons/notifications/error.svg new file mode 100644 index 00000000..c64ee8e0 --- /dev/null +++ b/src/src/assets/icons/notifications/error.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/src/assets/icons/notifications/info.svg b/src/src/assets/icons/notifications/info.svg new file mode 100644 index 00000000..6cc2fda3 --- /dev/null +++ b/src/src/assets/icons/notifications/info.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/src/assets/icons/notifications/success.svg b/src/src/assets/icons/notifications/success.svg new file mode 100644 index 00000000..1b7fe653 --- /dev/null +++ b/src/src/assets/icons/notifications/success.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/src/assets/icons/notifications/warning.svg b/src/src/assets/icons/notifications/warning.svg new file mode 100644 index 00000000..986f40cc --- /dev/null +++ b/src/src/assets/icons/notifications/warning.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/src/assets/icons/slack.svg b/src/src/assets/icons/slack.svg new file mode 100644 index 00000000..867ac3eb --- /dev/null +++ b/src/src/assets/icons/slack.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/src/assets/illustrations/emptyBookmarks.svg b/src/src/assets/illustrations/emptyBookmarks.svg new file mode 100644 index 00000000..79e62c3c --- /dev/null +++ b/src/src/assets/illustrations/emptyBookmarks.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/src/assets/illustrations/emptySearch.svg b/src/src/assets/illustrations/emptySearch.svg new file mode 100644 index 00000000..29e61e81 --- /dev/null +++ b/src/src/assets/illustrations/emptySearch.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/src/assets/illustrations/exploreData.svg b/src/src/assets/illustrations/exploreData.svg new file mode 100644 index 00000000..4df3a3d0 --- /dev/null +++ b/src/src/assets/illustrations/exploreData.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/src/assets/illustrations/wrongSearch.svg b/src/src/assets/illustrations/wrongSearch.svg new file mode 100644 index 00000000..22f41717 --- /dev/null +++ b/src/src/assets/illustrations/wrongSearch.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/src/assets/logo.svg b/src/src/assets/logo.svg new file mode 100644 index 00000000..1e1243af --- /dev/null +++ b/src/src/assets/logo.svg @@ -0,0 +1,29 @@ + + + + + Aim Logo + + diff --git a/src/src/assets/polka-dots.svg b/src/src/assets/polka-dots.svg new file mode 100644 index 00000000..a4c5786a --- /dev/null +++ b/src/src/assets/polka-dots.svg @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/src/src/assets/runs.svg b/src/src/assets/runs.svg new file mode 100644 index 00000000..07b73718 --- /dev/null +++ b/src/src/assets/runs.svg @@ -0,0 +1,15 @@ + + + + + Runs + + + + diff --git a/src/src/components/AggregationPopover/AggregationPopover.scss b/src/src/components/AggregationPopover/AggregationPopover.scss new file mode 100644 index 00000000..90e9f6f6 --- /dev/null +++ b/src/src/components/AggregationPopover/AggregationPopover.scss @@ -0,0 +1,13 @@ +@use 'src/styles/abstracts' as *; + +.AggregationPopover { + width: 16.5rem; + padding: $space-xs; + &__subtitle { + padding: $space-xs; + text-transform: uppercase; + } + &__Divider { + margin: $space-xs 0; + } +} diff --git a/src/src/components/AggregationPopover/AggregationPopover.tsx b/src/src/components/AggregationPopover/AggregationPopover.tsx new file mode 100644 index 00000000..c185bc34 --- /dev/null +++ b/src/src/components/AggregationPopover/AggregationPopover.tsx @@ -0,0 +1,148 @@ +import React from 'react'; + +import { Divider, MenuItem } from '@material-ui/core'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IAggregationPopoverProps } from 'types/components/AggregationPopover/AggregationPopover'; + +import { + AggregationAreaMethods, + AggregationLineMethods, +} from 'utils/aggregateGroupData'; + +import './AggregationPopover.scss'; + +function AggregationPopover({ + aggregationConfig, + onChange, +}: IAggregationPopoverProps): React.FunctionComponentElement { + function handleClick(e: React.ChangeEvent): void { + const methodKey: 'area' | 'line' = e.target?.getAttribute('property'); + const value = e.target?.getAttribute('data-name'); + if ( + methodKey && + value && + aggregationConfig.methods[methodKey] !== parseInt(value) && + typeof onChange === 'function' + ) { + onChange({ + methods: { + ...aggregationConfig.methods, + [methodKey]: parseInt(value), + }, + }); + } + } + + return ( + +
+ + Select Line: + +
+ + Mean + + + Median + + + Min + + + Max + +
+ + + Select Area: + +
+ + None + + + Min/Max + + + Mean ± Standard Deviation + + + Mean ± Standard Error + + + Confidence Interval (95%) + +
+
+
+ ); +} + +export default React.memo(AggregationPopover); diff --git a/src/src/components/AppBar/AppBar.scss b/src/src/components/AppBar/AppBar.scss new file mode 100644 index 00000000..0a60bc20 --- /dev/null +++ b/src/src/components/AppBar/AppBar.scss @@ -0,0 +1,28 @@ +@use 'src/styles/abstracts' as *; + +.AppBar { + display: flex; + align-items: center; + min-height: 2.5rem; + max-height: 2.5rem; + border-bottom: $border-main; + border-left: $border-main; + border-right: $border-main; + padding-left: 1.5rem; + background: $white; + z-index: 1; + &__title { + flex: 1; + text-transform: uppercase; + letter-spacing: 0.07em; + } + + &__content { + display: flex; + align-items: center; + &--disabled { + pointer-events: none; + opacity: 0.5; + } + } +} diff --git a/src/src/components/AppBar/AppBar.tsx b/src/src/components/AppBar/AppBar.tsx new file mode 100644 index 00000000..6d4b667b --- /dev/null +++ b/src/src/components/AppBar/AppBar.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IAppBarProps } from 'types/components/AppBar/AppBar'; + +import './AppBar.scss'; + +function AppBar( + props: IAppBarProps, +): React.FunctionComponentElement { + return ( + +
+ + {props.title} + + {props.children && ( +
+ {props.children} +
+ )} +
+
+ ); +} + +export default AppBar; diff --git a/src/src/components/AttachedTagsList/AttachedTagsList.scss b/src/src/components/AttachedTagsList/AttachedTagsList.scss new file mode 100644 index 00000000..0b4ebc67 --- /dev/null +++ b/src/src/components/AttachedTagsList/AttachedTagsList.scss @@ -0,0 +1,115 @@ +@use 'src/styles/abstracts' as *; + +.AttachedTagsList { + display: flex; + justify-content: space-between; + align-items: baseline; + font-size: $text-sm; + line-height: 15px; + position: relative; + margin-top: $space-xs; + + &__title { + text-transform: uppercase; + color: $pico-50; + font-weight: $font-500; + } + + &__noAttachedTags { + font-weight: $font-500; + font-size: $text-sm; + color: $pico-70; + margin-right: $space-unit; + } + + &__tags { + display: flex; + flex-wrap: wrap; + overflow: hidden; + &__tagWrapper { + max-width: 100%; + } + + .Badge { + margin-bottom: $space-xs; + margin-right: $space-xs; + max-width: 100%; + } + } + + &__ControlPopover__anchor { + max-width: 100%; + .icon-edit { + width: 1.5rem; + height: 1.5rem; + display: flex; + align-items: center; + justify-content: center; + color: $pico-50; + } + + &.active { + .icon-edit { + color: $pico-70; + } + } + } + + &__ControlPopover__attach { + .icon-plus { + margin-right: $space-xs; + } + } + + &__ControlPopover__editPopoverButton { + position: absolute; + top: toRem(-26px); + right: 0; + } +} + +.InlineAttachedTagsList { + margin-top: 0; + align-items: center; + max-width: 100%; + width: 100%; + .AttachedTagsList__ControlPopover__anchor { + max-width: 100%; + width: 100%; + } + .AttachedTagsList__tags { + align-items: center; + flex-wrap: unset; + overflow: hidden; + .Badge { + margin-bottom: 0; + } + } + &__tagsContainer { + max-width: 20rem; + width: 20rem; + &__tags { + padding: $space-xs $space-unit; + overflow: auto; + display: flex; + flex-wrap: wrap; + max-height: 50vh; + + .Badge { + margin: 0; + max-width: unset; + cursor: pointer; + } + + .icon-check { + padding: 0; + } + + &__badge { + display: inline-block; + margin-bottom: $space-xs; + margin-right: $space-xs; + } + } + } +} diff --git a/src/src/components/AttachedTagsList/AttachedTagsList.tsx b/src/src/components/AttachedTagsList/AttachedTagsList.tsx new file mode 100644 index 00000000..a9f2a47b --- /dev/null +++ b/src/src/components/AttachedTagsList/AttachedTagsList.tsx @@ -0,0 +1,160 @@ +import React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import { Box, Tooltip } from '@material-ui/core'; + +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import { Button, Icon, Badge, Text } from 'components/kit'; +import SelectTag from 'components/SelectTag/SelectTag'; +import ErrorBoundary from 'components/ErrorBoundary'; + +import runsService from 'services/api/runs/runsService'; + +import { ITagInfo } from 'types/pages/tags/Tags'; +import { IAttachedTagsListProps } from 'types/components/AttachedTagsList/AttachedTagsList'; + +import './AttachedTagsList.scss'; + +function AttachedTagsList({ + runHash, + initialTags, + tags, + headerRenderer, + addTagButtonSize = 'xSmall', + onTagsChange, + onRunsTagsChange, + inlineAttachedTagsList = false, +}: IAttachedTagsListProps) { + const [attachedTags, setAttachedTags] = React.useState( + tags ?? initialTags ?? [], + ); + const [, setSelectTagPopoverKey] = React.useState(`${Date.now()}`); + const getRunInfoRef = React.useRef(null); + + const getRunInfo = React.useCallback((runHash: string): void => { + getRunInfoRef.current = runsService?.getRunInfo(runHash); + getRunInfoRef.current.call().then((runInfo: any) => { + setAttachedTags(runInfo?.props?.tags || []); + }); + }, []); + + React.useEffect(() => { + if (runHash) { + if (!initialTags && !tags) { + getRunInfo(runHash); + } + } + return () => { + getRunInfoRef.current?.abort(); + }; + }, [runHash, initialTags, getRunInfo, tags]); + + React.useEffect(() => { + if (tags) { + setAttachedTags(tags); + } + }, [tags]); + + React.useEffect(() => { + if (onTagsChange) { + onTagsChange(attachedTags); + } + }, [attachedTags, onTagsChange]); + + const renderTagsBadges = React.useCallback(() => { + if (!_.isEmpty(attachedTags)) { + return ( +
+ {attachedTags.map((tag: ITagInfo) => ( + +
+ +
+
+ ))} +
+ ); + } + + return ( +
+ {inlineAttachedTagsList ? 'Click to edit tags' : 'No attached tags'} +
+ ); + }, [attachedTags, inlineAttachedTagsList]); + + const renderAddTagsButton = React.useCallback(() => { + return ( + + ); + }, [addTagButtonSize]); + + return ( + + <> + {typeof headerRenderer === 'function' ? ( + headerRenderer(attachedTags?.length) + ) : ( + + Tags {!_.isEmpty(attachedTags) ? `(${attachedTags.length})` : null} + + )} + + {!inlineAttachedTagsList && renderTagsBadges()} + + ( +
+ {inlineAttachedTagsList && renderTagsBadges()} + {!inlineAttachedTagsList && renderAddTagsButton()} +
+ )} + component={ + + } + /> +
+ +
+ ); +} + +export default React.memo(AttachedTagsList); diff --git a/src/src/components/AutocompleteInput/AutocompleteInput.d.ts b/src/src/components/AutocompleteInput/AutocompleteInput.d.ts new file mode 100644 index 00000000..1e7c1890 --- /dev/null +++ b/src/src/components/AutocompleteInput/AutocompleteInput.d.ts @@ -0,0 +1,24 @@ +import * as monaco from 'monaco-editor'; +import React from 'react'; + +import { EditorProps } from '@monaco-editor/react'; + +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; + +export interface IAutocompleteInputProps { + context: Record; + className?: string; + editorProps?: EditorProps; + advanced?: boolean; + disabled?: boolean; + value: string | undefined; + refObject?: React.MutableRefObject; + getEditorValue?: (value: string) => string; + onEnter?: () => void; + onChange?: ( + val: string, + ev?: monaco.editor.IModelContentChangedEvent, + ) => void; + error?: ISyntaxErrorDetails; + forceRemoveError?: boolean; +} diff --git a/src/src/components/AutocompleteInput/AutocompleteInput.scss b/src/src/components/AutocompleteInput/AutocompleteInput.scss new file mode 100644 index 00000000..0e66624d --- /dev/null +++ b/src/src/components/AutocompleteInput/AutocompleteInput.scss @@ -0,0 +1,110 @@ +@use 'src/styles/abstracts' as *; + +.AutocompleteInput { + position: relative; + z-index: 5; + &__disabled { + pointer-events: none; + opacity: 0.5; + } + &__errorBar { + top: calc(100% - 4px); + left: 0; + position: absolute; + padding: $space-unit; + z-index: 3; + border: 0.0625rem solid $error-color-25; + width: 100%; + background-color: $error-color-5; + border-bottom-left-radius: $border-radius-main; + border-bottom-right-radius: $border-radius-main; + &__message { + @include monospaceFontFamily(16); + span { + margin-right: $space-sm; + } + } + &__hint { + color: #4a1212; + display: flex; + align-items: center; + padding: $space-sm 1rem $space-sm 0; + border: 0.0625rem solid $error-color-25; + margin-top: $space-sm; + background-color: $white; + border-radius: $radius-main; + .Text { + color: #4a1212; + } + .Icon__container { + margin-left: toRem(10px); + margin-right: $space-xs; + } + a { + text-decoration: none; + color: $primary-color; + } + } + } + + &__container { + height: 2rem; + max-width: 100vw; + border: $border-grey-light; + display: flex; + align-items: center; + border-radius: $border-radius-main; + padding: $space-xs; + position: relative; + z-index: 4; + background-color: $white; + &:hover { + border: 0.0625rem solid $cuddle-110; + } + &__focused { + border: 0.0625rem solid $cuddle-110; + } + &__advanced { + height: 4.5rem; + align-items: flex-start; + padding: $space-xxxs $space-xs; + } + &__placeholder { + position: absolute; + left: $space-xs; + color: $text-color-50; + max-width: 95%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: $text-lg; + @include monospaceFontFamily(); + } + + &__error { + border-color: $error-color-80; + &:hover { + border-color: $error-color-80; + } + } + .details-label { + width: auto !important; + } + .codicon-suggest-more-info { + display: none !important; + } + + .scroll-decoration { + box-shadow: unset !important; + } + .monaco-editor .find-widget.visible { + display: none !important; + } + .monaco-hover { + display: none !important; + } + .monaco-editor .squiggly-error { + background: url('../../assets/icons/arrow-up.svg') repeat-x bottom left; + } + } +} diff --git a/src/src/components/AutocompleteInput/AutocompleteInput.tsx b/src/src/components/AutocompleteInput/AutocompleteInput.tsx new file mode 100644 index 00000000..fd3115ab --- /dev/null +++ b/src/src/components/AutocompleteInput/AutocompleteInput.tsx @@ -0,0 +1,284 @@ +import React from 'react'; +import classNames from 'classnames'; +import * as monacoEditor from 'monaco-editor'; +import _ from 'lodash-es'; + +import Editor, { useMonaco } from '@monaco-editor/react'; + +import { Icon, Text } from 'components/kit'; + +import { getMonacoConfig } from 'config/monacoConfig/monacoConfig'; +import { DOCUMENTATIONS } from 'config/references'; + +import { showAutocompletion } from 'utils/showAutocompletion'; + +import { IAutocompleteInputProps } from './AutocompleteInput.d'; + +import './AutocompleteInput.scss'; + +function AutocompleteInput({ + context, + advanced, + className, + editorProps = {}, + value = '', + refObject, + error, + disabled = false, + forceRemoveError = false, + //callback functions + onEnter, + onChange, +}: IAutocompleteInputProps) { + const [hasSelection, setHasSelection] = React.useState(false); + const [containerWidth, setContainerWidth] = React.useState(0); + const [focused, setFocused] = React.useState(false); + const [mounted, setMounted] = React.useState(false); + const [editorValue, setEditorValue] = React.useState(value); + const [errorMessage, setErrorMessage] = React.useState(''); + const monaco: any = useMonaco(); + const editorRef = React.useRef(); + + React.useEffect(() => { + initializeTheme(); + if (mounted) { + monaco.editor.defineTheme( + monacoConfig.theme.name, + monacoConfig.theme.config, + ); + monaco.editor.setTheme(monacoConfig.theme.name); + } + const onResize = _.debounce(() => { + setContainerWidth(window.innerWidth); + }, 500); + window.addEventListener('resize', onResize); + // inserting given object for autosuggestion + handleBlur(); + const disposable = showAutocompletion(monaco, context); + return () => { + disposable?.dispose(); + window.removeEventListener('resize', onResize); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [monaco, context, mounted]); + + React.useEffect(() => { + setTimeout(() => { + initializeTheme(); + setMarkers(); + }, 100); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [containerWidth]); + + React.useEffect(() => { + setMarkers(); + if (forceRemoveError && !error) { + setErrorMessage(''); + deleteMarkers(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [error, monaco, forceRemoveError]); + + React.useEffect(() => { + if (focused) { + editorRef.current?.focus(); + } + }, [focused, mounted]); + + React.useEffect(() => { + if (value !== editorValue) { + setEditorValue(value); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [value]); + + React.useEffect(() => { + setTimeout(() => { + initializeTheme(); + }, 100); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [containerWidth]); + + const monacoConfig: Record = React.useMemo(() => { + return getMonacoConfig(advanced); + }, [advanced]); + + const handleFocus: () => void = React.useCallback((): void => { + setFocused(true); + }, []); + + const handleBlur: () => void = React.useCallback((): void => { + setFocused(false); + }, []); + + function handleDidMount(editor: monacoEditor.editor.IStandaloneCodeEditor) { + setMounted(true); + editorRef.current = editor; + if (refObject) { + refObject.current = editorRef.current; + } + editorRef.current.onDidFocusEditorWidget(handleFocus); + editorRef.current.onDidBlurEditorWidget(handleBlur); + editorRef.current.onDidChangeCursorSelection(onSelectionChange); + } + + function setMarkers(): void { + if (monaco && error) { + setErrorMessage(error?.message); + monaco.editor.setModelMarkers(monaco.editor.getModels()[0], 'marker', [ + { + startLineNumber: error?.detail.line, + startColumn: error?.detail.offset, + endLineNumber: error?.detail.line, + endColumn: error?.detail?.end_offset || error?.detail.offset, + message: error?.message, + severity: monaco.MarkerSeverity.Error, + }, + ]); + } + } + + function deleteMarkers() { + if (monaco?.editor) { + monaco.editor.setModelMarkers(monaco.editor.getModels()[0], 'marker', []); + } + } + + function onSelectionChange( + e: monacoEditor.editor.ICursorSelectionChangedEvent, + ) { + if (e.selection) { + const { startColumn, endColumn } = e.selection; + const selectionPosition = startColumn !== endColumn; + setHasSelection(selectionPosition); + } + } + + const handleChange = React.useCallback( + ( + val: string | undefined, + ev: monacoEditor.editor.IModelContentChangedEvent, + ) => { + if (disabled) { + editorRef.current!.setValue(editorValue); + return; + } + deleteMarkers(); + setErrorMessage(''); + if (typeof val === 'string') { + // formatting value to avoid the new line + let formattedValue = val.replace(/[\n\r]/g, ''); + if ( + ev.changes[0].text.startsWith('[') && + formattedValue[ev.changes[0].rangeOffset - 1] === '.' + ) { + formattedValue = + formattedValue.slice(0, ev.changes[0].rangeOffset - 1) + + formattedValue.slice( + ev.changes[0].rangeOffset, + formattedValue.length, + ); + } + //@TODO: check why the onCHange function have been called in the if (ev.changes[0].text === '\n') { scope + if (onChange) { + // formattedValue = hasSelection + // ? editorValue.replace(/[\n\r]/g, '') + // : formattedValue; + onChange(formattedValue, ev); + } + if (ev.changes[0].text === '\n') { + formattedValue = hasSelection + ? editorValue.replace(/[\n\r]/g, '') + : formattedValue; + editorRef.current!.setValue(formattedValue); + if (onEnter) { + onEnter(); + } + setEditorValue(formattedValue); + return; + } + setEditorValue(formattedValue); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [hasSelection, onChange, onEnter, disabled], + ); + + function initializeTheme(): void { + if (mounted) { + monaco.editor.defineTheme( + monacoConfig.theme.name, + monacoConfig.theme.config, + ); + monaco.editor.setTheme(monacoConfig.theme.name); + } + } + + return ( +
+ ); +} + +AutocompleteInput.displayName = 'AutocompleteInput'; + +export default React.memo(AutocompleteInput); diff --git a/src/src/components/AutocompleteInput/index.ts b/src/src/components/AutocompleteInput/index.ts new file mode 100644 index 00000000..04935562 --- /dev/null +++ b/src/src/components/AutocompleteInput/index.ts @@ -0,0 +1,5 @@ +import AutocompleteInput from './AutocompleteInput'; + +export * from './AutocompleteInput'; + +export default AutocompleteInput; diff --git a/src/src/components/AxesPropsPopover/AxesPropsPopover.d.ts b/src/src/components/AxesPropsPopover/AxesPropsPopover.d.ts new file mode 100644 index 00000000..753e26e8 --- /dev/null +++ b/src/src/components/AxesPropsPopover/AxesPropsPopover.d.ts @@ -0,0 +1,27 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; +import { IAlignmentConfig } from 'types/services/models/metrics/metricsAppModel'; +import { ISelectOption } from 'types/services/models/explorer/createAppModel'; + +export interface IAxesPropsPopoverProps { + onAlignmentMetricChange: IMetricProps['onAlignmentMetricChange']; + onAlignmentTypeChange: IMetricProps['onAlignmentTypeChange']; + alignmentConfig: IAlignmentConfig; + selectFormOptions: ISelectOption[]; + axesScaleRange: IAxesScaleRange; + onAxesScaleRangeChange: IMetricProps['onAxesScaleRangeChange']; +} + +export interface IAxesScaleRange { + yAxis: { min?: number; max?: number }; + xAxis: { min?: number; max?: number }; +} + +export interface IAxesRangeValue { + min?: number; + max?: number; +} + +export interface IAxesRangeValidation { + min: boolean; + max: boolean; +} diff --git a/src/src/components/AxesPropsPopover/AxesPropsPopover.scss b/src/src/components/AxesPropsPopover/AxesPropsPopover.scss new file mode 100644 index 00000000..14570ea4 --- /dev/null +++ b/src/src/components/AxesPropsPopover/AxesPropsPopover.scss @@ -0,0 +1,49 @@ +@use 'src/styles/abstracts' as *; + +.AxesPropsPopover { + width: 24.375rem; + padding: $space-xs; + &__subtitle { + padding-block: $space-xs; + text-transform: uppercase; + } + &__divider { + margin: $space-xs 0; + } + &__range, &__alignment { + padding: $space-xs; + } + &__range { + &__container { + display: flex; + align-items: center; + &.yAxis { + margin-top: $space-sm; + } + } + } + + .scaleRangeInputs { + &__label { + margin-right: auto; + } + &__min, &__max { + display: inline-block; + width: 6.875rem; + margin-right: $space-xs; + } + + &__resetButton { + color: $pico-80; + border: 0.0625rem solid $cuddle; + &.Mui-disabled { + color: $pico-50; + border-color: $cuddle-50; + } + &.active { + border: $border-main-active; + background-color: $primary-color-5; + } + } + } +} diff --git a/src/src/components/AxesPropsPopover/AxesPropsPopover.tsx b/src/src/components/AxesPropsPopover/AxesPropsPopover.tsx new file mode 100644 index 00000000..40196df0 --- /dev/null +++ b/src/src/components/AxesPropsPopover/AxesPropsPopover.tsx @@ -0,0 +1,310 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { Divider } from '@material-ui/core'; + +import { + Text, + SelectDropdown, + InputWrapper, + Icon, + Button, +} from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { isSystemMetric } from 'utils/isSystemMetric'; +import { AlignmentOptionsEnum } from 'utils/d3'; + +import { ISelectDropdownOption as ISelectOption } from '../kit/SelectDropdown'; + +import { + IAxesPropsPopoverProps, + IAxesRangeValidation, + IAxesRangeValue, + DROPDOWN_LIST_HEIGHT, + METRICS_ALIGNMENT_LIST, + RANGE_DEBOUNCE_DELAY, +} from './'; + +import './AxesPropsPopover.scss'; + +function AxesPropsPopover({ + onAlignmentTypeChange, + onAlignmentMetricChange, + onAxesScaleRangeChange, + alignmentConfig, + selectFormOptions, + axesScaleRange, +}: IAxesPropsPopoverProps): React.FunctionComponentElement { + const [yScaleRange, setYScaleRange] = React.useState({}); + const [isYScaleRangeValid, setIsYScaleRangeValid] = + React.useState({ + min: true, + max: true, + }); + const [xScaleRange, setXScaleRange] = React.useState({}); + const [isXScaleRangeValid, setIsXScaleRangeValid] = + React.useState({ + min: true, + max: true, + }); + + const handleAlignmentChange = React.useCallback( + (option: ISelectOption): void => { + if (option) { + if (option.group === 'METRIC') { + onAlignmentMetricChange(option.value); + } else { + onAlignmentTypeChange(option.value as AlignmentOptionsEnum); + } + } + }, + [onAlignmentMetricChange, onAlignmentTypeChange], + ); + + const alignmentOptions: ISelectOption[] = React.useMemo(() => { + let metricOptions: { value: string; label: string; group: string }[] = []; + if (selectFormOptions) { + for (let option of selectFormOptions) { + if ( + option?.value?.option_name && + option?.value?.context === null && + !isSystemMetric(option.value.option_name) + ) { + metricOptions.push({ + value: option.label, + label: option.label, + group: 'METRIC', + }); + } + } + } + return METRICS_ALIGNMENT_LIST.concat(metricOptions); + }, [selectFormOptions]); + + const selected = React.useMemo(() => { + return alignmentConfig?.type === AlignmentOptionsEnum.CUSTOM_METRIC + ? alignmentConfig.metric + : alignmentConfig.type; + }, [alignmentConfig]); + + const axesProps = React.useMemo( + () => ({ + xAxis: { + scaleRange: xScaleRange, + setScaleRange: setXScaleRange, + setIsScaleRangeValid: setIsXScaleRangeValid, + }, + yAxis: { + scaleRange: yScaleRange, + setScaleRange: setYScaleRange, + setIsScaleRangeValid: setIsYScaleRangeValid, + }, + }), + [xScaleRange, yScaleRange], + ); + + const onScaleRangeChange = React.useCallback( + ( + e: React.ChangeEvent, + value: any, + metadata: any = { isValid: true }, + ) => { + const [axisType, key] = (e.target?.id || '').split('-') as [ + axisType: 'xAxis' | 'yAxis', + key: 'min' | 'max', + ]; + if (axisType && key) { + const { setScaleRange, setIsScaleRangeValid, scaleRange } = + axesProps[axisType]; + setScaleRange((prev) => ({ + ...prev, + [key]: value, + })); + setIsScaleRangeValid({ + min: true, + max: true, + [key]: metadata.isValid, + }); + if (metadata.isValid) { + onAxesScaleRangeChange({ + [axisType]: { ...scaleRange, [key]: value }, + }); + } + } + }, + [onAxesScaleRangeChange, axesProps], + ); + + const onResetRange = React.useCallback( + (axisType: 'xAxis' | 'yAxis') => { + onAxesScaleRangeChange({ + [axisType]: { min: undefined, max: undefined }, + }); + }, + [onAxesScaleRangeChange], + ); + + const validationPatterns = React.useMemo( + () => ({ + min: (max?: number) => [ + { + errorCondition: (value: number) => + max === undefined ? false : value > max, + errorText: `Value should be equal or smaller then ${max}`, + }, + ], + max: (min?: number) => [ + { + errorCondition: (value: number) => + min === undefined ? false : value < min, + errorText: `Value should be equal or greater then ${min}`, + }, + ], + }), + [], + ); + + React.useEffect(() => { + setXScaleRange((prevState) => + _.isEqual(axesScaleRange.xAxis, prevState) + ? prevState + : axesScaleRange.xAxis, + ); + setYScaleRange((prevState) => + _.isEqual(axesScaleRange.yAxis, prevState) + ? prevState + : axesScaleRange.yAxis, + ); + }, [axesScaleRange]); + + const xResetBtnDisabled = React.useMemo( + () => xScaleRange.min === undefined && xScaleRange.max === undefined, + [xScaleRange], + ); + const yResetBtnDisabled = React.useMemo( + () => yScaleRange.min === undefined && yScaleRange.max === undefined, + [yScaleRange], + ); + return ( + +
+
+ + X AXIS ALIGNMENT: + + +
+ +
+ + SET AXES RANGE: + +
+ + X-axis + + + + +
+
+ + Y-axis + + + + +
+
+
+
+ ); +} + +export default React.memo(AxesPropsPopover); diff --git a/src/src/components/AxesPropsPopover/config.ts b/src/src/components/AxesPropsPopover/config.ts new file mode 100644 index 00000000..9a0048d2 --- /dev/null +++ b/src/src/components/AxesPropsPopover/config.ts @@ -0,0 +1,27 @@ +import { AlignmentOptionsEnum } from 'utils/d3'; + +export const METRICS_ALIGNMENT_LIST: { + value: string; + label: string; + group?: string; +}[] = [ + { + value: AlignmentOptionsEnum.STEP, + label: 'Step', + }, + { + value: AlignmentOptionsEnum.EPOCH, + label: 'Epoch', + }, + { + value: AlignmentOptionsEnum.RELATIVE_TIME, + label: 'Relative Time', + }, + { + value: AlignmentOptionsEnum.ABSOLUTE_TIME, + label: 'Absolute Time', + }, +]; + +export const DROPDOWN_LIST_HEIGHT = 253; +export const RANGE_DEBOUNCE_DELAY = 300; diff --git a/src/src/components/AxesPropsPopover/index.ts b/src/src/components/AxesPropsPopover/index.ts new file mode 100644 index 00000000..ffffde46 --- /dev/null +++ b/src/src/components/AxesPropsPopover/index.ts @@ -0,0 +1,7 @@ +import AxesPropsPopover from './AxesPropsPopover'; + +export * from './AxesPropsPopover.d'; + +export * from './config'; + +export default AxesPropsPopover; diff --git a/src/src/components/AxesScalePopover/AxesScalePopover.scss b/src/src/components/AxesScalePopover/AxesScalePopover.scss new file mode 100644 index 00000000..04857074 --- /dev/null +++ b/src/src/components/AxesScalePopover/AxesScalePopover.scss @@ -0,0 +1,17 @@ +@use 'src/styles/abstracts' as *; + +.AxesScalePopover { + width: 21.5rem; + padding: 1rem; + + &__subtitle { + text-transform: uppercase; + } + + &__select { + display: flex; + align-items: center; + justify-content: space-between; + margin-top: $space-xs; + } +} diff --git a/src/src/components/AxesScalePopover/AxesScalePopover.tsx b/src/src/components/AxesScalePopover/AxesScalePopover.tsx new file mode 100644 index 00000000..f5867ca7 --- /dev/null +++ b/src/src/components/AxesScalePopover/AxesScalePopover.tsx @@ -0,0 +1,66 @@ +import React from 'react'; + +import { Text, ToggleButton } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { + IAxesScalePopoverProps, + IAxesScaleState, +} from 'types/components/AxesScalePopover/AxesScalePopover'; + +import { ScaleEnum } from 'utils/d3'; + +import './AxesScalePopover.scss'; + +function AxesScalePopover( + props: IAxesScalePopoverProps, +): React.FunctionComponentElement { + function handleScaleChange(val: string | number, id: any) { + const scaleParams: IAxesScaleState = { + ...props.axesScaleType, + [id]: val, + }; + props.onAxesScaleTypeChange(scaleParams); + } + + return ( + +
+ + Select Axes Scale: + +
+ +
+
+ +
+
+
+ ); +} + +export default React.memo(AxesScalePopover); diff --git a/src/src/components/BookmarkForm/BookmarkForm.tsx b/src/src/components/BookmarkForm/BookmarkForm.tsx new file mode 100644 index 00000000..50c8dd8b --- /dev/null +++ b/src/src/components/BookmarkForm/BookmarkForm.tsx @@ -0,0 +1,105 @@ +import React, { useState } from 'react'; + +import { + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + TextField, +} from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { + IBookmarkFormState, + IBookmarkFormProps, +} from 'types/components/BookmarkForm/BookmarkForm'; + +const initialState: IBookmarkFormState = { name: '', description: '' }; +function BookmarkForm({ + open, + onClose, + onBookmarkCreate, +}: IBookmarkFormProps): React.FunctionComponentElement { + const [state, setState] = useState(initialState); + const [hasError, setHasError] = useState(false); + const [isTouched, setIsTouched] = useState(false); + + function onSubmit(): void { + if (state.name) { + onBookmarkCreate(state); + setHasError(false); + setState({ name: '', description: '' }); + onClose(); + } else { + setHasError(true); + setIsTouched(true); + } + } + + function handleInputChange(e: React.ChangeEvent): void { + const { id, value } = e.target; + const newState = { ...state }; + newState[id as keyof IBookmarkFormState] = value; + setState(newState); + if (id === 'name') { + !isTouched && setIsTouched(true); + setHasError(!value); + } + } + + function handleClose() { + onClose(); + setHasError(false); + setIsTouched(false); + setState(initialState); + } + + return ( + + + Add Bookmark + + + + + + + + + + + ); +} + +export default BookmarkForm; diff --git a/src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.scss b/src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.scss new file mode 100644 index 00000000..a041f4a4 --- /dev/null +++ b/src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.scss @@ -0,0 +1,5 @@ +.BusyLoaderWrapper { + display: flex; + justify-content: center; + align-items: center; +} diff --git a/src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.tsx b/src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.tsx new file mode 100644 index 00000000..6c23c104 --- /dev/null +++ b/src/src/components/BusyLoaderWrapper/BusyLoaderWrapper.tsx @@ -0,0 +1,50 @@ +import React from 'react'; + +import { Skeleton } from '@material-ui/lab'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { Spinner } from 'components/kit'; + +import { IBusyLoaderWrapperProps } from 'types/components/BusyLoaderWrapper/BusyLoaderWrapper'; + +import './BusyLoaderWrapper.scss'; + +function BusyLoaderWrapper({ + isLoading = false, + className = '', + children, + loaderType = 'spinner', + loaderConfig = {}, + width = '100%', + height = 'auto', + loaderComponent, +}: IBusyLoaderWrapperProps): React.FunctionComponentElement | null { + function loaderRender(): React.ReactElement { + switch (loaderType) { + case 'skeleton': { + return ; + } + default: { + return ; + } + } + } + return ( + <> + {isLoading ? ( + +
+ {loaderComponent || loaderRender()} +
+
+ ) : children ? ( + children + ) : null} + + ); +} + +export default React.memo(BusyLoaderWrapper); diff --git a/src/src/components/ChartLoader/ChartLoader.scss b/src/src/components/ChartLoader/ChartLoader.scss new file mode 100644 index 00000000..5ec6a921 --- /dev/null +++ b/src/src/components/ChartLoader/ChartLoader.scss @@ -0,0 +1,34 @@ +@use 'src/styles/abstracts' as *; + +.ChartLoader { + height: 100%; + width: 100%; + display: flex; +} + +.ChartLoader__chart { + flex: 1 100%; + display: flex; + align-items: center; + justify-content: center; + border-right: $border-separator; + span { + margin-left: 3.625rem; + } +} + +.ChartLoader__controls { + width: 3.75rem; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + overflow: auto; + .MuiSkeleton-root { + &:first-child { + margin-top: 0.5rem; + } + border-radius: 0.25rem; + margin-bottom: 0.5rem; + } +} diff --git a/src/src/components/ChartLoader/ChartLoader.tsx b/src/src/components/ChartLoader/ChartLoader.tsx new file mode 100644 index 00000000..3415281c --- /dev/null +++ b/src/src/components/ChartLoader/ChartLoader.tsx @@ -0,0 +1,37 @@ +import React from 'react'; + +import { Skeleton } from '@material-ui/lab'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IChartLoaderProps } from 'types/components/ChartLoader/ChartLoader'; + +import './ChartLoader.scss'; + +function ChartLoader({ + controlsCount = 3, +}: IChartLoaderProps): React.FunctionComponentElement { + return ( + +
+
+ Loading... +
+ {controlsCount ? ( +
+ {[...Array(controlsCount)].map((i, index) => ( + + ))} +
+ ) : null} +
+
+ ); +} + +export default ChartLoader; diff --git a/src/src/components/ChartPanel/ChartGrid/ChartGrid.d.ts b/src/src/components/ChartPanel/ChartGrid/ChartGrid.d.ts new file mode 100644 index 00000000..0273a180 --- /dev/null +++ b/src/src/components/ChartPanel/ChartGrid/ChartGrid.d.ts @@ -0,0 +1,19 @@ +import React from 'react'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { IChartPanelProps } from 'types/components/ChartPanel/ChartPanel'; +import { ISyncHoverStateArgs } from 'types/utils/d3/drawHoverAttributes'; + +export interface IChartGridProps { + data: IChartPanelProps['data']; + chartType: IChartPanelProps['chartType']; + chartProps: IChartPanelProps['chartProps']; + chartRefs?: React.RefObject[]; + chartPanelOffsetHeight?: number; + nameKey?: string; + readOnly?: boolean; + syncHoverState?: (args: ISyncHoverStateArgs) => void; + resizeMode?: ResizeModeEnum; + onMount?: () => void; +} diff --git a/src/src/components/ChartPanel/ChartGrid/ChartGrid.scss b/src/src/components/ChartPanel/ChartGrid/ChartGrid.scss new file mode 100644 index 00000000..2e02b9be --- /dev/null +++ b/src/src/components/ChartPanel/ChartGrid/ChartGrid.scss @@ -0,0 +1,7 @@ +@use 'src/styles/abstracts' as *; + +.ChartGrid { + min-height: 50%; + padding: 4px; + box-shadow: -1px -1px 0 0 $grey-lighter; +} diff --git a/src/src/components/ChartPanel/ChartGrid/ChartGrid.tsx b/src/src/components/ChartPanel/ChartGrid/ChartGrid.tsx new file mode 100644 index 00000000..8cf9ce15 --- /dev/null +++ b/src/src/components/ChartPanel/ChartGrid/ChartGrid.tsx @@ -0,0 +1,63 @@ +import React from 'react'; + +import { Grid, GridSize } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { CHART_TYPES_CONFIG } from 'components/ChartPanel/config'; + +import { GRID_SIZE, CHART_GRID_PATTERN } from 'config/charts'; + +import { IChartGridProps } from '.'; + +import './ChartGrid.scss'; + +function ChartGrid({ + data, + chartType, + chartRefs = [], + nameKey, + chartProps, + readOnly = false, + syncHoverState, + resizeMode, + chartPanelOffsetHeight, + onMount, +}: IChartGridProps): React.FunctionComponentElement { + function getGridSize(dataLength: number, index: number): GridSize { + return ( + dataLength > 9 ? GRID_SIZE.S : CHART_GRID_PATTERN[dataLength][index] + ) as GridSize; + } + return ( + + {data.map((chartData: any, index: number) => { + const Component = CHART_TYPES_CONFIG[chartType]; + const gridSize = getGridSize(data.length, index); + return ( + + + + ); + })} + + ); +} + +ChartGrid.displayName = 'ChartGrid'; + +export default React.memo(ChartGrid); diff --git a/src/src/components/ChartPanel/ChartGrid/index.ts b/src/src/components/ChartPanel/ChartGrid/index.ts new file mode 100644 index 00000000..1f59d17f --- /dev/null +++ b/src/src/components/ChartPanel/ChartGrid/index.ts @@ -0,0 +1,5 @@ +import ChartGrid from './ChartGrid'; + +export * from './ChartGrid.d'; + +export default ChartGrid; diff --git a/src/src/components/ChartPanel/ChartLegends/ChartLegends.d.ts b/src/src/components/ChartPanel/ChartLegends/ChartLegends.d.ts new file mode 100644 index 00000000..4a9a1fd3 --- /dev/null +++ b/src/src/components/ChartPanel/ChartLegends/ChartLegends.d.ts @@ -0,0 +1,9 @@ +import { LegendsDataType } from 'types/services/models/metrics/metricsAppModel'; + +import { LegendsModeEnum } from 'utils/d3'; + +export interface IChartLegendsProps { + data?: LegendsDataType; + mode?: LegendsModeEnum; + readOnly?: boolean; +} diff --git a/src/src/components/ChartPanel/ChartLegends/ChartLegends.scss b/src/src/components/ChartPanel/ChartLegends/ChartLegends.scss new file mode 100644 index 00000000..817714ba --- /dev/null +++ b/src/src/components/ChartPanel/ChartLegends/ChartLegends.scss @@ -0,0 +1,25 @@ +@use 'src/styles/abstracts' as *; + +.ChartLegends { + padding: $space-xs; + background-color: white; + height: 100%; + width: 100%; + &.pinned { + position: relative; + } + &.unpinned { + position: absolute; + right: 0; + opacity: 0.8; + box-shadow: 0 0 0 1px $grey-lighter; + &:hover { + opacity: 1 + } + } + &__container { + height: 100%; + width: 100%; + overflow: auto; + } +} diff --git a/src/src/components/ChartPanel/ChartLegends/ChartLegends.tsx b/src/src/components/ChartPanel/ChartLegends/ChartLegends.tsx new file mode 100644 index 00000000..bce98967 --- /dev/null +++ b/src/src/components/ChartPanel/ChartLegends/ChartLegends.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { drawLegends, LegendsModeEnum } from 'utils/d3'; + +import { IChartLegendsProps } from '.'; + +import './ChartLegends.scss'; + +function ChartLegends(props: IChartLegendsProps) { + const { data = {}, mode = LegendsModeEnum.PINNED, readOnly = false } = props; + const dataRef = React.useRef({}); + const containerRef = React.useRef(null); + + React.useEffect(() => { + if (containerRef.current && !_.isEqual(dataRef.current, data)) { + dataRef.current = data; + drawLegends({ + data, + containerNode: containerRef.current, + readOnly, + }); + } + }, [data, readOnly]); + + return ( + +
+
+
+ + ); +} + +ChartLegends.displayName = 'ChartLegends'; + +export default React.memo(ChartLegends); diff --git a/src/src/components/ChartPanel/ChartLegends/index.ts b/src/src/components/ChartPanel/ChartLegends/index.ts new file mode 100644 index 00000000..8ac3ad00 --- /dev/null +++ b/src/src/components/ChartPanel/ChartLegends/index.ts @@ -0,0 +1,5 @@ +import ChartLegends from './ChartLegends'; + +export * from './ChartLegends.d'; + +export default ChartLegends; diff --git a/src/src/components/ChartPanel/ChartPanel.scss b/src/src/components/ChartPanel/ChartPanel.scss new file mode 100644 index 00000000..15207d1b --- /dev/null +++ b/src/src/components/ChartPanel/ChartPanel.scss @@ -0,0 +1,30 @@ +@use 'src/styles/abstracts' as *; + +.ChartPanel__container { + height: 100%; + width: 100%; + display: flex; + .ChartPanel { + overflow: hidden; + height: 100%; + border-right: $border-separator; + position: relative; + display: flex; + flex-grow: 1; + max-width: 100%; + flex-basis: 0; + &__grid { + display: flex; + height: 100%; + overflow: auto; + margin: 0; + width: 100%; + flex-wrap: wrap; + } + &__controls { + width: 3.75rem; + max-height: 100%; + overflow-y: auto; + } + } +} diff --git a/src/src/components/ChartPanel/ChartPanel.tsx b/src/src/components/ChartPanel/ChartPanel.tsx new file mode 100644 index 00000000..3cfede13 --- /dev/null +++ b/src/src/components/ChartPanel/ChartPanel.tsx @@ -0,0 +1,235 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import SplitPane, { SplitPaneItem } from 'components/SplitPane'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { IChartPanelProps } from 'types/components/ChartPanel/ChartPanel'; +import { + IActivePoint, + ISyncHoverStateArgs, +} from 'types/utils/d3/drawHoverAttributes'; + +import { ChartTypeEnum } from 'utils/d3'; + +import ResizingFallback from '../ResizingFallback'; + +import ChartPopover from './ChartPopover'; +import ChartGrid from './ChartGrid'; +import ChartLegends from './ChartLegends'; + +import './ChartPanel.scss'; + +const ChartPanel = React.forwardRef(function ChartPanel( + props: IChartPanelProps, + ref, +) { + const [chartRefs] = React.useState[]>( + new Array(props.data.length).fill('*').map(() => React.createRef()), + ); + const [activePointRect, setActivePointRect] = React.useState<{ + top: number; + bottom: number; + left: number; + right: number; + } | null>(null); + const [legendsResizing, setLegendsResizing] = React.useState(false); + + const gridRef = React.useRef(null); + const activePointRef = React.useRef(null); + + const setActiveElemPos = React.useCallback(() => { + if ( + activePointRef.current && + gridRef.current && + activePointRef.current?.pointRect !== null + ) { + const { pointRect } = activePointRef.current; + + setActivePointRect({ ...pointRect }); + } else { + setActivePointRect(null); + } + }, [setActivePointRect]); + + const syncHoverState = React.useCallback( + (args: ISyncHoverStateArgs): void => { + const { activePoint, focusedState, dataSelector } = args; + // on MouseHover + activePointRef.current = activePoint; + if (activePoint !== null) { + chartRefs.forEach((chartRef, index) => { + if (focusedState) { + chartRef.current?.setFocusedState?.(focusedState); + } + if (index === activePoint.chartIndex) { + return; + } + switch (props.chartType) { + case ChartTypeEnum.LineChart: + chartRef.current?.updateHoverAttributes?.( + activePoint.xValue, + dataSelector, + ); + break; + case ChartTypeEnum.HighPlot: + chartRef.current?.clearHoverAttributes?.(); + break; + } + }); + + if (props.onActivePointChange) { + props.onActivePointChange(activePoint, focusedState?.active); + } + if (activePoint.pointRect !== null) { + setActiveElemPos(); + } else { + setActivePointRect(null); + } + } + // on MouseLeave + else { + chartRefs.forEach((chartRef) => { + chartRef.current?.clearHoverAttributes?.(); + }); + setActivePointRect(null); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [chartRefs, setActiveElemPos, props.chartType, props.onActivePointChange], + ); + + const displayLegends = React.useMemo( + (): boolean => !!props.legends?.display && !_.isEmpty(props.legendsData), + [props.legends?.display, props.legendsData], + ); + + const onLegendsResizeStart = React.useCallback((): void => { + setLegendsResizing(true); + }, []); + + const onLegendsResizeEnd = React.useCallback((): void => { + setLegendsResizing(false); + }, []); + + const onChartMount = React.useCallback(() => { + if (props.focusedState) { + chartRefs.forEach((chartRef) => { + chartRef.current?.setFocusedState?.(props.focusedState); + }); + } + }, [props.focusedState, chartRefs]); + + React.useImperativeHandle(ref, () => ({ + setActiveLineAndCircle: ( + lineKey?: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => { + chartRefs.forEach((chartRef) => { + chartRef.current?.setActiveLineAndCircle?.( + lineKey, + focusedStateActive, + force, + ); + }); + }, + })); + + React.useEffect(() => { + if (!props.panelResizing && props.focusedState) { + chartRefs.forEach((chartRef) => { + chartRef.current?.setFocusedState?.(props.focusedState); + }); + } + }, [ + chartRefs, + props.focusedState, + props.panelResizing, + props.resizeMode, + legendsResizing, + ]); + + return ( + +
+ {props.panelResizing ? ( + + ) : ( + <> + +
+ + } + > + + + 0 && + !props.zoom?.active && + !!props.tooltip?.display + } + forceOpen={!!props.focusedState?.active} + chartType={props.chartType} + tooltipContent={props?.tooltip?.content || {}} + tooltipAppearance={props?.tooltip?.appearance} + focusedState={props.focusedState} + alignmentConfig={props.alignmentConfig} + selectOptions={props.selectOptions} + onChangeTooltip={props.onChangeTooltip} + /> + + + + + + +
+
+ +
+ {props.controls} +
+
+ + )} +
+
+ ); +}); + +export default ChartPanel; diff --git a/src/src/components/ChartPanel/ChartPopover/ChartPopover.scss b/src/src/components/ChartPanel/ChartPopover/ChartPopover.scss new file mode 100644 index 00000000..6c6589b0 --- /dev/null +++ b/src/src/components/ChartPanel/ChartPopover/ChartPopover.scss @@ -0,0 +1,35 @@ +@use 'src/styles/abstracts' as *; + +.ChartPopover { + pointer-events: none; + z-index: 5 !important; + height: toRem(200px); // To not block table scroll + &.pinnedPopover { + width: 100%; + height: 100%; + } + > *:first-of-type { + height: toRem(200px); // To not block table scroll + } + &__content { + transform: none !important; + width: toRem(230px); + max-height: toRem(250px); + background: rgba(255, 255, 255, 0.78); + box-shadow: 0 1px 1px rgb(34 58 90 / 20%), 0 2px 2px rgb(34 58 90 / 20%), + 0 4px 4px rgb(34 58 90 / 20%), 0 6px 8px rgb(34 58 90 / 20%); + border: $border-main; + backdrop-filter: blur(3px); + overflow: unset; + &__pinned { + width: auto; + max-height: toRem(130px); + } + &__active { + background: $white; + } + &.hide { + visibility: hidden; + } + } +} diff --git a/src/src/components/ChartPanel/ChartPopover/ChartPopover.tsx b/src/src/components/ChartPanel/ChartPopover/ChartPopover.tsx new file mode 100644 index 00000000..c302e2f7 --- /dev/null +++ b/src/src/components/ChartPanel/ChartPopover/ChartPopover.tsx @@ -0,0 +1,179 @@ +import React from 'react'; +import classNames from 'classnames'; +import _ from 'lodash-es'; + +import { Popover, PopoverPosition } from '@material-ui/core'; + +import PopoverContent from 'components/ChartPanel/PopoverContent/PopoverContent'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { IChartPopover } from 'types/components/ChartPanel/ChartPopover'; +import { IActivePointRect } from 'types/utils/d3/drawHoverAttributes'; + +import getPositionBasedOnOverflow from 'utils/getPositionBasedOnOverflow'; + +import './ChartPopover.scss'; + +function ChartPopover(props: IChartPopover): JSX.Element { + let { + id = 'popover', + forceOpen = false, + open = false, + className = '', + containerNode = document.body, + selectOptions, + tooltipAppearance = TooltipAppearanceEnum.Auto, + } = props; + open = forceOpen || open; + + const [openPopover, setOpenPopover] = React.useState( + !!props.activePointRect && open, + ); + const [popoverNode, setPopoverNode] = React.useState(); + const [popoverPos, setPopoverPos] = React.useState({ + top: 10000, + left: 10000, + }); + + const isPopoverPinned = React.useMemo( + () => + tooltipAppearance === TooltipAppearanceEnum.Top || + tooltipAppearance === TooltipAppearanceEnum.Bottom, + [tooltipAppearance], + ); + + const onPopoverPositionChange = React.useCallback( + (activePointRect: IActivePointRect) => { + if (popoverNode && containerNode) { + // Popover viewport need to be overflowed by chart container + const popoverRect = popoverNode.getBoundingClientRect(); + const containerRect = containerNode.getBoundingClientRect(); + + if (containerRect.width && containerRect.height) { + const activePointPos = { + top: activePointRect.top - containerNode.scrollTop, + left: activePointRect.left - containerNode.scrollLeft, + right: activePointRect.right - containerNode.scrollLeft, + bottom: activePointRect.bottom - containerNode.scrollTop, + }; + + const pos = getPositionBasedOnOverflow( + activePointPos, + popoverRect, + containerRect, + isPopoverPinned, + tooltipAppearance, + ); + setPopoverPos(pos); + } + } + }, + [containerNode, popoverNode, isPopoverPinned, tooltipAppearance], + ); + + React.useEffect(() => { + setOpenPopover(!!props.activePointRect && open); + }, [props.activePointRect, open]); + + React.useEffect(() => { + if (!!props.activePointRect && openPopover) { + onPopoverPositionChange(props.activePointRect); + } + }, [ + props.activePointRect, + openPopover, + props.tooltipContent, + props.focusedState.key, + props.focusedState.active, + onPopoverPositionChange, + ]); + + React.useEffect(() => { + if (containerNode) { + const onScrollEnd = _.debounce( + () => setOpenPopover(!!props.activePointRect && open), + 300, + ); + const onScroll = _.debounce(() => setOpenPopover(false), 200, { + leading: true, + trailing: false, + }); + containerNode.addEventListener('scroll', onScroll); + containerNode.addEventListener('scroll', onScrollEnd); + return () => { + containerNode?.removeEventListener('scroll', onScroll); + containerNode?.removeEventListener('scroll', onScrollEnd); + }; + } + }, [props.activePointRect, open, containerNode]); + + React.useEffect(() => { + const onMouseMove = ({ target }: any) => { + if ( + !forceOpen && + !containerNode?.contains(target) && + !popoverNode?.contains(target) + ) { + setOpenPopover(false); + } + }; + document.addEventListener('mousemove', onMouseMove); + return () => { + document.removeEventListener('mousemove', onMouseMove); + }; + }, [containerNode, popoverNode, forceOpen]); + + return ( + + + + ); +} + +export default React.memo(ChartPopover); diff --git a/src/src/components/ChartPanel/ChartPopover/index.ts b/src/src/components/ChartPanel/ChartPopover/index.ts new file mode 100644 index 00000000..eae3ed33 --- /dev/null +++ b/src/src/components/ChartPanel/ChartPopover/index.ts @@ -0,0 +1,3 @@ +import ChartPopover from './ChartPopover'; + +export default ChartPopover; diff --git a/src/src/components/ChartPanel/PopoverContent/PopoverContent.scss b/src/src/components/ChartPanel/PopoverContent/PopoverContent.scss new file mode 100644 index 00000000..13c69543 --- /dev/null +++ b/src/src/components/ChartPanel/PopoverContent/PopoverContent.scss @@ -0,0 +1,170 @@ +@use 'src/styles/abstracts' as *; + +.PopoverContent__container { + position: relative; + max-height: inherit; + font-size: $text-sm; + line-height: 15px; + color: $pico-80; + background-color: transparent; + + .PopoverContent { + max-height: inherit; + overflow: auto; + padding-bottom: toRem(3px); + position: relative; + + &__actionButtons { + display: flex; + padding: $space-xxxxs; + height: 1.875rem; + position: absolute; + top: toRem(-28px); + left: toRem(-1px); + background: #fff; + border: $border-main; + border-bottom: transparent; + border-radius: $space-xxxs $space-xxxs 0 0; + box-shadow: -1px 1px 1px rgb(34 58 90 / 20%); + &::after { + content: ''; + height: $space-xxxs; + width: calc(100% + 2px); + background: #fff; + position: absolute; + bottom: toRem(-2px); + left: toRem(-1px); + border-left: $border-main; + } + &__actionButton { + margin-left: $space-xxxxs; + &__icon { + color: $pico-70; + } + &.active { + .PopoverContent__actionButtons__actionButton__icon { + color: $primary-color; + } + } + } + } + + &__pinned { + display: flex; + padding-bottom: 0; + overflow: unset; + .PopoverContent__boxWrapper { + display: flex; + max-width: 20rem; + flex: 1; + + &.pinned { + flex-direction: column; + overflow-y: auto; + width: toRem(250px); + .PopoverContent__box { + overflow-y: unset; + } + } + .PopoverContent__box { + overflow-y: auto; + } + .PopoverContent__tagBox { + overflow-y: hidden; + max-width: toRem(200px); + } + } + .PopoverContent__tagBox { + overflow: hidden; + .AttachedTagsList { + max-height: calc(100% - 1.25rem); + height: calc(100% - 1.25rem); + position: relative; + &__tags { + max-height: 100%; + } + &__ControlPopover__anchor { + position: absolute; + right: 0; + top: -1.875rem; + } + } + } + } + + &__boxContainer { + display: flex; + flex-direction: column; + &.pinned { + max-height: 100%; + width: toRem(250px); + overflow-y: auto; + margin-bottom: toRem(1px); + } + } + + &__box { + padding: 0.625rem 1rem; + } + + &__valueContainer { + display: flex; + //align-items: center; + margin-top: 0.4rem; + } + + &__valueContainer:first-child { + margin-top: 0; + } + + &__value { + margin-top: 0.25rem; + word-break: break-word; + } + + &__value:first-child { + margin-top: 0; + } + + &__headerValue { + margin-left: 0.4rem; + } + + &__axisValue { + margin-top: $space-xxxxs; + word-break: break-word; + } + + &__contextValue { + margin-left: 0.5rem; + font-weight: $font-400; + } + + &__runDetails { + display: flex; + align-items: center; + + .icon-link { + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + margin-right: 8px; + } + } + + &__subtitle1 { + color: $pico-50; + text-transform: uppercase; + font-weight: $font-500; + } + + &__subtitle2 { + font-weight: $font-600; + text-transform: capitalize; + color: $text-color; + margin-top: 8px; + } + } +} diff --git a/src/src/components/ChartPanel/PopoverContent/PopoverContent.tsx b/src/src/components/ChartPanel/PopoverContent/PopoverContent.tsx new file mode 100644 index 00000000..21cfa1ec --- /dev/null +++ b/src/src/components/ChartPanel/PopoverContent/PopoverContent.tsx @@ -0,0 +1,431 @@ +import React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; +import { Link as RouteLink } from 'react-router-dom'; + +import { Divider, Link, Paper, Tooltip } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; +import AttachedTagsList from 'components/AttachedTagsList/AttachedTagsList'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { PathEnum } from 'config/enums/routesEnum'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { IPopoverContentProps } from 'types/components/ChartPanel/PopoverContent'; + +import contextToString from 'utils/contextToString'; +import { + formatValueByAlignment, + getKeyByAlignment, +} from 'utils/formatByAlignment'; +import { AlignmentOptionsEnum, ChartTypeEnum } from 'utils/d3'; +import { formatValue } from 'utils/formatValue'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import getValueByField from 'utils/getValueByField'; +import { isMetricHash } from 'utils/isMetricHash'; +import { decode } from 'utils/encoder/encoder'; + +import './PopoverContent.scss'; + +const PopoverContent = React.forwardRef(function PopoverContent( + props: IPopoverContentProps, + ref, +): React.FunctionComponentElement { + const { + tooltipContent, + tooltipAppearance = TooltipAppearanceEnum.Auto, + focusedState, + chartType, + alignmentConfig, + selectOptions, + onRunsTagsChange, + onChangeTooltip, + } = props; + const { + selectedProps = {}, + groupConfig = {}, + name = '', + context = {}, + run, + } = tooltipContent || {}; + + const isPopoverPinned = React.useMemo( + () => + tooltipAppearance === TooltipAppearanceEnum.Top || + tooltipAppearance === TooltipAppearanceEnum.Bottom, + [tooltipAppearance], + ); + + function renderPopoverHeader(): React.ReactNode { + switch (chartType) { + case ChartTypeEnum.LineChart: { + return ( + +
+
+ Y: + + + {isSystemMetric(name) ? formatSystemMetricName(name) : name} + + + {contextToString(context)} + + + {focusedState?.yValue} + + +
+
+ X: + + {getKeyByAlignment(alignmentConfig)} + {alignmentConfig?.type === + AlignmentOptionsEnum.CUSTOM_METRIC && ( + + {contextToString(context)} + + )} + + {formatValueByAlignment({ + xAxisTickValue: (focusedState?.xValue as number) ?? null, + type: alignmentConfig?.type, + })} + + +
+
+
+ ); + } + case ChartTypeEnum.HighPlot: { + let metricName: string = ''; + let context: string = ''; + const xValue = `${focusedState?.xValue}`; + + if (isMetricHash(xValue)) { + const metric = JSON.parse(decode(xValue)); + metricName = metric.metricName; + context = metric.contextName; + } else { + metricName = (xValue || '')?.split('-')[0]; + context = (xValue || '')?.split('-')[1]; + } + + return ( + +
+
+ + {isSystemMetric(metricName) + ? formatSystemMetricName(metricName) + : metricName ?? '--'} + {' '} + {context || null} +
+
+ Value: {focusedState?.yValue} +
+
+
+ ); + } + case ChartTypeEnum.ImageSet: { + const { + step = '', + index = '', + caption = '', + images_name = '', + } = tooltipContent; + return ( + +
+ {caption} +
+ {images_name} + + {contextToString(context)} + +
+
+ Step: {step} + + Index: {index} + +
+
+
+ ); + } + case ChartTypeEnum.ScatterPlot: { + return ( + +
+
+ Y: + + + {focusedState?.yValue} + + +
+
+ X: + + + {focusedState?.xValue} + + +
+
+
+ ); + } + default: + return null; + } + } + + function renderActionButtons(): React.ReactNode { + if (focusedState?.active && run?.hash && onChangeTooltip) { + return ( +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+ ); + } + return null; + } + + function renderTags(): React.ReactNode { + return focusedState?.active && run?.hash ? ( + +
+ +
+ + +
Run Details
+ + + +
Experiment Detail
+ +
+
+
+ +
+ + + +
+
+
+ ) : null; + } + + return ( + + + {renderActionButtons()} +
+
+ {renderPopoverHeader()} + {isPopoverPinned && renderTags()} +
+ {!_.isEmpty(selectedProps) || !_.isEmpty(groupConfig) ? ( +
+ {_.isEmpty(selectedProps) ? null : ( + +
+ +
+
+ Selected Fields +
+ {Object.keys(selectedProps).map((paramKey) => ( +
+ + {`${getValueByField(selectOptions, paramKey)}: `} + + + {formatValue(selectedProps[paramKey])} + +
+ ))} +
+
+
+ )} + {_.isEmpty(groupConfig) ? null : ( + +
+ +
+
+ Group Config +
+ {Object.keys(groupConfig).map((groupConfigKey: string) => + _.isEmpty(groupConfig[groupConfigKey]) ? null : ( + +
+ {groupConfigKey} +
+ {Object.keys(groupConfig[groupConfigKey]).map( + (item) => { + let val = isSystemMetric( + groupConfig[groupConfigKey][item], + ) + ? formatSystemMetricName( + groupConfig[groupConfigKey][item], + ) + : groupConfig[groupConfigKey][item]; + return ( +
+ {`${item}: `} + {formatValue(val)} +
+ ); + }, + )} +
+ ), + )} +
+
+
+ )} + {!isPopoverPinned && renderTags()} +
+ ) : null} +
+
+
+ ); +}); + +export default React.memo(PopoverContent); diff --git a/src/src/components/ChartPanel/config.ts b/src/src/components/ChartPanel/config.ts new file mode 100644 index 00000000..15676f48 --- /dev/null +++ b/src/src/components/ChartPanel/config.ts @@ -0,0 +1,11 @@ +import { IChartTypeConfig } from 'types/components/ChartPanel/ChartPanel'; + +import LineChart from '../LineChart/LineChart'; +import HighPlot from '../HighPlot/HighPlot'; +import ScatterPlot from '../ScatterPlot/ScatterPlot'; + +export const CHART_TYPES_CONFIG: IChartTypeConfig = { + LineChart, + HighPlot, + ScatterPlot, +}; diff --git a/src/src/components/Charts/ScatterPlot/Axis/Axis.tsx b/src/src/components/Charts/ScatterPlot/Axis/Axis.tsx new file mode 100644 index 00000000..bf89171d --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/Axis/Axis.tsx @@ -0,0 +1,45 @@ +import React, { useEffect, memo } from 'react'; +import { select } from 'd3'; + +import { IAxisProps } from '../types'; + +/** + * Component Axis + * Usage + * + * @param label - it can be the name of the axis (Y axis) + * @param transform - svg transform (it can be translate()) + * @param scale - svg element scale + * @return React.FunctionComponentElement + */ +const Axis = ({ + label, + transform, + scale, +}: IAxisProps): React.FunctionComponentElement => { + const ref: React.MutableRefObject = React.createRef(); + + useEffect(() => { + select(ref.current).call(scale); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [scale]); + + // Can work width axis's UI easily here + // i.e. paint label as title etc. + return ( + + ); +}; + +Axis.displayName = 'Axis'; + +export default memo(Axis); diff --git a/src/src/components/Charts/ScatterPlot/Circles/Circles.tsx b/src/src/components/Charts/ScatterPlot/Circles/Circles.tsx new file mode 100644 index 00000000..c03f9e14 --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/Circles/Circles.tsx @@ -0,0 +1,44 @@ +import React, { memo } from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { DEFAULT_CIRCLE_COLOR, DEFAULT_CIRCLE_RADIUS } from '../config'; +import { ICircleProps } from '../types'; + +/** + * Circle Component + * @param data - the array of array, present the x, y coordinates of circles + * @param scale - svg scale + * @param color - circle's color + * @param radius - circle's radius + * @return React.FunctionComponentElement + */ +const Circle = ({ + data, + scale, + color = DEFAULT_CIRCLE_COLOR, + radius = DEFAULT_CIRCLE_RADIUS, +}: ICircleProps): React.FunctionComponentElement => { + // can easily handle hover and click, show tooltip, etc.. + // some UI tricks can be possible to move here instead of rendering it inside a single component + return ( + + + {data.map((coords: number[], i: number) => ( + + ))} + + + ); +}; + +Circle.displayName = 'Circle'; + +export default memo(Circle); diff --git a/src/src/components/Charts/ScatterPlot/ScatterPlot.tsx b/src/src/components/Charts/ScatterPlot/ScatterPlot.tsx new file mode 100644 index 00000000..004a71bc --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/ScatterPlot.tsx @@ -0,0 +1,122 @@ +/* eslint-disable react/prop-types */ +import React, { forwardRef, memo } from 'react'; +import { scaleLinear, axisLeft, axisBottom } from 'd3'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { getMaxValue } from './util'; +import Circles from './Circles/Circles'; +import Axis from './Axis/Axis'; +import { IScatterPlotProps } from './types'; +import widthResize from './withResize.jsx'; +import { DEFAULT_CONTAINER_HEIGHT, DEFAULT_CONTAINER_WIDTH } from './config'; + +const margin = { top: 50, right: 50, bottom: 60, left: 60 }; + +/** + * ScatterPlot Component + * @Usage + * const dataSets: DataSet[] = [ + { + label: 'Blue', + data: [ + [20, 30], + [15, 100], + [100, 30], + [80, 1000], + ], + circleRadius: 10, + circleColor: 'blue', + }, + { + label: 'Yellow', + data: [ + [10, 100], + [20, 100], + [12, 70], + [50, 5000], + ], + circleRadius: 5, + circleColor: 'yellow', + }, + ]; + + + // need to use yAxisLabel and xAxisLabel inside module + */ +const ScatterPlot = forwardRef( + (props, ref): React.FunctionComponentElement => { + const { + width = DEFAULT_CONTAINER_WIDTH, + height = DEFAULT_CONTAINER_HEIGHT, + yAxisLabel, + xAxisLabel, + dataSets, + } = props; + + const dataDependency: number[] = []; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + dataSets.forEach(({ data }) => dataDependency.push(...data)); + + const { graphWidth, graphHeight } = { + graphWidth: width - margin.left - margin.right, + graphHeight: height - margin.top - margin.bottom, + }; + + const x_scale = scaleLinear() + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + .domain([0, getMaxValue(dataDependency, 0)]) + .range([0, graphWidth]); + + const y_scale = scaleLinear() + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + .domain([0, getMaxValue(dataDependency, 1)]) + .range([graphHeight, 0]); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return ( + +
+ + + {dataSets?.map((group, i) => { + return ( + group.data && ( + + ) + ); + })} + + + + +
+
+ ); + }, +); + +ScatterPlot.displayName = 'ScatterPlot'; + +export default memo(widthResize(ScatterPlot)); diff --git a/src/src/components/Charts/ScatterPlot/config.ts b/src/src/components/Charts/ScatterPlot/config.ts new file mode 100644 index 00000000..353e6d35 --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/config.ts @@ -0,0 +1,5 @@ +export const DEFAULT_CIRCLE_COLOR = 'yellow'; +export const DEFAULT_CIRCLE_RADIUS = 5; + +export const DEFAULT_CONTAINER_WIDTH = 800; +export const DEFAULT_CONTAINER_HEIGHT = 600; diff --git a/src/src/components/Charts/ScatterPlot/styles.scss b/src/src/components/Charts/ScatterPlot/styles.scss new file mode 100644 index 00000000..bbb8aa61 --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/styles.scss @@ -0,0 +1,4 @@ +.Aim_ScatterPlotWrapper { + position: relative; + display: inline-block; +} \ No newline at end of file diff --git a/src/src/components/Charts/ScatterPlot/types.d.ts b/src/src/components/Charts/ScatterPlot/types.d.ts new file mode 100644 index 00000000..7263c252 --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/types.d.ts @@ -0,0 +1,37 @@ +type Data = Array>; + +export type DataSet = { + circleRadius?: number; + circleColor?: string; + label: string; + data: Data; +}; + +export type SizeState = { + width?: number; + height?: number; +}; + +export interface IScatterPlotProps { + yAxisLabel?: string; + xAxisLabel?: string; + dataSets: DataSet[]; + width?: number; + height?: number; +} + +export interface IAxisProps { + transform: string; + label?: string; + scale: any; +} + +export interface ICircleProps { + data: Data; + scale: { + x_scale: any; + y_scale: any; + }; + color?: string; + radius?: number; +} diff --git a/src/src/components/Charts/ScatterPlot/util.ts b/src/src/components/Charts/ScatterPlot/util.ts new file mode 100644 index 00000000..e96c989f --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/util.ts @@ -0,0 +1,16 @@ +import { max } from 'd3'; + +type NumberValue = number | { valueOf(): number }; + +/** + * getMinValue, using d3.min() + * @param {Iterable>} data - chart dataset + * @param {Number} index - the index of column + * @return - the max value of data set + */ +export const getMaxValue = ( + data: Iterable>, + index: number, +): NumberValue | undefined => { + return max(data, (d) => d[index]); +}; diff --git a/src/src/components/Charts/ScatterPlot/withResize.tsx b/src/src/components/Charts/ScatterPlot/withResize.tsx new file mode 100644 index 00000000..a27dc5fc --- /dev/null +++ b/src/src/components/Charts/ScatterPlot/withResize.tsx @@ -0,0 +1,47 @@ +import React, { useEffect, useRef, useState } from 'react'; + +import { DEFAULT_CONTAINER_HEIGHT, DEFAULT_CONTAINER_WIDTH } from './config'; + +const INEXPLICABLE_SIZE = 6; + +/** + * Higher Order Component + * Listen to Parent's Container changes and pass down new sizes + */ +function widthResize( + Component: React.FunctionComponentElement | any, +) { + return function WidthResizeHOC(props: any) { + const ref = useRef(); + const [sizes, setSizes] = useState({ + width: props.width || DEFAULT_CONTAINER_WIDTH, + height: props.height || DEFAULT_CONTAINER_HEIGHT, + }); + + const measure = (entries: any) => { + const { width, height } = entries[0].contentRect; + setSizes({ + height: Math.round(height) - INEXPLICABLE_SIZE, + width: Math.round(width), + }); + }; + useEffect(() => { + const resizeObserver = new window.ResizeObserver(measure); + resizeObserver.observe(ref.current); + + return () => { + resizeObserver.disconnect(); + }; + }, []); + + const componentProps = { + ...sizes, + ...props, + ref, + }; + + return ; + }; +} + +export default widthResize; diff --git a/src/src/components/CodeBlock/CodeBlock.scss b/src/src/components/CodeBlock/CodeBlock.scss new file mode 100644 index 00000000..23b8fd1d --- /dev/null +++ b/src/src/components/CodeBlock/CodeBlock.scss @@ -0,0 +1,30 @@ +@use 'src/styles/abstracts' as *; +.CodeBlock { + background: #f2f3f4; + border-radius: $border-radius-main; + padding: 1em 3em 1em 1em; + position: relative; + min-height: 3.5rem; + display: flex; + align-items: center; + overflow: auto; + pre { + margin: 0; + font-style: normal; + font-weight: $font-500; + font-size: 15px; + line-height: 1.3125em; + overflow: auto; + @include monospaceFontFamily(15); + } + &__copy__button { + top: 0.75rem; + right: 1rem; + color: $pico-80; + display: inline-block; + cursor: pointer; + position: absolute; + align-items: center; + justify-content: center; + } +} diff --git a/src/src/components/CodeBlock/CodeBlock.tsx b/src/src/components/CodeBlock/CodeBlock.tsx new file mode 100644 index 00000000..1c24655e --- /dev/null +++ b/src/src/components/CodeBlock/CodeBlock.tsx @@ -0,0 +1,40 @@ +import React from 'react'; + +import CopyToClipBoard from 'components/CopyToClipBoard/CopyToClipBoard'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import useCodeHighlighter from 'hooks/useCodeHighlighter'; + +import { ICodeBlockProps } from 'types/components/CodeBlock/CodeBlock'; + +import './CodeBlock.scss'; + +function CodeBlock({ + code = '', + className = '', + language = 'python', +}: ICodeBlockProps): React.FunctionComponentElement { + const { elementRef } = useCodeHighlighter(language); + + return ( + +
+
+          {code}
+        
+ + + +
+
+ ); +} + +export default React.memo(CodeBlock); diff --git a/src/src/components/CommunityPopup/CommunityPopup.d.ts b/src/src/components/CommunityPopup/CommunityPopup.d.ts new file mode 100644 index 00000000..45541ece --- /dev/null +++ b/src/src/components/CommunityPopup/CommunityPopup.d.ts @@ -0,0 +1,5 @@ +import * as React from 'react'; + +export interface ICommunityPopupProps { + children: React.ReactNode; +} diff --git a/src/src/components/CommunityPopup/CommunityPopup.scss b/src/src/components/CommunityPopup/CommunityPopup.scss new file mode 100644 index 00000000..7a86b772 --- /dev/null +++ b/src/src/components/CommunityPopup/CommunityPopup.scss @@ -0,0 +1,60 @@ +@use 'src/styles/abstracts' as *; + +.CommunityPopup { + z-index: 1501; + pointer-events: all; + &__tooltip { + width: toRem(350px); + height: toRem(158px); + max-width: unset; + background-color: white; + padding: $space-unit $space-lg $space-unit; + border: $border-width-main $pico-80; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25), 0 6px 10px rgba(0, 0, 0, 0.14); + border-radius: $border-radius-lg; + display: flex; + flex-direction: column; + overflow: visible !important; + &.MuiTooltip-tooltipPlacementRight { + margin: 0 (-$space-sm) !important; + } + &__title { + white-space: nowrap; + line-height: toRem(17px); + font-style: normal; + font-weight: 750; + @include monospaceFontFamily(4); + } + &__footer { + display: flex; + justify-content: flex-end; + margin-top: auto; + &__skipBtn { + color: $pico-70; + background-color: transparent; + margin-right: $space-sm; + &:hover { + color: $pico-100; + background-color: transparent; + } + } + &__joinBtn { + padding-inline: $space-lg !important; + } + } + &__content { + margin-top: $space-sm; + white-space: nowrap; + line-height: toRem(18px); + font-style: normal; + @include monospaceFontFamily(7.2); + } + .MuiTooltip-arrow { + background-color: transparent; + color: white; + &::before { + border: $border-width-main $pico-80; + } + } + } +} diff --git a/src/src/components/CommunityPopup/CommunityPopup.tsx b/src/src/components/CommunityPopup/CommunityPopup.tsx new file mode 100644 index 00000000..19e3ebad --- /dev/null +++ b/src/src/components/CommunityPopup/CommunityPopup.tsx @@ -0,0 +1,109 @@ +import * as React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import { trackEvent } from 'services/analytics'; + +import { Button, Text } from '../kit'; + +import { ICommunityPopupProps } from './'; + +import './CommunityPopup.scss'; + +const COMMUNITY_POPUP_SEEN = 'communityPopupSeen'; +const COMMUNITY_URL = 'https://community.aimstack.io/'; + +function CommunityPopup(props: ICommunityPopupProps) { + const [open, setOpen] = React.useState(false); + let timeoutIdRef = React.useRef(); + + React.useEffect(() => { + const popupSeenStorage = localStorage.getItem(COMMUNITY_POPUP_SEEN); + + if (popupSeenStorage === 'true') { + setOpen(false); + } else { + window.clearTimeout(timeoutIdRef.current); + timeoutIdRef.current = window.setTimeout(() => { + setOpen(true); + }, 500); + } + }, []); + + const onSkip = React.useCallback(() => { + localStorage.setItem(COMMUNITY_POPUP_SEEN, 'true'); + setOpen(false); + }, []); + + const onJoin = React.useCallback(() => { + localStorage.setItem(COMMUNITY_POPUP_SEEN, 'true'); + window.open(COMMUNITY_URL, '_blank'); + trackEvent(ANALYTICS_EVENT_KEYS.sidebar.discord); + setOpen(false); + }, []); + + return ( + + + 📣 JOIN THE AIM COMMUNITY! + +
+ + - Get early access to upcoming Aim features + + + - Meet other Aim users + + + - Discuss all-things MLOps and ML Research + +
+
+ + +
+ + } + > +
{props.children}
+
+ ); +} + +CommunityPopup.displayName = 'CommunityPopup'; + +export default React.memo(CommunityPopup); diff --git a/src/src/components/CommunityPopup/index.tsx b/src/src/components/CommunityPopup/index.tsx new file mode 100644 index 00000000..5c5af193 --- /dev/null +++ b/src/src/components/CommunityPopup/index.tsx @@ -0,0 +1,5 @@ +import CommunityPopup from './CommunityPopup'; + +export * from './CommunityPopup.d'; + +export default CommunityPopup; diff --git a/src/src/components/ConfirmModal/ConfirmModal.scss b/src/src/components/ConfirmModal/ConfirmModal.scss new file mode 100644 index 00000000..a5e08962 --- /dev/null +++ b/src/src/components/ConfirmModal/ConfirmModal.scss @@ -0,0 +1,90 @@ +@use 'src/styles/abstracts' as *; + +@mixin getStatusTypeColors($color, $cover-color) { + .ConfirmModal__Icon { + background-color: $cover-color; + + .Icon__container { + color: $color; + } + } + + .ConfirmModal__ConfirmButton { + background-color: $color; + } +} + +.ConfirmModal { + .MuiBackdrop-root { + @include backgroundColorOpacity($black, 0.4); + } + + .MuiPaper-rounded { + border-radius: 6px; + } + + .MuiPaper-elevation10 { + box-shadow: 0px 2px 4px #767a80; + } + + &__Body { + min-width: 384px; + padding: 24px; + + .ConfirmModal__Title__Container { + display: flex; + align-items: center; + margin-bottom: 12px; + } + } + + &__Close__Icon { + position: absolute; + right: 10px; + top: 10px; + } + + &__Icon { + display: flex; + justify-content: center; + align-items: center; + width: 32px; + height: 32px; + margin-right: 16px; + border-radius: 50%; + + .Icon__container { + font-size: 14px; + } + } + + &__CancelButton { + margin-right: 10px; + color: $pico; + } + + &__Footer { + padding: 16px; + margin: 0 8px; + border-top: 1px solid $grayish; + display: flex; + justify-content: flex-end; + align-items: center; + } + + &__error { + @include getStatusTypeColors($error-color, $error-color-10); + } + + &__warning { + @include getStatusTypeColors($warning-color, $warning-color-10); + } + + &__success { + @include getStatusTypeColors($success-color, $success-color-10); + } + + &__info { + @include getStatusTypeColors($primary-color, $primary-color-10); + } +} diff --git a/src/src/components/ConfirmModal/ConfirmModal.tsx b/src/src/components/ConfirmModal/ConfirmModal.tsx new file mode 100644 index 00000000..e8c878f9 --- /dev/null +++ b/src/src/components/ConfirmModal/ConfirmModal.tsx @@ -0,0 +1,106 @@ +import React from 'react'; + +import { Dialog } from '@material-ui/core'; + +import { Button, Text, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary'; + +import { IConfirmModalProps } from 'types/components/ConfirmModal/ConfirmModal'; + +import './ConfirmModal.scss'; + +function ConfirmModal( + props: IConfirmModalProps, +): React.FunctionComponentElement { + return ( + + +
+ + +
+
{props.icon}
+ {props.title && ( + + {props.title} + + )} +
+ +
+ {props.description && ( + + {props.description} + + )} + +
+ {props.text && ( + + {props.text || ''} + + )} + {props.children && props.children} +
+
+
+ +
+ + +
+
+
+ ); +} + +ConfirmModal.defaultProps = { + confirmBtnText: 'Confirm', + cancelBtnText: 'Cancel', + statusType: 'info', +}; + +ConfirmModal.displayName = 'ConfirmModal'; + +export default React.memo(ConfirmModal); diff --git a/src/src/components/ContributionsFeed/ContributionsFeed.d.ts b/src/src/components/ContributionsFeed/ContributionsFeed.d.ts new file mode 100644 index 00000000..a29aa0e7 --- /dev/null +++ b/src/src/components/ContributionsFeed/ContributionsFeed.d.ts @@ -0,0 +1,8 @@ +export interface IContributionsFeedProps { + data: Record; + loadMore: () => void; + isLoading: boolean; + totalRunsCount?: number; + fetchedCount?: number; + archivedRunsCount?: number; +} diff --git a/src/src/components/ContributionsFeed/ContributionsFeed.scss b/src/src/components/ContributionsFeed/ContributionsFeed.scss new file mode 100644 index 00000000..26c4d79e --- /dev/null +++ b/src/src/components/ContributionsFeed/ContributionsFeed.scss @@ -0,0 +1,16 @@ +@use 'src/styles/abstracts' as *; + +.ContributionsFeed { + border-top: none; + &__title { + margin-bottom: $space-sm; + padding: 0 $space-sm; + } + &__content { + margin-top: $space-sm; + padding-bottom: $space-xxxxs; + &-title { + margin-bottom: $space-sm; + } + } +} diff --git a/src/src/components/ContributionsFeed/ContributionsFeed.tsx b/src/src/components/ContributionsFeed/ContributionsFeed.tsx new file mode 100644 index 00000000..3cbab491 --- /dev/null +++ b/src/src/components/ContributionsFeed/ContributionsFeed.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { Button, Spinner, Text } from 'components/kit'; + +import FeedItem from './FeedItem'; + +import { IContributionsFeedProps } from '.'; + +import './ContributionsFeed.scss'; + +function ContributionsFeed({ + data, + loadMore, + isLoading, + totalRunsCount = 0, + fetchedCount = 0, + archivedRunsCount = 0, +}: IContributionsFeedProps): React.FunctionComponentElement | null { + return totalRunsCount && totalRunsCount !== archivedRunsCount ? ( +
+ + Activity + + {isLoading && _.isEmpty(data) ? ( +
+ +
+ ) : ( + <> + {Object.keys(data).map((key) => ( +
+ + {key.split('_').join(' ')} + + {Object.keys(data[key]).map((item: string) => ( + + ))} +
+ ))} + + {fetchedCount < totalRunsCount - archivedRunsCount! ? ( + + ) : null} + + )} +
+ ) : null; +} + +export default React.memo(ContributionsFeed); diff --git a/src/src/components/ContributionsFeed/FeedItem/FeedItem.d.ts b/src/src/components/ContributionsFeed/FeedItem/FeedItem.d.ts new file mode 100644 index 00000000..a6e88082 --- /dev/null +++ b/src/src/components/ContributionsFeed/FeedItem/FeedItem.d.ts @@ -0,0 +1,49 @@ +export interface IFeedItemProps { + date: string; + data: Array; +} + +export type ContributionType = { + /** + * The run name of the contribution + * @type {string} + * @example 'My first run' + */ + name: string; + /** + * The date of the contribution + * @type {string} + * @example '2021-01-01 12:00:00' + */ + date: string; + /** + * The run hash of the contribution + * @type {string} + * @example '5e9f1b9b-7c1a-4b5a-8f0c-8c1c1b9b7c1a' + */ + hash: string; + /** + * The run active state of the contribution + * @type {boolean} + * @example true + */ + active: boolean; + /** + * The run creation time of the contribution + * @type {number} + * @example 1610000000 + */ + creation_time: number; + /** + * The run experiment name of the contribution + * @type {string} + * @example 'My first experiment' + */ + experiment: string; + /** + * The run experiment id of the contribution + * @type {string} + * @example '4a4298dd-d144-40d6-9a3c-d5db7a20ee82' + */ + experimentId: string; +}; diff --git a/src/src/components/ContributionsFeed/FeedItem/FeedItem.scss b/src/src/components/ContributionsFeed/FeedItem/FeedItem.scss new file mode 100644 index 00000000..9fd38330 --- /dev/null +++ b/src/src/components/ContributionsFeed/FeedItem/FeedItem.scss @@ -0,0 +1,92 @@ +@use 'src/styles/abstracts' as *; + +.FeedItem { + margin-bottom: $space-xs; + &__title { + align-items: center; + display: flex; + margin-bottom: $space-xxxs; + .Icon__container { + border-radius: $border-radius-circle; + background-color: $primary-color-10; + margin-right: $space-xxxs; + color: $text-color; + } + } + &__content { + position: relative; + padding-left: toRem(28px); + &::before { + content: ''; + position: absolute; + top: -$space-xxxxs; + left: $space-sm; + width: 1px; + height: calc(100% + 8px); + background-color: $primary-color-20; + } + &__item { + white-space: nowrap; + display: flex; + align-items: center; + margin-bottom: $space-xs; + position: relative; + &::before { + content: ''; + position: absolute; + top: $space-xs; + left: -$space-unit; + width: 12px; + height: 1px; + background-color: $primary-color-20; + } + &__leftBox { + display: flex; + align-items: center; + &__label { + margin-right: $space-xxxs; + } + &__date { + margin-right: $space-sm; + @include monospaceFontFamily(12); + } + .Table__status_indicator { + margin-right: 0; + } + } + &__itemBox { + font-size: $text-sm; + display: flex; + align-items: center; + max-width: calc(100% - 156px); + width: 100%; + .ExperimentNameBox { + margin-right: $space-xxxxs; + max-width: 50%; + &__experimentName { + max-width: 100%; + } + a { + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: inherit; + } + } + &__runName { + max-width: 50%; + margin-left: $space-xxxxs; + display: flex; + a { + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: inline-block; + } + } + } + } + } +} diff --git a/src/src/components/ContributionsFeed/FeedItem/FeedItem.tsx b/src/src/components/ContributionsFeed/FeedItem/FeedItem.tsx new file mode 100644 index 00000000..5da85cdc --- /dev/null +++ b/src/src/components/ContributionsFeed/FeedItem/FeedItem.tsx @@ -0,0 +1,78 @@ +import React from 'react'; +import { Link as RouteLink } from 'react-router-dom'; + +import { Link, Tooltip } from '@material-ui/core'; + +import { Icon, Text } from 'components/kit'; +import StatusLabel from 'components/StatusLabel'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import { PathEnum } from 'config/enums/routesEnum'; + +import { IFeedItemProps } from '.'; + +import './FeedItem.scss'; + +function FeedItem( + props: IFeedItemProps, +): React.FunctionComponentElement { + return ( +
+
+ + + {props.date.split('_').join(' ')} + +
+
+ {props.data.map((item) => ( +
+
+ + {item.date} + + + Started a run: + + +
+ +
+
+
+
+ + / + +
+ + {item.name} + +
+
+
+
+ ))} +
+
+ ); +} + +export default React.memo(FeedItem); diff --git a/src/src/components/ContributionsFeed/FeedItem/index.ts b/src/src/components/ContributionsFeed/FeedItem/index.ts new file mode 100644 index 00000000..893e8270 --- /dev/null +++ b/src/src/components/ContributionsFeed/FeedItem/index.ts @@ -0,0 +1,4 @@ +import FeedItem from './FeedItem'; + +export * from './FeedItem.d'; +export default FeedItem; diff --git a/src/src/components/ContributionsFeed/index.ts b/src/src/components/ContributionsFeed/index.ts new file mode 100644 index 00000000..f45894f4 --- /dev/null +++ b/src/src/components/ContributionsFeed/index.ts @@ -0,0 +1,5 @@ +import ContributionsFeed from './ContributionsFeed'; + +export * from './ContributionsFeed.d'; + +export default ContributionsFeed; diff --git a/src/src/components/ControlPopover/ControlPopover.scss b/src/src/components/ControlPopover/ControlPopover.scss new file mode 100644 index 00000000..0c3235fc --- /dev/null +++ b/src/src/components/ControlPopover/ControlPopover.scss @@ -0,0 +1,55 @@ +@use 'src/styles/abstracts' as *; + +.ControlPopover { + box-shadow: 0 0.25rem 0.375rem rgba(144, 175, 218, 0.2); + border: $border-main; +} + +.ControlPopover__container { + .MuiListItem-button { + color: $text-color; + font-size: 0.875rem; + padding: 0.5rem; + border-radius: $border-radius-sm; + &:hover { + background-color: $cuddle-20; + } + } + &-small { + .MuiListItem-button { + height: 28px; + } + } + &-medium { + .MuiListItem-button { + height: 32px; + } + } + &-large { + .MuiListItem-button { + height: 36px; + } + } + .MuiListItem-root.Mui-selected { + background-color: transparent; + color: $primary-color; + &:hover { + background-color: $cuddle-20; + } + &::after { + content: '✓'; + position: absolute; + right: 0.5rem; + } + } + + .subtitle { + text-transform: uppercase; + } +} + +.ControlPopover__title { + padding: 0.5rem 1rem; + border-bottom: $border-main; + background: $primary-color-5; +} diff --git a/src/src/components/ControlPopover/ControlPopover.tsx b/src/src/components/ControlPopover/ControlPopover.tsx new file mode 100644 index 00000000..75986a33 --- /dev/null +++ b/src/src/components/ControlPopover/ControlPopover.tsx @@ -0,0 +1,90 @@ +import React from 'react'; + +import { Popover } from '@material-ui/core'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import IControlPopoverProps from 'types/components/ControlPopover/ControlPopover'; + +import stopPropagation from 'utils/stopPropagation'; + +import './ControlPopover.scss'; + +function ControlPopover({ + component, + title, + titleClassName = '', + anchor, + anchorOrigin = { + vertical: 'top', + horizontal: 'left', + }, + transformOrigin = { + vertical: 'top', + horizontal: 'right', + }, + open = true, + size = 'small', +}: IControlPopoverProps): React.FunctionComponentElement { + const [anchorEl, setAnchorEl] = React.useState(null); + + const onAnchorClick = React.useCallback( + (event: React.MouseEvent) => { + event.stopPropagation(); + setAnchorEl(event.currentTarget); + }, + [], + ); + + const handleClose = React.useCallback(() => { + setAnchorEl(null); + }, []); + + React.useEffect(() => { + if (!open) { + setAnchorEl(null); + } + }, [open]); + + return ( + + {anchor({ onAnchorClick, opened: open && !!anchorEl })} + +
+ {title && ( +
+ + {title} + +
+ )} + +
+ {typeof component === 'function' + ? component({ handleClose, opened: open && !!anchorEl }) + : component} +
+
+
+
+
+ ); +} + +export default React.memo(ControlPopover); diff --git a/src/src/components/ControlPopover/index.ts b/src/src/components/ControlPopover/index.ts new file mode 100644 index 00000000..4f0dda0a --- /dev/null +++ b/src/src/components/ControlPopover/index.ts @@ -0,0 +1,3 @@ +import ControlPopover from './ControlPopover'; + +export default ControlPopover; diff --git a/src/src/components/CopyToClipBoard/CopyToClipBoard.tsx b/src/src/components/CopyToClipBoard/CopyToClipBoard.tsx new file mode 100644 index 00000000..82b0b233 --- /dev/null +++ b/src/src/components/CopyToClipBoard/CopyToClipBoard.tsx @@ -0,0 +1,47 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { useCopy } from 'hooks/useCopy'; + +import { ICopyToClipBoardProps } from 'types/components/CopyToClipBoard/CopyToClipBoard'; + +function CopyToClipboard({ + contentRef, + showSuccessDelay = 1500, + className = '', + copyContent = null, + iconSize = 'medium', + isURL = false, +}: ICopyToClipBoardProps): React.FunctionComponentElement { + const { onCopy, copied, setCopied } = useCopy(copyContent ?? contentRef); + + React.useEffect(() => { + if (copied) { + setTimeout(() => { + setCopied(false); + }, showSuccessDelay); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [copied]); + + const iconName = isURL ? 'link' : 'copy'; + return ( + + + + + + + + ); +} + +CopyToClipboard.displayName = 'CopyToClipBoard'; + +export default React.memo(CopyToClipboard); diff --git a/src/src/components/CustomTable/Table.scss b/src/src/components/CustomTable/Table.scss new file mode 100644 index 00000000..120c6c8d --- /dev/null +++ b/src/src/components/CustomTable/Table.scss @@ -0,0 +1,625 @@ +@use 'src/styles/abstracts' as *; + +$border-color: $cuddle-50; +$box-shadow: 0 3px 9px rgba(0, 0, 0, 0.1); +$border-radius: 0.2rem; + +:root { + --cell-height: 28px; + --group-margin: 4px; + --cell-font-size: 0.875rem; +} + +.Table { + position: relative; + display: flex; + width: max-content; + min-width: 100%; + min-height: 100%; + box-sizing: border-box; + font-weight: $font-500; + &__container { + height: 100%; + width: 100%; + box-sizing: border-box; + background: #fff; + &--small { + --cell-height: 22px; + --group-margin: 2px; + --cell-font-size: 0.875rem; + @include monospaceFontFamily(14); + } + &--medium { + --cell-height: 28px; + --group-margin: 4px; + --cell-font-size: 1rem; + @include monospaceFontFamily(); + } + + &--large { + --cell-height: 32px; + --group-margin: 6px; + --cell-font-size: 0.875rem; + } + } + &__groupsColumn__cell { + span, + div { + display: inline-block; + width: 120px; + min-width: 120px; + justify-content: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-right: 0.5rem; + padding-right: 0.5rem; + border-right: 0.0625rem solid #ccc; + &:last-child { + margin-right: 0; + padding-right: 0; + border-right: unset; + } + } + } +} +.Table__pane { + display: flex; + width: stretch; + width: -webkit-fill-available; + width: -moz-available; + min-height: 100%; + box-sizing: border-box; + z-index: 0; +} +.Table__status_indicator { + width: 8px; + height: 8px; + padding: 0; + background-color: unset !important; + margin-right: 3px; + &::before { + width: 4px; + height: 4px; + top: 2px; + left: 0; + } +} + +.Table__action__icon { + color: $primary-color; +} + +.Table__pane--left, +.Table__pane--right, +.Table__pane--selection { + position: -webkit-sticky; + position: sticky; + width: auto; + z-index: 1; +} + +.Table__pane--left { + left: 0; + box-shadow: 1px 0 3px 0 $cuddle; + &.withSelectionColumn { + left: var(--left-position); + } +} + +.Table__pane--selection { + left: 0; + background: #fff; + z-index: 2; + &.withShadow { + box-shadow: 1px 0 3px 0 $cuddle; + } +} + +.Table__pane--right { + right: 0; + box-shadow: -1px 0 3px 0 $cuddle; +} + +.Table__pane--middle { + position: relative; + + .Table__column { + position: absolute; + } +} + +.Table__column { + display: flex; + flex-direction: column; + background-color: #fff; + z-index: 0; + width: stretch; + width: -webkit-fill-available; + width: -moz-available; + max-width: 500px; + .Table__column__defaultSelectIcon { + border: 1.5px solid $pico-80; + border-radius: $border-radius-xs; + width: 14px; + height: 14px; + } + .Table__column__selectedSelectIcon { + border-radius: $border-radius-xs; + width: 14px; + height: 14px; + background: $primary-color; + color: $white; + display: flex; + justify-content: center; + align-items: center; + } + .Table__column__partiallySelectedSelectIcon { + border-radius: $border-radius-xs; + width: 14px; + height: 14px; + display: flex; + justify-content: center; + align-items: center; + } + .configCheckbox { + margin: 0 $space-xxs 0 toRem(1.5px); + } + &--groups { + max-width: unset !important; + } + + &:last-of-type { + flex: 1; + .Table__cell, + .Table__group__config__cell { + border-right: none; + } + } + + &.Table__column--actions { + .Table__cell { + padding: 0; + justify-content: center; + } + } + &.Table__column--selection { + padding: 0; + .Table__cell--header { + padding: 0; + } + .Table__cell { + padding: 0; + border-right: 1px solid $border-color; + } + .Table__cell--header > *:first-child { + margin-right: 0; + } + } + &__selectCheckbox { + width: 32px; + height: var(--cell-height); + border-radius: unset; + padding: 0.5rem; + } + &__headerCheckbox { + margin-left: 1rem; + } +} + +.Table__action { + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + width: 23px; + height: 23px; + margin: 5px 0 5px 5px; + border-radius: $border-radius-circle; + transition: background-color ease 110ms; + user-select: none; + + &:hover { + background-color: $grey-lighter; + } + + &:active { + background-color: $grey-light-xx; + color: $grey-darker; + } +} + +.Table__action__popup { + background-color: #fff; + border: 1px solid $primary-lighter; + border-radius: $border-radius; + box-shadow: $box-shadow; +} + +.Table__action__popup__body { + min-width: 180px; + padding: 0.5rem; + + &__panelTitle { + text-transform: uppercase; + margin: 0.5rem 0; + } +} + +.Table__action__anchor { + cursor: pointer; +} + +.Table__action__popup__item { + padding: $space-xxs $space-xs !important; + text-transform: capitalize; + cursor: pointer; + display: flex; + align-items: center; + color: $primary-color; + transition: background-color 110ms ease; + user-select: none; + + &:last-of-type { + border-bottom: none; + } + + &:hover { + background-color: $grey-bg; + } + + &:active { + background-color: $primary-lighter; + color: $primary-darker; + } + &_icon { + width: 0.875rem; + display: flex; + margin-right: 1rem; + } +} + +.Table__cell { + display: flex; + align-items: center; + font-size: var(--cell-font-size); + padding: 0 $space-unit; + border-bottom: 1px solid $border-color; + border-right: 1px solid $border-color; + text-align: left; + box-sizing: border-box; + background-color: #fff; + white-space: nowrap; + text-overflow: ellipsis; + height: var(--cell-height); + color: $pico-100; + position: relative; + &.isNumeric { + justify-content: flex-end; + } + &.placeholder { + border-right: unset; + } + + &.colorIndicator { + &::before { + content: ''; + position: absolute; + height: calc(var(--cell-height) - 4px); + width: 0.375rem; + border-radius: 0.375rem; + background: var(--color-indicator); + top: 2px; + left: 8px; + } + } + + &.Table__group__header__cell { + position: relative; + background-color: $cuddle-10; + border-color: $border-color; + z-index: 1; + transition: background-color 0.2s ease-out; + + &.expanded { + position: -webkit-sticky; + position: sticky; + background-color: $cuddle-20; + top: calc(2 * var(--cell-height)); + } + + &.expandable:hover { + background-color: $cuddle-30; + } + } + + &.Table__group__config__column__cell { + padding-left: 2.1875rem; + + .Table__cell__rowMeta { + display: flex; + align-items: flex-start; + height: 100%; + max-width: 25vw; + overflow: auto; + box-sizing: border-box; + margin: 0; + + .Table__group__config__meta { + max-height: 100%; + } + } + } + &.inactive { + background-color: $cuddle-10; + color: $pico-50; + .Table__cell__value { + color: $pico-50; + } + } + + &.selected { + background-color: $primary-color-10; + } + + &.hovered { + background-color: $cuddle-20; + } + + &.focused { + background-color: $cuddle-50; + } + + & > * { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + &.actions { + div { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + } + } +} + +.Table__cell--header { + position: -webkit-sticky; + position: sticky; + top: var(--cell-height); + flex: none; + background-color: $cuddle-20; + padding: $space-xxs $space-unit; + border-color: $border-color; + z-index: 3; + overflow: visible; + font-family: 'Inter', sans-serif; + + & > *:first-child { + flex: 1; + margin-right: 0.25rem; + &.Table__column__selectCheckbox { + flex: unset; + margin-left: calc(20px + var(--group-margin)); + margin-right: toRem(14px); + } + } +} + +.Table__column__resizeHandler { + position: absolute; + right: -3px; + top: 0; + width: 6px; + height: 100%; + background-color: $primary-color; + z-index: 10; + cursor: col-resize; + opacity: 0; + transition: opacity 110ms ease; + + &.leftResize { + right: unset; + left: -1px; + } + + &.isResizing, + &:hover { + opacity: 1; + } +} + +.Table__cell--topHeader { + top: 0; + letter-spacing: 0; + background-color: $cuddle-20; + border-top: 0.0625rem solid $border-color; +} + +.Table__header__action__container { + display: flex; +} + +.Table__GroupedColumnHeader { + color: $pico-50; + span { + font-weight: $font-700; + } +} + +.Table__header__action { + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: 25px; + height: 21px; + margin-left: $space-xxs; + background-color: $primary-bg; + border: 1px solid $primary-lighter; + border-radius: $border-radius; + color: $primary-color; + cursor: pointer; + opacity: 1; + user-select: none; + transition: border-color 110ms ease; + + &:hover, + &.active { + background-color: $primary-color-5; + } + + &.disabled { + opacity: 0.65; + cursor: default; + pointer-events: none; + background-color: $grey-bg; + border-color: $grey-light-xx; + color: $grey; + } +} + +.Table__group { + margin-top: var(--group-margin); + border-top: 1px solid $border-color; + position: relative; + &.colorIndicator { + &::before { + content: ''; + position: absolute; + height: calc(100% + 1px); + width: toRem(6px); + border-radius: toRem(6px) 0 0 toRem(6px); + background: var(--color-indicator); + top: -1px; + left: -1px; + z-index: 2; + } + .expanded { + background: var(--extended-group-background-color); + &:hover { + background: var(--extended-group-background-color); + } + } + } + .Table__cell:last-of-type { + border-bottom: 1px solid $border-color; + } +} + +.Table--grouped { + .Table__pane { + padding-bottom: var(--group-margin); + &:first-of-type { + .Table__column { + &:first-of-type { + .Table__group { + border-left: 1px solid $border-color; + margin-left: var(--group-margin); + border-top-left-radius: $border-radius; + border-bottom-left-radius: $border-radius; + + .Table__group__config__cell { + border-top-left-radius: $border-radius; + padding: 0 0.6rem; + } + + .Table__cell:last-of-type { + border-bottom-left-radius: $border-radius; + } + } + } + } + } + &:last-of-type { + .Table__column { + &:last-of-type { + .Table__group { + margin-right: var(--group-margin); + border-right: 1px solid $border-color; + border-top-right-radius: $border-radius; + border-bottom-right-radius: $border-radius; + + .Table__cell:last-of-type { + border-bottom-right-radius: $border-radius; + } + } + } + } + } + } +} + +.Table__cell__rowMeta { + display: flex; + align-items: center; + margin-right: $space-sm; + flex: none; +} + +.Table__cell__value { + display: flex; + flex: 1; + color: $pico; + .Badge { + margin-right: $space-xxxs; + } + &.hasColorIndicator { + padding-left: 0.5rem; + .Table__column__selectCheckbox { + margin-left: 0.5rem; + } + } + &.isNumeric { + justify-content: flex-end; + } +} + +.Popover__body { + position: fixed; + background-color: #fff; + outline: 0; + overflow-y: auto; + z-index: 999; +} + +.Table__group__config { + display: flex; + flex: 1; + align-items: center; + cursor: pointer; + &__chart { + display: flex; + width: 1.25rem; + height: 1.25rem; + align-items: center; + justify-content: center; + margin-left: 0.5em; + border: $border-grey; + border-radius: $border-radius; + font-size: 0.6rem; + } + &__stroke { + display: block; + background-color: #fff; + width: 2.5rem; + height: 1rem; + margin-left: 0.5rem; + border: 1px solid; + border-radius: $border-radius; + padding: 0 0.3rem; + + & > line { + stroke: #333; + stroke-width: 2; + } + } + &__itemsCount { + flex: 1; + text-align: right; + margin-left: 0.5rem; + } +} diff --git a/src/src/components/CustomTable/Table.tsx b/src/src/components/CustomTable/Table.tsx new file mode 100644 index 00000000..b656b74d --- /dev/null +++ b/src/src/components/CustomTable/Table.tsx @@ -0,0 +1,603 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React, { useRef, useState, useEffect } from 'react'; +import classNames from 'classnames'; +import { isEmpty } from 'lodash-es'; + +import { Checkbox } from '@material-ui/core'; + +import { Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { + ROW_CELL_SIZE_CONFIG, + COLORED_SELECTION_COLUMN_WIDTH, + SELECTION_COLUMN_WIDTH, + RowHeightSize, +} from 'config/table/tableConfigs'; + +import getClosestValue from 'utils/getClosestValue'; + +import Column from './TableColumn'; + +import './Table.scss'; + +function Table(props) { + const columns = props.columns; + let leftCols = columns + .filter((col) => col.pin === 'left') + .map((col) => col.key); + + let midCols = columns + .filter((col) => col.pin !== 'left' && col.pin !== 'right') + .map((col) => col.key); + + let rightCols = columns + .filter((col) => col.pin === 'right') + .map((col) => col.key); + let [expanded, setExpanded] = useState({}); + let [colWidths, setColWidths] = useState({}); + let [colLefts, setColLefts] = useState({}); + let [middlePaneWindow, setMiddlePaneWindow] = useState([]); + + let prevExpanded = useRef(props.expanded ?? {}); + + const leftPane = columns + .filter((col) => leftCols.includes(col.key)) + .sort((a, b) => leftCols.indexOf(a.key) - leftCols.indexOf(b.key)); + const middlePane = columns + .filter((col) => midCols.includes(col.key)) + .sort((a, b) => midCols.indexOf(a.key) - midCols.indexOf(b.key)); + const rightPane = columns + .filter((col) => rightCols.includes(col.key)) + .sort((a, b) => rightCols.indexOf(a.key) - rightCols.indexOf(b.key)); + const sortedColumns = [...leftPane, ...middlePane, ...rightPane]; + + const groups = !Array.isArray(props.data); + + useEffect(() => { + if (props.expanded && groups) { + for (let groupKey in props.expanded) { + if ( + props.expanded[groupKey] && + prevExpanded.current[groupKey] !== props.expanded[groupKey] + ) { + setExpanded((exp) => ({ + ...exp, + [groupKey]: true, + })); + } + } + } + prevExpanded.current = props.expanded ?? {}; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [props.expanded]); + + useEffect(() => { + let rAFRef = window.requestAnimationFrame(() => { + let left = 0; + let lefts = {}; + Object.keys(colWidths) + .sort((a, b) => +a - +b) + .forEach((i) => { + lefts[i] = left; + left += Math.ceil(colWidths[i]); + }); + setColLefts(lefts); + }); + + return () => { + window.cancelAnimationFrame(rAFRef); + }; + }, [colWidths]); + + useEffect( + () => { + let rAFRef = window.requestAnimationFrame(() => { + const lefts = Object.values(colLefts); + + let leftClosest = getClosestValue(lefts, props.listWindow.left).index; + let rightClosest = lefts.length - 1; + + for (let i = leftClosest; i < lefts.length; i++) { + if (lefts[i] > props.listWindow.left + props.listWindow.width) { + rightClosest = i; + break; + } + } + + let left = leftClosest < 6 ? 0 : leftClosest - 5; + let right = rightClosest + 5; + + setMiddlePaneWindow((mPW) => + middlePane + .slice(left, right + (mPW.length === 0 ? 50 : 0)) // calculate first 50 columns widths and lefts on initial render + ?.map((col, i) => ({ + ...col, + colIndex: left + i, + })), + ); + }); + + return () => { + window.cancelAnimationFrame(rAFRef); + }; + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [props.listWindow.left, props.listWindow.width, colLefts, columns], + ); + + const color = React.useMemo( + () => props.data[0]?.rowMeta?.color, + // eslint-disable-next-line react-hooks/exhaustive-deps + [props.data[0]?.rowMeta?.color], + ); + + function expand(groupKey) { + if (groupKey === 'expand_all') { + let groupsForExpansion = {}; + for (let key in props.data) { + groupsForExpansion[key] = true; + prevExpanded.current[key] = true; + } + setExpanded({ + ...expanded, + ...groupsForExpansion, + }); + if (typeof props.onGroupExpandToggle === 'function') { + props.onGroupExpandToggle(Object.keys(props.data)); + } + } else if (groupKey === 'collapse_all') { + for (let key in props.data) { + prevExpanded.current[key] = false; + } + setExpanded({}); + if (typeof props.onGroupExpandToggle === 'function') { + props.onGroupExpandToggle([]); + } + } else { + prevExpanded.current[groupKey] = !expanded[groupKey]; + setExpanded({ + ...expanded, + [groupKey]: !expanded[groupKey], + }); + if (typeof props.onGroupExpandToggle === 'function') { + props.onGroupExpandToggle(groupKey); + } + } + } + + function togglePin(colKey, side) { + const columnsOrderClone = { + left: leftCols, + middle: midCols, + right: rightCols, + }; + if (side === 'left') { + if (columnsOrderClone.left.includes(colKey)) { + columnsOrderClone.left.splice( + columnsOrderClone.left.indexOf(colKey), + 1, + ); + columnsOrderClone.middle.unshift(colKey); + } else { + if (columnsOrderClone.right.includes(colKey)) { + columnsOrderClone.right.splice( + columnsOrderClone.right.indexOf(colKey), + 1, + ); + } else { + columnsOrderClone.middle.splice( + columnsOrderClone.middle.indexOf(colKey), + 1, + ); + } + columnsOrderClone.left.push(colKey); + } + } else if (side === 'right') { + if (columnsOrderClone.right.includes(colKey)) { + columnsOrderClone.right.splice( + columnsOrderClone.right.indexOf(colKey), + 1, + ); + columnsOrderClone.middle.unshift(colKey); + } else { + if (columnsOrderClone.left.includes(colKey)) { + columnsOrderClone.left.splice( + columnsOrderClone.left.indexOf(colKey), + 1, + ); + } else { + columnsOrderClone.middle.splice( + columnsOrderClone.middle.indexOf(colKey), + 1, + ); + } + columnsOrderClone.right.push(colKey); + } + } else { + if (columnsOrderClone.left.includes(colKey)) { + columnsOrderClone.left.splice( + columnsOrderClone.left.indexOf(colKey), + 1, + ); + } + if (columnsOrderClone.right.includes(colKey)) { + columnsOrderClone.right.splice( + columnsOrderClone.right.indexOf(colKey), + 1, + ); + } + columnsOrderClone.middle.unshift(colKey); + } + props.updateColumns(columnsOrderClone); + } + + function moveColumn(colKey, pane, from, direction) { + const columnsOrderClone = { + left: leftCols, + middle: midCols, + right: rightCols, + }; + let to; + switch (direction) { + case 'left': + to = from - 1; + break; + case 'right': + to = from + 1; + break; + case 'start': + to = 0; + break; + case 'end': + to = columnsOrderClone[pane].length - 1; + break; + } + columnsOrderClone[pane].splice(from, 1); + columnsOrderClone[pane].splice(to, 0, colKey); + props.updateColumns(columnsOrderClone); + } + + function showTopHeaderContent(index, colTopHeader, add) { + return ( + props.topHeader && + sortedColumns[add ? index + 1 : index - 1]?.topHeader !== colTopHeader + ); + } + + let midPaneWidth = + colLefts[Object.keys(colLefts).length - 1] + + colWidths[Object.keys(colWidths).length - 1]; + + if (midPaneWidth < props.listWindow.availableSpace) { + midPaneWidth = null; + } + + useEffect( + () => { + if (middlePane.length < Object.keys(colLefts).length) { + let widths = {}; + middlePaneWindow.forEach((col) => { + widths[col.colIndex] = colWidths[col.colIndex]; + }); + setColWidths(widths); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [middlePaneWindow, colLefts], + ); + + return ( + +
+
+ {!groups && props.multiSelect && Array.isArray(props.data) && ( + +
+ + } + checkedIcon={ + props.data.length === + Object.keys(props.selectedRows).length ? ( + + + + ) : ( + + + + ) + } + onClick={() => + props.onRowSelect({ + actionType: isEmpty(props.selectedRows) + ? 'selectAll' + : 'removeAll', + data: props.data, + }) + } + checked={!isEmpty(props.selectedRows)} + /> + ), + }} + data={props.data} + expanded={expanded} + expand={expand} + onRowSelect={props.onRowSelect} + onRowClick={props.onRowClick} + selectedRows={props.selectedRows} + firstColumn={true} + rowHeightMode={props.rowHeightMode} + width={ + color + ? COLORED_SELECTION_COLUMN_WIDTH + : SELECTION_COLUMN_WIDTH + } + isAlwaysVisible={true} + onRowHover={props.onRowHover} + listWindow={props.listWindow} + /> +
+
+ )} + {(groups || leftPane.length > 0) && ( +
+ {leftPane.map((col, index) => ( + + + props.setExcludedFields?.([ + ...(props.excludedFields || []), + col.key, + ]) + } + multiSelect={props.multiSelect} + paneFirstColumn={index === 0} + paneLastColumn={index === leftPane.length - 1} + rowHeightMode={props.rowHeightMode} + moveColumn={(dir) => + moveColumn(col.key, 'left', index, dir) + } + sortable={ + col.sortableKey && + props.sortFields.findIndex( + (f) => f[0] === col.sortableKey, + ) === -1 + } + onRowHover={props.onRowHover} + onRowClick={props.onRowClick} + columnOptions={col.columnOptions} + selectedRows={props.selectedRows} + onRowSelect={props.onRowSelect} + listWindow={props.listWindow} + /> + + ))} +
+ )} +
+ {middlePaneWindow?.map((col) => { + let index = col.colIndex; + return ( + + + props.setExcludedFields?.([ + ...(props.excludedFields || []), + col.key, + ]) + } + paneFirstColumn={index === 0} + paneLastColumn={index === middlePane.length - 1} + moveColumn={(dir) => + moveColumn(col.key, 'middle', index, dir) + } + sortable={ + col.sortableKey && + props.sortFields.findIndex( + (f) => f[0] === col.sortableKey, + ) === -1 + } + rowHeightMode={props.rowHeightMode} + onRowHover={props.onRowHover} + onRowClick={props.onRowClick} + columnOptions={col.columnOptions} + selectedRows={props.selectedRows} + setColWidth={(width) => + setColWidths((cW) => { + return cW?.[index] === width + ? cW + : { ...cW, [index]: width }; + }) + } + colLeft={colLefts[index] ?? null} + listWindow={props.listWindow} + /> + + ); + })} +
+ {rightPane.length > 0 && ( +
+ {rightPane.map((col, index) => ( + + + props.setExcludedFields?.([ + ...(props.excludedFields || []), + col.key, + ]) + } + paneFirstColumn={index === 0} + paneLastColumn={index === rightPane.length - 1} + moveColumn={(dir) => + moveColumn(col.key, 'right', index, dir) + } + sortable={ + col.sortableKey && + props.sortFields.findIndex( + (f) => f[0] === col.sortableKey, + ) === -1 + } + onRowHover={props.onRowHover} + onRowClick={props.onRowClick} + columnOptions={col.columnOptions} + selectedRows={props.selectedRows} + listWindow={props.listWindow} + /> + + ))} +
+ )} +
+
+
+ ); +} + +export default Table; diff --git a/src/src/components/CustomTable/TableCell.tsx b/src/src/components/CustomTable/TableCell.tsx new file mode 100644 index 00000000..0d914cde --- /dev/null +++ b/src/src/components/CustomTable/TableCell.tsx @@ -0,0 +1,97 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import * as React from 'react'; +import classNames from 'classnames'; +import _ from 'lodash-es'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +function Cell({ + index, + item, + className, + isConfigColumn, + metadata, + placeholder, + col, + onRowHover, + onRowClick, + multiSelect = false, + groupColumnColored, + getColumnCelBGColor, + columnsColorScales, + isNumeric, + box, + setColumnWidth, +}) { + let cellRef = React.useRef(); + + React.useEffect(() => { + setColumnWidth(cellRef.current?.offsetWidth ?? 0); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + +
+ {isConfigColumn || placeholder ? ( + <>{multiSelect && item} + ) : ( +
+ {typeof item === 'object' && item?.hasOwnProperty('component') + ? ?? '' + : typeof item === 'object' && item?.hasOwnProperty('content') + ? item?.content ?? '' + : item ?? ''} +
+ )} +
+
+ ); +} + +export default Cell; diff --git a/src/src/components/CustomTable/TableColumn.tsx b/src/src/components/CustomTable/TableColumn.tsx new file mode 100644 index 00000000..e554ee8d --- /dev/null +++ b/src/src/components/CustomTable/TableColumn.tsx @@ -0,0 +1,1057 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import * as React from 'react'; +import classNames from 'classnames'; +import _ from 'lodash-es'; +import { useResizeObserver } from 'hooks'; + +import { MenuItem, Tooltip, Divider, Checkbox } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { Button, Icon, Text } from 'components/kit'; +import GroupConfigPopover from 'components/GroupConfigPopover/GroupConfigPopover'; + +import { BGColorLighten } from 'config/colors/colors'; +import { + TABLE_COLUMN_START_COLOR_SCALE, + TABLE_COLUMN_END_COLOR_SCALE, + RowHeightSize, + ROW_CELL_SIZE_CONFIG, +} from 'config/table/tableConfigs'; + +import getColorFromRange from 'utils/d3/getColorFromRange'; +import changeDasharraySize from 'utils/changeDasharraySize'; + +import ControlPopover from '../ControlPopover/ControlPopover'; + +import Cell from './TableCell'; + +function Column({ + topHeader, + showTopHeaderContent, + showTopHeaderBorder, + col, + data, + expanded, + expand, + togglePin, + pinnedTo, + firstColumn, + width, + updateColumnWidth, + headerMeta, + isAlwaysVisible, + hideColumn, + paneFirstColumn, + paneLastColumn, + moveColumn, + onRowHover, + onRowClick, + columnOptions, + multiSelect, + selectedRows, + onRowSelect, + onToggleColumnsColorScales, + columnsColorScales, + rowHeightMode, + setColWidth, + colLeft, + listWindow, + noColumnActions, +}) { + const [maxWidth, setMaxWidth] = React.useState(width); + const [isResizing, setIsResizing] = React.useState(false); + const widthClone = React.useRef(width); + const columnRef = React.useRef(); + const startingPoint = React.useRef(null); + const groups = !Array.isArray(data); + + const dataLength = React.useMemo(() => { + if (Array.isArray(data)) { + return data.length; + } else { + return Object.values(data).reduce((acc: number, value: any) => { + acc += value.items.length; + return acc; + }, 0); + } + }, [data]); + + const colorScaleRange = React.useMemo(() => { + const columnData = _.isArray(data) + ? data + : _.values(data).reduce((acc, item) => { + return [...acc, ...item.items]; + }, []); + + let range = _.sortBy([ + ...new Set( + columnData + ?.filter((a) => !_.isArray(a[col.key]) && !_.isNaN(+a[col.key])) + .map((a) => +a[col.key]) ?? [], + ), + ]); + + if (_.isEmpty(range)) { + return null; + } else if (range.length === 1) { + return [range[0] - 0.1, range[0]]; + } + return range; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data]); + + // eslint-disable-next-line react-hooks/exhaustive-deps + const getColumnCelBGColor = React.useCallback( + getColorFromRange( + colorScaleRange ? [colorScaleRange[0], _.last(colorScaleRange)] : null, + TABLE_COLUMN_START_COLOR_SCALE, + TABLE_COLUMN_END_COLOR_SCALE, + ), + [data], + ); + + function resizeStart({ target }) { + setIsResizing(true); + if (pinnedTo === 'right') { + startingPoint.current = target.parentNode.getBoundingClientRect().right; + } else { + startingPoint.current = target.parentNode.getBoundingClientRect().left; + } + document.addEventListener('mousemove', resize); + document.addEventListener('mouseup', resizeEnd); + } + + function resize(evt) { + let newWidth; + if (pinnedTo === 'right') { + newWidth = startingPoint.current - evt.pageX; + } else { + newWidth = evt.pageX - startingPoint.current; + } + if (newWidth > 85) { + widthClone.current = newWidth; + setMaxWidth(newWidth); + } + document.body.style.webkitUserSelect = 'none'; + document.body.style.userSelect = 'none'; + document.body.style.cursor = 'col-resize'; + } + + function resizeEnd() { + setIsResizing(false); + document.removeEventListener('mousemove', resize); + document.removeEventListener('mouseup', resizeEnd); + document.body.style.userSelect = 'unset'; + document.body.style.cursor = 'unset'; + setTimeout(() => { + updateColumnWidth(col.key, widthClone.current); + }, 50); + } + + function resetWidth() { + updateColumnWidth(col.key, widthClone.current, true); + setMaxWidth(undefined); + if (columnRef.current) { + columnRef.current.style.width = 'initial'; + } + } + + React.useEffect(() => { + if (setColWidth) { + setColWidth(columnRef.current?.offsetWidth); + } + return () => { + document.removeEventListener('mousemove', resize); + document.removeEventListener('mouseup', resizeEnd); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useEffect(() => { + if (columnRef.current && col.key !== 'selection') { + columnRef.current.style.width = widthClone.current ?? 'initial'; + setMaxWidth(width); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data, expanded, width]); + + const rafIDRef = React.useRef(); + + const resizeObserverCallback = React.useCallback( + (entries: ResizeObserverEntry[]) => { + if (entries?.length) { + rafIDRef.current = window.requestAnimationFrame(() => { + if (setColWidth) { + setColWidth(columnRef.current?.offsetWidth); + } + }); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [data, expanded, width], + ); + + const observerReturnCallback = React.useCallback(() => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }, []); + + useResizeObserver(resizeObserverCallback, columnRef, observerReturnCallback); + + function getColumnHeight() { + if (groups) { + const groupKeys = Object.keys(data); + let expandedGroupKeys = groupKeys.filter((key) => expanded[key]); + let expandedGroupsDataCount = expandedGroupKeys.reduce( + (acc, currKey) => acc + data[currKey].items.length, + 0, + ); + return ( + ((topHeader ? 1 : 0) + 1 + groupKeys.length + expandedGroupsDataCount) * + rowHeightMode + + groupKeys.length * + (ROW_CELL_SIZE_CONFIG[rowHeightMode]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin) + + groupKeys.length + ); + } + + return ((topHeader ? 1 : 0) + 1 + dataLength) * rowHeightMode; + } + + let firstVisibleCellTop = null; + let firstVisibleGroupTop = null; + + function fixColumnWidth(width) { + if (maxWidth === undefined || width > maxWidth) { + setMaxWidth(width); + } + } + + return ( + +
+ {topHeader && ( +
+ {showTopHeaderContent && col.topHeader && ( + + {col.topHeader} + + )} +
+ )} +
+ {multiSelect && col.key === '#' && ( + } + className='Table__column__selectCheckbox' + checkedIcon={ + dataLength === Object.keys(selectedRows)?.length ? ( + + + + ) : ( + + + + ) + } + onClick={() => + onRowSelect({ + actionType: _.isEmpty(selectedRows) + ? 'selectAll' + : 'removeAll', + data: data, + }) + } + checked={!_.isEmpty(selectedRows)} + /> + )} + + {firstColumn ? headerMeta : null} + {col.content} + + {!noColumnActions && + col.key !== 'actions' && + col.key !== '#' && + col.key !== 'selection' && ( + <> + ( + +
+ +
+
+ )} + component={ +
+ {!_.isEmpty(colorScaleRange) && + onToggleColumnsColorScales && ( + onToggleColumnsColorScales(col.key)} + > + {columnsColorScales[col.key] ? ( + <> + + + + Reset color scale + + ) : ( + <> + + + + Apply color scale + + )} + + )} + {columnOptions && ( + <> + {columnOptions?.map((option) => ( + + + + + {option.value} + + ))} + + + )} + {!isAlwaysVisible && ( + + + + + Hide column + + )} + {(pinnedTo === 'left' || pinnedTo === 'right') && ( + togglePin(col.key, null)} + > + + + + Unpin + + )} + {pinnedTo !== 'left' && ( + togglePin(col.key, 'left')} + > + + + + Pin to left + + )} + {pinnedTo !== 'right' && ( + togglePin(col.key, 'right')} + > + + + + Pin to right + + )} + {!paneFirstColumn && ( + moveColumn('left')} + > + + + + Move left + + )} + {!paneLastColumn && ( + moveColumn('right')} + > + + + + Move right + + )} + {pinnedTo === null && !paneFirstColumn && ( + moveColumn('start')} + > + + + + Move to start + + )} + {pinnedTo === null && !paneLastColumn && ( + moveColumn('end')} + > + + + + Move to end + + )} + {width !== undefined && ( + + + + + Reset width + + )} +
+ } + /> +
+ + )} +
+ {groups + ? Object.keys(data).map((groupKey) => { + let top = + ROW_CELL_SIZE_CONFIG[rowHeightMode]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin; + let height = rowHeightMode; + for (let key in data) { + if (key === groupKey) { + if (expanded[key]) { + height += data[key].items.length * rowHeightMode; + } + break; + } + top += + (ROW_CELL_SIZE_CONFIG[rowHeightMode]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin) + + rowHeightMode + + 1; + if (expanded[key]) { + top += data[key].items.length * rowHeightMode; + } + } + const isVisible = + (top >= listWindow.top - rowHeightMode * 20 && + top <= + listWindow.top + listWindow.height + rowHeightMode * 20) || + (top < listWindow.top - rowHeightMode * 20 && + top + height >= listWindow.top); + + if (isVisible && firstVisibleGroupTop === null) { + firstVisibleGroupTop = top; + } else { + top = null; + } + const groupColor = data[groupKey].data.meta.color; + + return ( + isVisible && ( +
+ {col.key === '#' ? ( +
+ +
+ ) : col.key === 'actions' ? ( +
+ +
+ ) : ( + expand(groupKey), + }, + } + : { + content: data[groupKey].data[col.key], + props: { + onClick: (e) => expand(groupKey), + }, + } + } + className={classNames( + 'Table__group__header__cell expandable', + { + expanded: expanded[groupKey], + }, + )} + setColumnWidth={fixColumnWidth} + /> + )} + {expanded[groupKey] && ( + <> + {data[groupKey]?.items?.map((item, i) => { + let absoluteTop = + (ROW_CELL_SIZE_CONFIG[rowHeightMode]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md] + .groupMargin) + rowHeightMode; + let top = 0; + for (let key in data) { + if (key === groupKey) { + break; + } + absoluteTop += + (ROW_CELL_SIZE_CONFIG[rowHeightMode] + ?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md] + .groupMargin) + rowHeightMode; + if (expanded[key]) { + absoluteTop += + data[key].items.length * rowHeightMode; + } + } + absoluteTop += i * rowHeightMode; + top = i * rowHeightMode; + const isVisible = + absoluteTop >= + listWindow.top - rowHeightMode * 20 && + absoluteTop <= + listWindow.top + + listWindow.height + + rowHeightMode * 20; + if (isVisible && firstVisibleCellTop === null) { + firstVisibleCellTop = absoluteTop; + } + + return ( + isVisible && ( + + + + } + checkedIcon={ + + + + } + className='Table__column__selectCheckbox' + checked={ + !!selectedRows[item.selectKey] + } + onClick={(e) => { + e.stopPropagation(); + onRowSelect({ + actionType: 'single', + data: item, + }); + }} + /> + + ) : ( + item[col.key] || + data[groupKey].data[col.key] + ) + } + groupColumnColored={ + !!data[groupKey].data.meta.color + } + className={classNames(`rowKey-${item.key}`, { + inactive: item.isHidden, + selected: !!selectedRows?.[item.selectKey], + })} + isConfigColumn={col.key === '#'} + metadata={firstColumn ? item.rowMeta : null} + box={{ + top: + firstVisibleCellTop === absoluteTop + ? top + : null, + }} + onRowHover={ + onRowHover + ? () => onRowHover(item) + : undefined + } + onRowClick={ + onRowClick + ? () => onRowClick(item) + : undefined + } + setColumnWidth={fixColumnWidth} + /> + + ) + ); + })} + + )} +
+ ) + ); + }) + : data.map((item) => { + const top = item.index * rowHeightMode; + const isVisible = + top >= listWindow.top - rowHeightMode * 20 && + top <= listWindow.top + listWindow.height + rowHeightMode * 20; + if (isVisible && firstVisibleCellTop === null) { + firstVisibleCellTop = top; + } + + return ( + isVisible && ( + + {col.key === 'selection' ? ( + + + } + checkedIcon={ + + + + } + className='Table__column__selectCheckbox' + checked={!!selectedRows[item.selectKey]} + onClick={(e) => { + e.stopPropagation(); + onRowSelect({ + data: item, + actionType: 'single', + }); + }} + /> + + } + className={classNames(`rowKey-${item.key}`, { + inactive: item.isHidden, + selected: !!selectedRows?.[item.selectKey], + })} + metadata={ + firstColumn && + ((multiSelect && col.key === 'selection') || + !multiSelect) + ? item.rowMeta + : null + } + box={{ + top: firstVisibleCellTop === top ? top : null, + }} + onRowHover={ + onRowHover ? () => onRowHover(item) : undefined + } + onRowClick={ + onRowClick ? () => onRowClick(item) : undefined + } + setColumnWidth={fixColumnWidth} + /> + ) : ( + onRowHover(item) : undefined + } + onRowClick={ + onRowClick ? () => onRowClick(item) : undefined + } + setColumnWidth={fixColumnWidth} + /> + )} + + ) + ); + })} +
+ + ); +} + +function GroupConfig({ + config, + expand, + expanded, + groupKey, + multiSelect, + onRowSelect, + selectedRows, + data, +}) { + const configData = React.useMemo(() => { + return Object.keys(config.config).map((key) => { + return { name: key, value: config.config[key] }; + }); + }, [config.config]); + + const groupSelectedRows = React.useMemo(() => { + return data + .map((item) => item.selectKey) + .filter((selectKey: string) => selectedRows[selectKey]); + }, [data, selectedRows]); + + return ( + +
expand(groupKey)}> + + {multiSelect && ( + } + className='Table__column__selectCheckbox configCheckbox' + checkedIcon={ + data.length === groupSelectedRows?.length ? ( + + + + ) : ( + + + + ) + } + onClick={(e) => { + e.stopPropagation(); + onRowSelect({ + actionType: _.isEmpty(groupSelectedRows) + ? 'selectAll' + : 'removeAll', + data: data, + }); + }} + checked={!_.isEmpty(groupSelectedRows)} + /> + )} + {configData?.length > 0 && ( + ( + 1 ? 's' : '' + } in the group, grouped by ${configData.map( + (item) => ` ${item.name}`, + )}`} + > +
+ +
+
+ )} + component={} + /> + )} + {!_.isNil(config.chartIndex) && config.chartIndex !== 0 && ( + + + {config.chartIndex} + + + )} + {config.dasharray !== null && ( + + + + + + )} +
+
+ ); +} + +function GroupActions({ expand, expanded, groupKeys, groupKey }) { + return ( + + ( + +
+ +
+
+ )} + component={({ handleClose }) => ( +
+ { + handleClose(); + expand(groupKey); + }} + > + + + + + {expanded[groupKey] ? 'Collapse group' : 'Expand group'} + + + {(expanded[groupKey] || + groupKeys.some((key) => !!expanded[key])) && ( + { + handleClose(); + expand('collapse_all'); + }} + > + + + + Collapse all + + )} + {(!expanded[groupKey] || + groupKeys.some((key) => !expanded[key])) && ( + { + handleClose(); + expand('expand_all'); + }} + > + + + + Expand all + + )} +
+ )} + /> +
+ ); +} + +export default Column; diff --git a/src/src/components/CustomTable/TablePopover.tsx b/src/src/components/CustomTable/TablePopover.tsx new file mode 100644 index 00000000..17417a48 --- /dev/null +++ b/src/src/components/CustomTable/TablePopover.tsx @@ -0,0 +1,160 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React, { useState, useRef, useEffect } from 'react'; +import ReactDOM from 'react-dom'; +import classNames from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +const margin = 5; +const offset = 30; + +function Popover(props) { + let [opened, setOpened] = useState(false); + let [position, setPosition] = useState({}); + + let containerRectRef = useRef(); + let containerRef = useRef(); + let popupRef = useRef(); + let portalRef = useRef(document.createElement('div')); + let timerRef = useRef(); + + useEffect(() => { + if (opened && !document.body.contains(portalRef.current)) { + document.body.append(portalRef.current); + } else if (!opened && document.body.contains(portalRef.current)) { + document.body.removeChild(portalRef.current); + } + return () => { + if (document.body.contains(portalRef.current)) { + // eslint-disable-next-line react-hooks/exhaustive-deps + document.body.removeChild(portalRef.current); + } + }; + }, [opened]); + + useEffect(() => { + if (opened && popupRef.current) { + popupRef.current.focus(); + containerRectRef.current = containerRef.current.getBoundingClientRect(); + } + }, [opened]); + + useEffect(() => { + if (opened && containerRef.current && popupRef.current) { + calculatePosition(); + timerRef.current = setInterval(() => { + if (containerRef.current && popupRef.current) { + let containerRect = containerRef.current.getBoundingClientRect(); + if ( + Math.abs(containerRectRef.current.x - containerRect.x) > offset || + Math.abs(containerRectRef.current.y - containerRect.y) > offset + ) { + setOpened(false); + } else { + calculatePosition(); + } + } + }, 250); + } + return () => { + clearInterval(timerRef.current); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [opened]); + + function calculatePosition() { + let positions = { + top: null, + left: null, + }; + let containerRect = containerRef.current.getBoundingClientRect(); + let popupRect = popupRef.current.getBoundingClientRect(); + + if (!containerRectRef.current) { + containerRectRef.current = containerRect; + } + + if ( + containerRect.y + containerRect.height + margin + popupRect.height >= + window.innerHeight + ) { + positions.top = containerRect.top - popupRect.height - margin; + } else { + positions.top = containerRect.bottom + margin; + } + + if (props.alignBy === 'left') { + if (window.innerWidth - (containerRect.x + popupRect.width) <= 10) { + positions.left = window.innerWidth - popupRect.width - margin; + } else { + positions.left = containerRect.x; + } + } else { + if (containerRect.x - popupRect.width + containerRect.width <= 10) { + positions.left = margin; + } else { + positions.left = + containerRect.x - popupRect.width + containerRect.width; + } + } + + setPosition((p) => ({ + ...p, + ...positions, + })); + } + + return ( + +
{ + evt.stopPropagation(); + setOpened(!opened); + }} + > + {typeof props.target === 'function' + ? props.target(opened) + : props.target} +
+ {opened && + ReactDOM.createPortal( +
evt.stopPropagation()} + onBlur={(evt) => { + const currentTarget = evt.currentTarget; + if (opened) { + window.setTimeout(() => { + if (!currentTarget.contains(document.activeElement)) { + setOpened(false); + } + }, 200); + } + }} + > + {typeof props.content === 'function' + ? props.content(opened, setOpened) + : props.content} +
, + portalRef.current, + )} +
+ ); +} + +export default Popover; diff --git a/src/src/components/DepthDropdown/DepthDropdown.d.ts b/src/src/components/DepthDropdown/DepthDropdown.d.ts new file mode 100644 index 00000000..f657c699 --- /dev/null +++ b/src/src/components/DepthDropdown/DepthDropdown.d.ts @@ -0,0 +1,6 @@ +export interface IDepthDropdownProps { + index: number; + pathValue: string | string[]; + depth: number; + onDepthChange: (value: number, index: number) => void; +} diff --git a/src/src/components/DepthDropdown/DepthDropdown.scss b/src/src/components/DepthDropdown/DepthDropdown.scss new file mode 100644 index 00000000..2b5af214 --- /dev/null +++ b/src/src/components/DepthDropdown/DepthDropdown.scss @@ -0,0 +1,36 @@ +@use 'src/styles/abstracts' as *; + +.DepthDropdown { + &__button { + display: inline-flex; + align-items: center; + margin-left: $space-xxxs; + } + &__autocomplete { + &__popper{ + width: auto!important; + } + &__select { + width: 100%; + & > input { + padding: $space-xs; + font-size: $text-sm; + border-bottom: $border-main; + } + &__optionIcon { + margin-left: $space-xxxs; + color: $primary-color; + } + &__optionLabel { + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + &.selected { + color: $primary-color; + } + } + } + } +} + \ No newline at end of file diff --git a/src/src/components/DepthDropdown/DepthDropdown.tsx b/src/src/components/DepthDropdown/DepthDropdown.tsx new file mode 100644 index 00000000..e1165bed --- /dev/null +++ b/src/src/components/DepthDropdown/DepthDropdown.tsx @@ -0,0 +1,116 @@ +import React from 'react'; +import classNames from 'classnames'; + +import Autocomplete from '@material-ui/lab/Autocomplete'; +import { InputBase } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; + +import { MEDIA_SET_TITLE_HEIGHT } from 'config/mediaConfigs/mediaConfigs'; + +import { IDepthDropdownProps } from './DepthDropdown.d'; + +import './DepthDropdown.scss'; + +function DepthDropdown({ + index, + pathValue, + depth, + onDepthChange, +}: IDepthDropdownProps): React.FunctionComponentElement { + const depthOptions = React.useMemo(() => { + return (pathValue as string[]).map((v, i) => ({ + depth: i, + label: v, + })); + }, [pathValue]); + return ( + + ( + + )} + component={ + option.label} + getOptionSelected={(option) => option.depth === depth} + onChange={(e, value) => { + onDepthChange?.(value.depth, index); + }} + disableClearable={true} + ListboxProps={{ + style: { + maxHeight: 200, + maxWidth: 241, + }, + }} + classes={{ + popper: 'DepthDropdown__autocomplete__popper', + }} + renderInput={(params) => ( + + )} + renderOption={(option) => ( + <> + + {option.label} + + {depth === option.depth && ( + + )} + + )} + /> + } + /> + + ); +} + +DepthDropdown.displayName = 'DepthDropdown'; + +export default React.memo(DepthDropdown); diff --git a/src/src/components/DepthDropdown/index.tsx b/src/src/components/DepthDropdown/index.tsx new file mode 100644 index 00000000..868a6613 --- /dev/null +++ b/src/src/components/DepthDropdown/index.tsx @@ -0,0 +1,5 @@ +import DepthDropdown from './DepthDropdown'; + +export * from './DepthDropdown.d'; + +export default DepthDropdown; diff --git a/src/src/components/DepthSlider/DepthSlider.d.ts b/src/src/components/DepthSlider/DepthSlider.d.ts new file mode 100644 index 00000000..27f1aeb6 --- /dev/null +++ b/src/src/components/DepthSlider/DepthSlider.d.ts @@ -0,0 +1,12 @@ +import React from 'react'; + +export interface IDepthSliderProps { + index?: number; + items: any[]; + depth: number; + onDepthChange: (value: number, index: number) => void; + style?: React.CSSProperties; + valueLabelDisplay?: 'on' | 'auto' | 'off'; + label?: React.ReactNode; + className?: string; +} diff --git a/src/src/components/DepthSlider/DepthSlider.scss b/src/src/components/DepthSlider/DepthSlider.scss new file mode 100644 index 00000000..c4b51c79 --- /dev/null +++ b/src/src/components/DepthSlider/DepthSlider.scss @@ -0,0 +1,24 @@ +@use 'src/styles/abstracts' as *; + +.DepthSlider { + display: flex; + align-items: center; + padding-top: $space-xxs; + & > .Slider { + width: toRem(407px); + height: 100%; + & .MuiSlider-mark { + top: 50%; + transform: translate(-1px, -50%); + width: toRem(1px); + height: toRem(5px); + } + & .prevIconBtn { + margin-right: $space-xxs; + } + & .nextIconBtn { + margin-left: $space-xxs; + } + } +} + \ No newline at end of file diff --git a/src/src/components/DepthSlider/DepthSlider.tsx b/src/src/components/DepthSlider/DepthSlider.tsx new file mode 100644 index 00000000..e2a4e20f --- /dev/null +++ b/src/src/components/DepthSlider/DepthSlider.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Button, Icon, Slider } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IDepthSliderProps } from '.'; + +import './DepthSlider.scss'; + +function DepthSlider({ + index = 0, + items, + depth, + onDepthChange, + style = {}, + valueLabelDisplay = 'off', + label, + className = '', +}: IDepthSliderProps) { + const sliderMarks = React.useMemo(() => { + return (items as string[]).map((l, i) => ({ value: i })); + }, [items]); + const onChange = React.useCallback( + (value: number, i: number) => { + if (typeof onDepthChange === 'function') { + onDepthChange(value, i); + } + }, + [onDepthChange], + ); + const maxDepthValue = items.length - 1; + return items.length === 0 ? null : ( + +
+ `${items[value]}`} + value={depth} + onChange={(e, value) => onChange(value as number, index)} + step={null} + marks={sliderMarks} + min={0} + max={maxDepthValue} + prevIconNode={ + + } + nextIconNode={ + + } + /> +
+
+ ); +} + +DepthSlider.displayName = 'DepthSlider'; + +export default React.memo(DepthSlider); diff --git a/src/src/components/DepthSlider/index.tsx b/src/src/components/DepthSlider/index.tsx new file mode 100644 index 00000000..0d8d9fc7 --- /dev/null +++ b/src/src/components/DepthSlider/index.tsx @@ -0,0 +1,5 @@ +import DepthSlider from './DepthSlider'; + +export * from './DepthSlider.d'; + +export default DepthSlider; diff --git a/src/src/components/ErrorBoundary/ErrorBoundary.tsx b/src/src/components/ErrorBoundary/ErrorBoundary.tsx new file mode 100644 index 00000000..4f40d5e9 --- /dev/null +++ b/src/src/components/ErrorBoundary/ErrorBoundary.tsx @@ -0,0 +1,40 @@ +import React from 'react'; + +import { + IErrorBoundaryProps, + IErrorBoundaryState, +} from 'types/components/ErrorBoundary/ErrorBoundary'; + +class ErrorBoundary extends React.Component< + IErrorBoundaryProps, + IErrorBoundaryState +> { + private _fallback: React.FunctionComponent; + + constructor(props: IErrorBoundaryProps) { + super(props); + this.state = { + error: null, + }; + + this._fallback = () => props.fallback ??

Something went wrong.

; + } + + static getDerivedStateFromError(error: Error): IErrorBoundaryState { + return { error }; + } + + componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void { + // Log error to reporting servie + } + + render(): React.ReactNode { + if (this.state.error) { + return ; + } + + return this.props.children; + } +} + +export default ErrorBoundary; diff --git a/src/src/components/ErrorBoundary/index.ts b/src/src/components/ErrorBoundary/index.ts new file mode 100644 index 00000000..388e219f --- /dev/null +++ b/src/src/components/ErrorBoundary/index.ts @@ -0,0 +1,3 @@ +import ErrorBoundary from './ErrorBoundary'; + +export default ErrorBoundary; diff --git a/src/src/components/ExperimentNameBox/ExperimentNameBox.d.ts b/src/src/components/ExperimentNameBox/ExperimentNameBox.d.ts new file mode 100644 index 00000000..9d0b4f9b --- /dev/null +++ b/src/src/components/ExperimentNameBox/ExperimentNameBox.d.ts @@ -0,0 +1,5 @@ +export interface IExperimentNameBoxProps { + experimentName: string; + experimentId: string; + hidden?: boolean; +} diff --git a/src/src/components/ExperimentNameBox/ExperimentNameBox.scss b/src/src/components/ExperimentNameBox/ExperimentNameBox.scss new file mode 100644 index 00000000..a8d601d8 --- /dev/null +++ b/src/src/components/ExperimentNameBox/ExperimentNameBox.scss @@ -0,0 +1,11 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentNameBox { + display: flex; + align-items: center; + &.isHidden { + .MuiTypography-root { + color: $primary-color-50; + } + } +} diff --git a/src/src/components/ExperimentNameBox/ExperimentNameBox.tsx b/src/src/components/ExperimentNameBox/ExperimentNameBox.tsx new file mode 100644 index 00000000..ac1e3736 --- /dev/null +++ b/src/src/components/ExperimentNameBox/ExperimentNameBox.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { Link as RouteLink } from 'react-router-dom'; +import classNames from 'classnames'; + +import { Link, Tooltip } from '@material-ui/core'; + +import { PathEnum } from 'config/enums/routesEnum'; + +import { IExperimentNameBoxProps } from '.'; + +import './ExperimentNameBox.scss'; + +const ExperimentNameBox = ({ + experimentId, + experimentName, + hidden = false, +}: IExperimentNameBoxProps) => { + return ( + + ); +}; + +export default ExperimentNameBox; diff --git a/src/src/components/ExperimentNameBox/index.ts b/src/src/components/ExperimentNameBox/index.ts new file mode 100644 index 00000000..312bdb15 --- /dev/null +++ b/src/src/components/ExperimentNameBox/index.ts @@ -0,0 +1,5 @@ +import ExperimentNameBox from './ExperimentNameBox'; + +export * from './ExperimentNameBox.d'; + +export default ExperimentNameBox; diff --git a/src/src/components/ExportPreview/ExportPreview.d.ts b/src/src/components/ExportPreview/ExportPreview.d.ts new file mode 100644 index 00000000..a39845d6 --- /dev/null +++ b/src/src/components/ExportPreview/ExportPreview.d.ts @@ -0,0 +1,21 @@ +import React from 'react'; + +export interface IExportPreviewProps { + openModal: boolean; + onToggleExportPreview: () => void; + withDynamicDimensions?: boolean; + explorerPage?: 'metrics' | 'scatters'; + children?: React.ReactNode; + appendElement?: React.ReactNode; +} + +export interface IPreviewBounds { + max: { + width: number; + height: number; + }; + min: { + width: number; + height: number; + }; +} diff --git a/src/src/components/ExportPreview/ExportPreview.scss b/src/src/components/ExportPreview/ExportPreview.scss new file mode 100644 index 00000000..0c3d742e --- /dev/null +++ b/src/src/components/ExportPreview/ExportPreview.scss @@ -0,0 +1,126 @@ +@use 'src/styles/abstracts' as *; + +.ExportPreview { + .ChartGrid, .ChartLegends { + height: 100%; + margin: 0; + padding: 0; + box-shadow: none; + border: none; + outline: none; + } + .ChartLegends { + &__container { + overflow: visible; + } + } + &__modal { + & > .Modal { + overflow: hidden; + & > .Modal__content { + overflow: hidden; + flex: 1; + display: flex; + flex-direction: column; + margin-top: 1rem; + } + } + & .Modal__header { + justify-content: center; + } + } + &__container { + width: 80vw; + height: 62vh; + overflow: auto; + margin: toRem(1px); + border-radius: $border-radius-sm; + box-shadow: 0 0 0 toRem(1px) $cuddle; + display: flex; + &__grid { + height: 100%; + width: 100%; + margin: 0; + display: flex; + flex-wrap: wrap; + } + &__appendElement { + height: 100%; + width: 100%; + } + } + &__controls { + display: flex; + align-items: center; + margin-top: $space-xs; + flex-direction: column; + @include mq(xl) { + flex-direction: row; + } + &__dimension { + display: flex; + justify-content: center; + align-items: center; + white-space: nowrap; + width: 100%; + margin-top: $space-unit; + &__width { + margin-right: $space-sm; + display: flex; + align-items: center; + flex: 1; + &__slider { + width: 100%; + margin: 0 $space-sm 0 $space-xs; + } + &__input { + & > .MuiInputBase-root { + font-size: 0.75rem; + } + } + .InputWrapper { + width: toRem(85px); + min-width: toRem(85px); + } + } + &__height { + display: flex; + align-items: center; + flex: 1; + &__slider { + width: 100%; + margin: 0 $space-sm 0 $space-xs; + } + &__input { + & > .MuiInputBase-root { + font-size: 0.75rem; + } + } + .InputWrapper { + width: toRem(85px); + min-width: toRem(85px); + } + } + } + &__additional { + display: flex; + align-items: center; + margin-left: auto; + margin-top: $space-unit; + @include mq(xl) { + margin-left: $space-sm; + } + &__formatDropdown { + width: toRem(97px); + display: inline-block; + } + &__nameInput{ + display: inline-block; + margin-right: $space-xs; + & .MuiTextField-root { + width: toRem(224px); + } + } + } + } +} diff --git a/src/src/components/ExportPreview/ExportPreview.tsx b/src/src/components/ExportPreview/ExportPreview.tsx new file mode 100644 index 00000000..2f6abaeb --- /dev/null +++ b/src/src/components/ExportPreview/ExportPreview.tsx @@ -0,0 +1,429 @@ +import React from 'react'; +import moment from 'moment'; + +import { Dropdown, InputWrapper, Modal, Slider, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_EXPORTING_FORMAT } from 'config/dates/dates'; + +import * as analytics from 'services/analytics'; + +import { downloadLink, getSVGString, imgSource2Image } from 'utils/helper'; + +import { FORMAT_ENUM, PREVIEW_BOUNDS, PREVIEW_MODAL_DIMENSION } from './config'; + +import { IExportPreviewProps } from '.'; + +import './ExportPreview.scss'; + +function ExportPreview({ + openModal, + onToggleExportPreview, + withDynamicDimensions = false, + explorerPage = 'metrics', + children, + appendElement = null, +}: IExportPreviewProps): React.FunctionComponentElement { + const gridRef = React.useRef(null); + const previewRef = React.useRef(null); + const appendElRef = React.useRef(null); + + const [processing, setProcessing] = React.useState(false); + const [openFormatDropdown, setOpenFormatDropdown] = + React.useState(false); + const [previewDimension, setPreviewDimension] = React.useState( + PREVIEW_MODAL_DIMENSION, + ); + const [format, setFormat] = React.useState(FORMAT_ENUM.SVG); + const [fileName, setFileName] = React.useState( + `${explorerPage}-${moment().format(DATE_EXPORTING_FORMAT)}`, + ); + const [isImageWidthValid, setIsImageWidthValid] = + React.useState(false); + const [isImageHeightValid, setIsImageHeightValid] = + React.useState(false); + + const clearChart = React.useCallback( + (svgElement: SVGSVGElement): SVGSVGElement => { + // remove hover attributes from chart + const attributes = svgElement.querySelector('.Attributes'); + if (attributes) { + attributes.remove?.(); + } + return svgElement; + }, + [], + ); + + const appendVizNodes = React.useCallback( + ( + wrapper: SVGSVGElement, + chartGrid: HTMLElement, + imgFormat: FORMAT_ENUM, + ) => { + const svgVizNodes = chartGrid.querySelectorAll('svg.Visualization'); + const gridColumns = Math.round( + chartGrid.scrollWidth / svgVizNodes[0].clientWidth, + ); + let gridRows = 0; + svgVizNodes?.forEach((svgVizNode, index) => { + if (index !== 0 && index % gridColumns === 0) { + gridRows++; + } + const clearedSvgElement = clearChart( + svgVizNode.cloneNode(true) as SVGSVGElement, + ); + const columnIndex = index % gridColumns; + clearedSvgElement.setAttribute( + 'x', + columnIndex * svgVizNode.clientWidth + 'px', + ); + if (gridRows) { + clearedSvgElement.setAttribute( + 'y', + gridRows * svgVizNode.clientHeight + 'px', + ); + } + const rect = clearedSvgElement.querySelector('rect'); + if (rect && imgFormat !== FORMAT_ENUM.PNG) { + clearedSvgElement.style.backgroundColor = 'white'; + clearedSvgElement.style.fill = 'white'; + rect.style.fill = 'white'; + } + wrapper.appendChild(clearedSvgElement); + }); + }, + [clearChart], + ); + + const appendLegends = React.useCallback( + ( + wrapper: SVGSVGElement, + chartLegends: HTMLElement | null, + gridWidth: number, + gridHeight: number, + format: FORMAT_ENUM, + ) => { + const svgLegendNode = chartLegends?.querySelector('svg.Legends'); + if (chartLegends && svgLegendNode) { + const { scrollWidth: legendsWidth, scrollHeight: legendsHeight } = + svgLegendNode; + const clonedSVGNode = svgLegendNode.cloneNode(true) as SVGSVGElement; + clonedSVGNode.setAttribute('x', gridWidth + 'px'); + clonedSVGNode.setAttribute('y', '0px'); + + const width = gridWidth + legendsWidth; + const height = legendsHeight > gridHeight ? legendsHeight : gridHeight; + + wrapper.setAttribute('width', width + 'px'); + wrapper.setAttribute('height', height + 'px'); + wrapper.setAttribute('viewBox', `0 0 ${width} ${height}`); + + if (format !== FORMAT_ENUM.PNG) { + clonedSVGNode.style.backgroundColor = 'white'; + clonedSVGNode.style.fill = 'white'; + } + wrapper.appendChild(clonedSVGNode); + return { width, height }; + } + return { width: gridWidth, height: gridHeight }; + }, + [], + ); + + const createSVGWrapper = React.useCallback( + (width: number, height: number, format: FORMAT_ENUM): SVGSVGElement => { + const nameSpace = 'http://www.w3.org/2000/svg'; + let wrapper: SVGSVGElement = document.createElementNS(nameSpace, 'svg'); + wrapper.setAttribute('width', `${width}px`); + wrapper.setAttribute('height', `${height}px`); + wrapper.setAttribute('viewBox', `0 0 ${width} ${height}`); + wrapper.setAttribute('preserveAspectRatio', 'xMidYMid meet'); + if (format !== FORMAT_ENUM.PNG) { + wrapper.style.backgroundColor = 'white'; + wrapper.style.fill = 'white'; + } + return wrapper; + }, + [], + ); + + const getExportFunc = React.useCallback( + ( + svgWrapper: SVGSVGElement, + fileName: string, + width: number, + height: number, + ) => { + const svgString = getSVGString(svgWrapper); + const imgSrc = + 'data:image/svg+xml;base64,' + + btoa(unescape(encodeURIComponent(svgString))); // Convert SVG string to data URL + + const imgSrcExportDict = { + [FORMAT_ENUM.SVG]: () => downloadLink(imgSrc, fileName || 'name'), + [FORMAT_ENUM.PNG]: () => + imgSource2Image({ + imgSrc, + width, + height, + format: FORMAT_ENUM.PNG, + callback: (blob) => { + const src = URL.createObjectURL(blob); + downloadLink(src, fileName || 'name'); + }, + }), + [FORMAT_ENUM.JPEG]: () => + imgSource2Image({ + imgSrc, + width, + height, + format: FORMAT_ENUM.JPEG, + callback: (blob) => { + const src = URL.createObjectURL(blob); + downloadLink(src, fileName || 'name'); + }, + }), + }; + + return imgSrcExportDict; + }, + [], + ); + + const onExportImage = React.useCallback((): void => { + setProcessing(true); + try { + const chartGrid = gridRef.current; + if (chartGrid) { + const { scrollWidth: gridWidth, scrollHeight: gridHeight } = chartGrid; + + const svgWrapper = createSVGWrapper(gridWidth, gridHeight, format); + appendVizNodes(svgWrapper, chartGrid, format); + + const chartLegends = appendElRef.current; + + const { width: imgWidth, height: imgHeight } = appendLegends( + svgWrapper, + chartLegends, + gridWidth, + gridHeight, + format, + ); + + const exportFunc = getExportFunc( + svgWrapper, + fileName, + imgWidth, + imgHeight, + )[format]; + + if (typeof exportFunc === 'function') { + exportFunc(); + } + + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[explorerPage].chart.controls.exportChart, + ); + } + } catch (err) { + // eslint-disable-next-line no-console + console.error(err); + } finally { + setProcessing(false); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [format, createSVGWrapper, fileName, appendLegends, appendVizNodes]); + + const formatOptions = React.useMemo( + () => + Object.entries(FORMAT_ENUM).map(([label, value]) => ({ + value, + label, + })), + [], + ); + + const updateChart = React.useCallback( + (dimensions: { height?: number; width?: number }) => { + if (previewRef.current) { + if (dimensions.hasOwnProperty('height')) { + previewRef.current.style.height = `${dimensions['height']}px`; + previewRef.current.style.minHeight = `${dimensions['height']}px`; + } + if (dimensions.hasOwnProperty('width')) { + previewRef.current.style.width = `${dimensions['width']}px`; + previewRef.current.style.minWidth = `${dimensions['width']}px`; + } + } + }, + [], + ); + + const onDimensionChange = React.useCallback( + (key: string, newValue: number, metadata: any = { isValid: true }) => { + if (metadata.isValid) { + updateChart({ [key]: newValue }); + } + setPreviewDimension((prev) => ({ + ...prev, + [key]: newValue, + })); + }, + [updateChart], + ); + + const validationPatterns = React.useCallback( + (min: number, max: number) => [ + { + errorCondition: (value: number) => value < min, + errorText: `Value should be equal or greater then ${min}`, + }, + { + errorCondition: (value: number) => value > max, + errorText: `Value should be equal or smaller then ${max}`, + }, + ], + [], + ); + + return ( + + +
+
+
+ {children} +
+
+ {!!appendElement && ( +
+ {appendElement} +
+ )} +
+
+ {withDynamicDimensions && ( +
+
+ Chart Width + , + v: number | number[], + ) => { + onDimensionChange('width', v as number); + }} + /> + { + onDimensionChange('width', value, metadata); + setIsImageWidthValid(metadata.isValid); + }} + validationPatterns={validationPatterns( + PREVIEW_BOUNDS.min.width, + PREVIEW_BOUNDS.max.width, + )} + /> +
+
+ Single Chart Height + , + v: number | number[], + ) => { + onDimensionChange('height', v as number); + }} + /> + { + onDimensionChange('height', value, metadata); + setIsImageHeightValid(metadata.isValid); + }} + validationPatterns={validationPatterns( + PREVIEW_BOUNDS.min.height, + PREVIEW_BOUNDS.max.height, + )} + /> +
+
+ )} +
+ { + setFileName(value); + }} + /> + val && setFormat(val.value as FORMAT_ENUM)} + value={format} + options={formatOptions} + onMenuOpen={() => setOpenFormatDropdown(true)} + onMenuClose={() => setOpenFormatDropdown(false)} + open={openFormatDropdown} + /> +
+
+
+
+ ); +} + +ExportPreview.displayName = 'ExportPreview'; + +export default React.memo(ExportPreview); diff --git a/src/src/components/ExportPreview/config.ts b/src/src/components/ExportPreview/config.ts new file mode 100644 index 00000000..e9890b91 --- /dev/null +++ b/src/src/components/ExportPreview/config.ts @@ -0,0 +1,25 @@ +import { IPreviewBounds } from './ExportPreview.d'; + +const PREVIEW_BOUNDS: IPreviewBounds = { + max: { + width: 4000, + height: 2000, + }, + min: { + width: 200, + height: 150, + }, +}; + +const PREVIEW_MODAL_DIMENSION = { + width: 1366, + height: 540, +}; + +enum FORMAT_ENUM { + SVG = 'svg', + JPEG = 'jpeg', + PNG = 'png', +} + +export { PREVIEW_BOUNDS, PREVIEW_MODAL_DIMENSION, FORMAT_ENUM }; diff --git a/src/src/components/ExportPreview/index.tsx b/src/src/components/ExportPreview/index.tsx new file mode 100644 index 00000000..1cb220b2 --- /dev/null +++ b/src/src/components/ExportPreview/index.tsx @@ -0,0 +1,5 @@ +import ExportPreview from './ExportPreview'; + +export * from './ExportPreview.d'; + +export default ExportPreview; diff --git a/src/src/components/GroupConfigPopover/GroupConfigPopover.scss b/src/src/components/GroupConfigPopover/GroupConfigPopover.scss new file mode 100644 index 00000000..7bc36579 --- /dev/null +++ b/src/src/components/GroupConfigPopover/GroupConfigPopover.scss @@ -0,0 +1,15 @@ +@use 'src/styles/abstracts' as *; + +.GroupConfigPopover { + padding: 0.75rem 1rem; + max-width: 500px; + &__item { + margin-bottom: $space-xxxs; + display: flex; + justify-content: space-between; + &_value { + margin-left: $space-xs; + word-break: break-word; + } + } +} diff --git a/src/src/components/GroupConfigPopover/GroupConfigPopover.tsx b/src/src/components/GroupConfigPopover/GroupConfigPopover.tsx new file mode 100644 index 00000000..f737ddf6 --- /dev/null +++ b/src/src/components/GroupConfigPopover/GroupConfigPopover.tsx @@ -0,0 +1,52 @@ +import React from 'react'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IGroupConfigPopoverProps } from 'types/components/GroupConfigPopover/GroupConfigPopover'; + +import stopPropagation from 'utils/stopPropagation'; +import { formatValue } from 'utils/formatValue'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; + +import './GroupConfigPopover.scss'; + +/** + * @property {Array<{name: string, value: string}>} configData - array of applied grouping config of line + */ + +function GroupConfigPopover({ + configData, +}: IGroupConfigPopoverProps): React.FunctionComponentElement { + return ( + +
+ {configData.map((item: any) => { + let value = isSystemMetric(item.value) + ? formatValue(formatSystemMetricName(item.value)) + : formatValue(item.value); + + return ( +
+ + {item.name}: + + + {value} + +
+ ); + })} +
+
+ ); +} + +GroupConfigPopover.displayName = 'GroupConfigPopover'; + +export default React.memo(GroupConfigPopover); diff --git a/src/src/components/Grouping/Grouping.scss b/src/src/components/Grouping/Grouping.scss new file mode 100644 index 00000000..aec435ee --- /dev/null +++ b/src/src/components/Grouping/Grouping.scss @@ -0,0 +1,21 @@ +@use 'src/styles/abstracts' as *; + +.Grouping { + display: flex; + flex-direction: column; + justify-content: space-between; + border-left: $border-main; + padding: 0.725rem $space-lg; + &__title { + display: flex; + .Text { + text-transform: uppercase; + letter-spacing: 0.3px; + } + } + &__content { + display: flex; + align-items: center; + justify-content: center; + } +} diff --git a/src/src/components/Grouping/Grouping.tsx b/src/src/components/Grouping/Grouping.tsx new file mode 100644 index 00000000..6b66295c --- /dev/null +++ b/src/src/components/Grouping/Grouping.tsx @@ -0,0 +1,83 @@ +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { Text } from 'components/kit'; + +import GroupingPopovers, { + GroupNameEnum, +} from 'config/grouping/GroupingPopovers'; + +import { IGroupingProps } from 'types/pages/components/Grouping/Grouping'; + +import GroupingItem from '../GroupingItem/GroupingItem'; + +import './Grouping.scss'; + +function Grouping({ + groupingData, + groupingSelectOptions, + onGroupingSelectChange, + onGroupingModeChange, + onGroupingPaletteChange, + onGroupingReset, + onGroupingPersistenceChange, + onGroupingApplyChange, + onShuffleChange, + groupingPopovers = GroupingPopovers, + isDisabled = false, +}: IGroupingProps): React.FunctionComponentElement { + return ( + +
+
+ + Group by + +
+
+ {groupingPopovers.map( + ({ title, inputLabel, groupName, AdvancedComponent }) => { + return ( + + ) + } + onReset={() => onGroupingReset(groupName as GroupNameEnum)} + onVisibilityChange={() => + onGroupingApplyChange(groupName as GroupNameEnum) + } + /> + ); + }, + )} +
+
+
+ ); +} + +export default React.memo(Grouping); diff --git a/src/src/components/GroupingItem/GroupingItem.scss b/src/src/components/GroupingItem/GroupingItem.scss new file mode 100644 index 00000000..def79ae2 --- /dev/null +++ b/src/src/components/GroupingItem/GroupingItem.scss @@ -0,0 +1,57 @@ +@use 'src/styles/abstracts' as *; + +.GroupingItem { + display: flex; + flex-direction: column; + margin-right: 0.5em; + cursor: pointer; + &.isDisabled { + opacity: 0.5; + cursor: initial; + } + &:last-child { + margin-right: 0; + } + span { + margin-top: 0.4em; + text-align: center; + text-transform: capitalize; + } + &__icon__box { + width: 3.25em; + height: 3.25em; + border: $border-main; + border-radius: 0.375em; + display: flex; + align-items: center; + justify-content: center; + transition: all $popover-opening-duration ease-out; + + &:last-child { + margin-right: 0; + } + + i { + color: #1473e6; + font-size: 24px; + } + + &:hover { + background-color: $pico-5; + } + + &.active { + background-color: $primary-color-10; + } + &.outlined { + background-color: $primary-color-10; + border: $border-main-active; + } + } + &__button_small { + border: 1px solid; + padding: 0px 4px; + border-radius: 4px; + cursor: pointer; + } +} diff --git a/src/src/components/GroupingItem/GroupingItem.tsx b/src/src/components/GroupingItem/GroupingItem.tsx new file mode 100644 index 00000000..3a5b17b3 --- /dev/null +++ b/src/src/components/GroupingItem/GroupingItem.tsx @@ -0,0 +1,79 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import GroupingPopover from 'components/GroupingPopover/GroupingPopover'; +import { Icon } from 'components/kit'; +import { IconName } from 'components/kit/Icon'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IGroupingItemProps } from 'types/pages/components/GroupingItem/GroupingItem'; + +import './GroupingItem.scss'; + +const icons = { + stroke: 'line-style', + chart: 'chart-group', + row: 'image-group', + color: 'coloring', +}; + +function GroupingItem({ + title, + groupName, + groupingData, + inputLabel, + advancedComponent, + onSelect, + onGroupingModeChange, + groupingSelectOptions, + isDisabled, +}: IGroupingItemProps): React.FunctionComponentElement { + return ( + + ( + +
) => { + if (!isDisabled) { + onAnchorClick(e); + } + }} + className={classNames('GroupingItem', { + isDisabled: isDisabled, + })} + > +
+ +
+
+
+ )} + component={ + + } + /> +
+ ); +} + +export default GroupingItem; diff --git a/src/src/components/GroupingPopover/GroupingPopover.scss b/src/src/components/GroupingPopover/GroupingPopover.scss new file mode 100644 index 00000000..2f7e0c03 --- /dev/null +++ b/src/src/components/GroupingPopover/GroupingPopover.scss @@ -0,0 +1,94 @@ +@use 'src/styles/abstracts' as *; + +.GroupingPopover { + width: 25rem; + + h3 { + text-transform: uppercase; + } + + &__container__select { + padding: 1rem; + &__selectedFieldsContainer { + max-height: toRem(110px); + overflow: auto; + width: 100%; + } + } + + &__advanced__component { + border-top: $border-main; + } + &__toggleMode__div { + display: flex; + flex-direction: column; + border-top: $border-main; + border-bottom: $border-main; + padding: 1rem; + } + + &__subtitle { + margin-bottom: 0.75rem; + } + + &__accordion__container { + box-shadow: unset; + margin: 0 !important; + + .GroupingPopover__subtitle { + margin-bottom: unset; + } + + .MuiAccordionSummary-expandIcon { + padding: 0; + transform: unset; + margin: unset; + + &.Mui-expanded { + transform: unset; + } + } + + .Mui-expanded { + margin: 0; + } + } + + .MuiAccordionSummary-root { + min-height: unset; + height: 2.125rem; + border-bottom: $border-main; + padding: 0 1rem; + } + &__option { + display: flex; + width: 100%; + overflow: hidden; + &__label { + margin-left: $space-xs; + max-width: 100%; + overflow: hidden; + word-break: break-all; + } + } +} + +.AdvancedPopover__container { + width: 25rem; +} + +.AdvancedPopover__paletteColors__container { + display: flex; + border-radius: 4px; + width: 10.5rem; + border-top: $border-main; + height: 2rem; + margin-right: 0.5rem; + overflow: hidden; +} + +.AdvancedPopover__paletteColors__colorItem { + display: inline-block; + flex: 1; + height: 100%; +} diff --git a/src/src/components/GroupingPopover/GroupingPopover.tsx b/src/src/components/GroupingPopover/GroupingPopover.tsx new file mode 100644 index 00000000..b4ebf50b --- /dev/null +++ b/src/src/components/GroupingPopover/GroupingPopover.tsx @@ -0,0 +1,227 @@ +import React from 'react'; + +import { Checkbox, TextField } from '@material-ui/core'; +import { + CheckBox as CheckBoxIcon, + CheckBoxOutlineBlank, +} from '@material-ui/icons'; +import Autocomplete from '@material-ui/lab/Autocomplete'; + +import { Badge, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IGroupingPopoverProps } from 'types/components/GroupingPopover/GroupingPopover'; +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; + +import './GroupingPopover.scss'; + +function GroupingPopover({ + groupName, + advancedComponent, + groupingData, + groupingSelectOptions, + onSelect, + onGroupingModeChange, + inputLabel, +}: IGroupingPopoverProps): React.FunctionComponentElement { + const [inputValue, setInputValue] = React.useState(''); + + function onChange(e: any, values: IGroupingSelectOption[]): void { + if (e?.code !== 'Backspace') { + handleSelect(values); + } else { + if (inputValue.length === 0) { + handleSelect(values); + } + } + } + + function handleSelect(values: IGroupingSelectOption[]) { + onSelect({ + groupName, + list: values.map((item: IGroupingSelectOption) => + typeof item === 'string' ? item : item.value, + ), + }); + } + + const values: IGroupingSelectOption[] = React.useMemo(() => { + let data: { value: string; group: string; label: string }[] = []; + groupingSelectOptions.forEach((option) => { + if (groupingData?.[groupName].indexOf(option.value) !== -1) { + data.push(option); + } + }); + + // Sort selected values by the order of their application + return groupingData + ? data.sort( + (a, b) => + groupingData[groupName].indexOf(a.value) - + groupingData[groupName].indexOf(b.value), + ) + : data; + }, [groupName, groupingData, groupingSelectOptions]); + + //ToDo reverse mode + // function handleGroupingMode(val: string | number, id: any) { + // onGroupingModeChange({ + // groupName, + // value: val === 'Reverse', + // options: groupingData?.reverseMode[groupName as GroupNameEnum] + // ? groupingSelectOptions + // : null, + // }); + // } + + const options = React.useMemo(() => { + if (inputValue.trim() !== '') { + const filtered = groupingSelectOptions.filter((item) => { + return item.label.indexOf(inputValue) !== -1; + }); + + return filtered + .slice() + .sort( + (a, b) => a.label.indexOf(inputValue) - b.label.indexOf(inputValue), + ); + } + return groupingSelectOptions; + }, [groupingSelectOptions, inputValue]); + + return ( + +
+
+
+ + {inputLabel ?? `Select fields for grouping by ${groupName}`} + + option.group} + getOptionLabel={(option) => option.label} + getOptionSelected={(option, value) => + option.value === value.value + } + renderInput={(params: any) => ( + { + setInputValue(e.target?.value); + }, + }} + className='TextField__OutLined__Small' + variant='outlined' + placeholder='Select fields' + /> + )} + renderTags={(value, getTagProps) => ( +
+ {value.map((selected, i) => ( + + ))} +
+ )} + renderOption={(option, { selected }) => ( +
+ } + checkedIcon={} + style={{ marginRight: 4 }} + checked={selected} + /> + + {option.label} + +
+ )} + /> +
+ {/* //TODO: reverse mode +
+ + select grouping mode + + +
*/} + {advancedComponent && ( + +
+ {/* //ToDo reverse mode + + + } + id='panel1c-header' + > + + Advanced options + + + */} + {advancedComponent} + {/* + */} +
+
+ )} +
+
+
+ ); +} + +export default GroupingPopover; diff --git a/src/src/components/HeatMap/HeatMap.tsx b/src/src/components/HeatMap/HeatMap.tsx new file mode 100644 index 00000000..f238f679 --- /dev/null +++ b/src/src/components/HeatMap/HeatMap.tsx @@ -0,0 +1,235 @@ +import React from 'react'; +import moment from 'moment'; +import { useHistory } from 'react-router-dom'; + +import { Tooltip } from '@material-ui/core'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_QUERY_FORMAT } from 'config/dates/dates'; + +import * as analytics from 'services/analytics'; + +import { encode } from 'utils/encoder/encoder'; + +import './HeatMapStyle.scss'; + +const cellScales: number[] = [0, 1, 2, 3, 4]; +function HeatMap({ + data, + startDate, + endDate, + cellSize = 12, + cellSpacing = 4, + scaleRange = 4, + onCellClick, + additionalQuery = '', +}: any) { + const oneDay = 24 * 60 * 60 * 1000; + const weekDays = ['S', 'M', 'T', 'W', 'T', 'F', 'S']; + const months = [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec', + ]; + const history = useHistory(); + startDate = new Date( + startDate.getFullYear(), + startDate.getMonth(), + startDate.getDate(), + ); + endDate = new Date( + endDate.getFullYear(), + endDate.getMonth(), + endDate.getDate(), + ); + + let firstDay = startDate; + while (firstDay.getDay() !== 0) { + firstDay = shiftDate(firstDay, -1); + } + + let lastDay = endDate; + + while (lastDay.getDay() !== 0) { + lastDay = shiftDate(lastDay, 1); + } + + if (lastDay.getDay() === 0) { + lastDay = shiftDate(lastDay, 7); + } + + const diffDays = Math.floor(Math.abs((firstDay - lastDay) / oneDay)); + + const maxVal = getMaxVal(); + + // get max run count in data + function getMaxVal() { + let maxValue = 0; + [...Array(diffDays).keys()].forEach((index) => { + let count = getRunCountByDay(index); + maxValue = count > maxValue ? count : maxValue; + }); + return maxValue; + } + + // get runs count by day index + function getRunCountByDay(dayIndex: number): number { + const date = indexToDate(dayIndex); + let count = 0; + for (let s = 0; s < data.length; s++) { + if ( + data[s]?.[0].getFullYear() === date.getFullYear() && + data[s]?.[0].getMonth() === date.getMonth() && + data[s]?.[0].getDate() === date.getDate() + ) { + count += data[s][1]; + } + } + return count; + } + + const orderedMonths = [ + ...months.slice(firstDay.getMonth()), + ...months.slice(0, firstDay.getMonth()), + ]; + + const xAxisStyles = { + width: `${ + (diffDays / 7) * cellSize + (diffDays / 7 - 1) * cellSpacing - 50 + }px`, + }; + + const gridStyles = { + gridTemplateColumns: `repeat(${diffDays / 7}, 1fr)`, + gridTemplateRows: 'repeat(7, 1fr)', + width: `${(diffDays / 7) * cellSize + (diffDays / 7 - 1) * cellSpacing}px`, + height: `${7 * cellSize + 6 * cellSpacing}px`, + gridColumnGap: `${cellSpacing}px`, + gridRowGap: `${cellSpacing}px`, + }; + + function shiftDate(date: any, numDays: any) { + const newDate = new Date(date); + newDate.setDate(newDate.getDate() + numDays); + return newDate; + } + + function indexToDate(index: number) { + const x = Math.floor(index / 7); + const y = index % 7; + + return shiftDate(firstDay, x * 7 + y); + } + + function getScale(value: number) { + return Math.ceil((value / maxVal) * scaleRange); + } + function renderCell(index: number) { + const runsCount = getRunCountByDay(index); + const date = indexToDate(index); + const scale = runsCount ? getScale(runsCount) : 0; + const tooltip = ` ${runsCount} tracked run${ + runsCount !== 1 ? 's' : '' + } on ${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`; + + function onClickCell(e: React.MouseEvent) { + e.stopPropagation(); + onCellClick(); + if (scale) { + const startDate = date.getTime(); + + const search = encode({ + query: `datetime(${moment(startDate).format( + DATE_QUERY_FORMAT, + )}) <= run.created_at < datetime(${moment(startDate) + .add(1, 'day') + .format(DATE_QUERY_FORMAT)}) ${additionalQuery}`, + }); + analytics.trackEvent(ANALYTICS_EVENT_KEYS.dashboard.activityCellClick); + history.push(`/runs?select=${search}`); + } + } + + return ( + +
+ {+endDate < +indexToDate(index) ? ( +
+ ) : ( + +
+ + )} +
+ + ); + } + + return ( +
+
+
+
+ {orderedMonths.slice(0, 10).map((m, i) => ( +
+ {m} +
+ ))} +
+
+ {weekDays.map((d, i) => ( +
+ {d} +
+ ))} +
+
+ {[...Array(diffDays).keys()].map((index) => renderCell(index))} +
+
+
+ + Less + + {cellScales.map((scale) => ( +
+
+
+ ))} + + + More + +
+
+ ); +} + +export default HeatMap; diff --git a/src/src/components/HeatMap/HeatMapStyle.scss b/src/src/components/HeatMap/HeatMapStyle.scss new file mode 100644 index 00000000..5d506f7d --- /dev/null +++ b/src/src/components/HeatMap/HeatMapStyle.scss @@ -0,0 +1,103 @@ +@use 'src/styles/abstracts' as *; + +.CalendarHeatmap__map { + display: grid; + grid-template-columns: 1em 1fr; + grid-template-rows: 20px 1fr; +} + +.CalendarHeatmap__map__axis { + color: var(--grey-light); + + &.CalendarHeatmap__map__axis--x { + font-size: 12px; + font-weight: $font-500; + display: flex; + flex-direction: row; + justify-content: space-between; + } + + &.CalendarHeatmap__map__axis--y { + font-size: 9px; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: space-between; + position: sticky; + left: 0; + background-color: $white; + } +} + +.CalendarHeatmap__map__grid { + display: grid; + grid-auto-flow: column; + user-select: none; +} + +.CalendarHeatmap__cell__wrapper { + width: 100%; + height: 100%; + + .Tooltip__container { + width: 100%; + height: 100%; + } +} + +.CalendarHeatmap__cell { + width: 100%; + height: 100%; + box-sizing: border-box; + border-radius: 3px; + transition: box-shadow 50ms ease; + cursor: pointer; + + &.CalendarHeatmap__cell--dummy { + opacity: 0; + pointer-events: none; + user-select: none; + cursor: auto; + } + + &.CalendarHeatmap__cell--scale-0 { + background: $pico-10; + cursor: default; + } + + &.CalendarHeatmap__cell--scale-1 { + background: #abcaf6; + } + + &.CalendarHeatmap__cell--scale-2 { + background: #77a8ef; + } + + &.CalendarHeatmap__cell--scale-3 { + background: #3578e6; + } + + &.CalendarHeatmap__cell--scale-4 { + background: #225ae0; + } +} + +.CalendarHeatmap__cell__info { + margin-top: 1em; + display: flex; + align-items: center; + justify-content: flex-end; + .CalendarHeatmap__cell { + cursor: default; + &__wrapper { + margin-right: 0.25em; + } + } + span { + line-height: 12px; + margin-right: 0.75em; + &:last-child { + margin-left: 0.5em; + } + } +} diff --git a/src/src/components/HighPlot/HighPlot.scss b/src/src/components/HighPlot/HighPlot.scss new file mode 100644 index 00000000..e24907af --- /dev/null +++ b/src/src/components/HighPlot/HighPlot.scss @@ -0,0 +1,148 @@ +@use 'src/styles/abstracts' as *; + +.HighPlot__container { + background-color: white; + height: 100%; + width: 100%; + position: relative; + overflow: hidden; + user-select: none; + min-width: toRem(150px); + min-height: toRem(150px); + .Axes { + .tick text { + display: none; + } + .yAxisLabel { + text-align: right; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .xAxisLabel__container { + display: flex; + align-items: center; + justify-content: center; + + &.left { + justify-content: flex-start; + } + &.right { + justify-content: flex-end; + } + + .xAxisLabel { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: $text-sm; + } + + &::before { + content: ''; + display: inline-block; + flex-shrink: 0; + width: 6px; + height: 6px; + background-color: #2bc784; + border-radius: $border-radius-circle; + margin: 4px 5px 4px 0; + } + + &__metric { + &::before { + background-color: #1473e6; + } + } + } + .axisBrush { + .handle { + fill: $cuddle-110; + } + .selection { + fill: $pico-50; + stroke: none; + } + } + } + &.backgroundRect { + cursor: crosshair; + } + &.zoomMode rect { + cursor: zoom-in; + } + .HoverCircle { + cursor: pointer; + opacity: 1; + stroke-width: 3; + fill: white; + border-radius: 50%; + paint-order: stroke; + /* on click */ + &.focus { + stroke-width: 4; + clip-path: unset; + &__shadow { + stroke-width: 12; + } + } + /* on hover */ + &.active { + stroke-width: 5; + } + } + .Attributes { + &.highlight > .HoverCircle:not(.active):not(.focus) { + opacity: 0.5; + } + } + .ChartMouseValue { + position: absolute; + box-sizing: border-box; + padding: $space-xxs $space-xs; + background-color: $primary-bg; + border: 1px solid $primary-light; + color: $primary-dark; + font-size: 10px; + font-weight: $font-400; + white-space: nowrap; + } + .ChartMouseValueXAxis { + transform: translateX(-50%); + border-radius: 0 0 6px 6px; + border-top: none; + overflow: hidden; + } + .ChartMouseValueYAxis { + transform: translateY(-50%); + border-radius: 6px 0 0 6px; + border-right: none; + overflow: hidden; + box-shadow: inset -8px 0 5px -6px #3b5896; /* var(--primary);*/ + } + .Lines { + overflow: hidden; + @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { + &.optimizeRendering { + shape-rendering: optimizeSpeed; + } + } + &.highlight > .Line:not(.active):not(.highlighted) { + stroke-width: 1.5; + opacity: 0.2; + } + } + .Line { + stroke-width: 1.5; + opacity: 0.3; + &.active { + opacity: 1; + stroke-width: 3; + } + &.highlighted { + opacity: 1; + stroke-width: 2; + } + } +} diff --git a/src/src/components/HighPlot/HighPlot.tsx b/src/src/components/HighPlot/HighPlot.tsx new file mode 100644 index 00000000..7f5f5dd5 --- /dev/null +++ b/src/src/components/HighPlot/HighPlot.tsx @@ -0,0 +1,275 @@ +import React from 'react'; +import _ from 'lodash-es'; +import { useResizeObserver } from 'hooks'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { RENDER_LINES_OPTIMIZED_LIMIT } from 'config/charts'; + +import { IFocusedState } from 'types/services/models/metrics/metricsAppModel'; +import { IHighPlotProps } from 'types/components/HighPlot/HighPlot'; + +import { + clearArea, + drawParallelAxes, + drawParallelLines, + drawParallelHoverAttributes, + drawParallelAxesBrush, + drawParallelColorIndicator, + drawArea, +} from 'utils/d3'; + +import './HighPlot.scss'; + +const HighPlot = React.forwardRef(function HighPlot( + props: IHighPlotProps, + ref, +): React.FunctionComponentElement { + const { + index, + id = `${index}`, + nameKey = '', + curveInterpolation, + syncHoverState, + data, + isVisibleColorIndicator, + chartTitle, + onAxisBrushExtentChange, + brushExtents, + resizeMode, + onMount, + readOnly = false, + margin = { + top: 64, + right: 60, + bottom: 30, + left: 60, + }, + } = props; + + // boxes + const visBoxRef = React.useRef({ + margin, + height: 0, + width: 0, + }); + const plotBoxRef = React.useRef({ + height: 0, + width: 0, + }); + + // containers + const parentRef = React.useRef(null); + const visAreaRef = React.useRef(null); + + // d3 node elements + const svgNodeRef = React.useRef(null); + const bgRectNodeRef = React.useRef(null); + const plotNodeRef = React.useRef(null); + const axesNodeRef = React.useRef(null); + const linesNodeRef = React.useRef(null); + const attributesNodeRef = React.useRef(null); + const highlightedNodeRef = React.useRef(null); + + // methods and values refs + const attributesRef = React.useRef({}); + const axesRef = React.useRef({}); + const linesRef = React.useRef({}); + const brushRef = React.useRef({}); + const rafIDRef = React.useRef(); + + const updateDeps = [ + data, + curveInterpolation, + index, + isVisibleColorIndicator, + readOnly, + resizeMode, + id, + ]; + + function draw() { + drawArea({ + index, + id, + nameKey, + visBoxRef, + plotBoxRef, + parentRef, + visAreaRef, + svgNodeRef, + bgRectNodeRef, + plotNodeRef, + axesNodeRef, + linesNodeRef, + attributesNodeRef, + chartTitle, + }); + + if (isVisibleColorIndicator) { + drawParallelColorIndicator({ index, plotBoxRef, plotNodeRef }); + } + + drawParallelAxes({ + axesNodeRef, + visBoxRef, + attributesRef, + axesRef, + dimensions: data.dimensions, + plotBoxRef, + }); + + if (attributesRef?.current.xScale && attributesRef.current.yScale) { + drawParallelLines({ + index, + nameKey, + linesNodeRef, + attributesRef, + attributesNodeRef, + curveInterpolation, + isVisibleColorIndicator, + linesRef, + dimensions: data.dimensions, + data: data.data, + }); + + linesRef.current.data = data.data; + + // render lines with low quality if lines count are more than 'RENDER_LINES_OPTIMIZED_LIMIT' + if (!readOnly && linesNodeRef.current) { + const linesCount = linesNodeRef.current.selectChildren().size(); + if (linesCount > RENDER_LINES_OPTIMIZED_LIMIT) { + linesNodeRef.current.classed('optimizeRendering', true); + } + } + + if (!readOnly) { + drawParallelHoverAttributes({ + dimensions: data.dimensions, + index, + id, + nameKey, + visAreaRef, + linesRef, + attributesRef, + visBoxRef, + bgRectNodeRef, + attributesNodeRef, + linesNodeRef, + highlightedNodeRef, + isVisibleColorIndicator, + axesNodeRef, + syncHoverState, + svgNodeRef, + }); + } + drawParallelAxesBrush({ + plotBoxRef, + plotNodeRef, + brushRef, + linesRef, + visBoxRef, + attributesRef, + brushExtents, + onAxisBrushExtentChange, + dimensions: data.dimensions, + data: data.data, + index, + }); + } + } + + function renderChart() { + clearArea({ visAreaRef }); + draw(); + } + + const resizeObserverCallback: ResizeObserverCallback = React.useCallback( + (entries: ResizeObserverEntry[]) => { + if (entries?.length) { + rafIDRef.current = window.requestAnimationFrame(renderChart); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + updateDeps, + ); + + const observerReturnCallback = React.useCallback(() => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }, []); + + useResizeObserver(resizeObserverCallback, parentRef, observerReturnCallback); + + React.useEffect(() => { + rafIDRef.current = window.requestAnimationFrame(renderChart); + return () => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, updateDeps); + + React.useEffect(() => { + if (typeof onMount === 'function') { + onMount(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useImperativeHandle(ref, () => ({ + clearHoverAttributes: () => { + attributesRef.current.clearHoverAttributes?.(); + }, + setFocusedState: (focusedState: IFocusedState) => { + const prevFocusState = { ...attributesRef.current.focusedState }; + attributesRef.current.focusedState = { + ...focusedState, + visId: focusedState.visId ?? `${focusedState.chartIndex}`, + }; + + if ( + !_.isEmpty(brushExtents) && + !_.isNil(focusedState?.yValue) && + (focusedState?.active !== prevFocusState?.active || + (focusedState?.active && + prevFocusState?.active && + (prevFocusState.yValue !== focusedState.yValue || + prevFocusState.xValue !== focusedState.xValue))) + ) { + brushRef?.current?.updateLinesAndHoverAttributes?.({ + mouse: [ + brushRef.current.xScale(focusedState?.xValue), + (brushRef.current.yScale[focusedState?.xValue ?? 0]?.( + focusedState?.yValue, + ) ?? 0) + visBoxRef.current.margin.top, + ], + focusedState, + }); + } + }, + setActiveLineAndCircle: ( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => { + attributesRef.current.setActiveLineAndCircle?.( + lineKey, + focusedStateActive, + force, + ); + }, + })); + + return ( + +
+
+
+ + ); +}); + +export default React.memo(HighPlot); diff --git a/src/src/components/HighlightModesPopover/HighlightModePopover.scss b/src/src/components/HighlightModesPopover/HighlightModePopover.scss new file mode 100644 index 00000000..e036f9e2 --- /dev/null +++ b/src/src/components/HighlightModesPopover/HighlightModePopover.scss @@ -0,0 +1,5 @@ +@use 'src/styles/abstracts' as *; +.HighlightModePopover { + padding: $space-xs; + width: 16.5rem; +} diff --git a/src/src/components/HighlightModesPopover/HighlightModesPopover.tsx b/src/src/components/HighlightModesPopover/HighlightModesPopover.tsx new file mode 100644 index 00000000..d79c5c3b --- /dev/null +++ b/src/src/components/HighlightModesPopover/HighlightModesPopover.tsx @@ -0,0 +1,53 @@ +import React from 'react'; + +import { MenuItem } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IHighlightModesPopoverProps } from 'types/components/HighlightModesPopover/HighlightModesPopover'; + +import { HighlightEnum } from 'utils/d3'; + +import './HighlightModePopover.scss'; + +function HighlightModesPopover({ + mode, + onChange, +}: IHighlightModesPopoverProps): React.FunctionComponentElement { + function handleClick(e: React.ChangeEvent): void { + const value = e.target?.getAttribute('data-name'); + if (value && mode !== parseInt(value) && typeof onChange === 'function') { + onChange(parseInt(value)); + } + } + + return ( + +
+ + Highlight Off + + + Highlight Metric on Hover + + + Highlight Run On Hover + +
+
+ ); +} + +export default React.memo(HighlightModesPopover); diff --git a/src/src/components/Illustration/Illustration.d.ts b/src/src/components/Illustration/Illustration.d.ts new file mode 100644 index 00000000..c9a9faa4 --- /dev/null +++ b/src/src/components/Illustration/Illustration.d.ts @@ -0,0 +1,16 @@ +import * as React from 'react'; + +import { PipelineStatusEnum } from 'modules/core/engine/types'; + +export interface IIllustrationProps { + content?: string | React.ReactNode; + image?: React.FunctionComponentElement | HTMLImageElement; + type?: IllustrationType; + className?: string; + size?: IllustrationSizeType; + showImage?: boolean; +} + +export type IllustrationSizeType = 'small' | 'medium' | 'large' | 'xLarge'; + +export type IllustrationType = string | PipelineStatusEnum; diff --git a/src/src/components/Illustration/Illustration.scss b/src/src/components/Illustration/Illustration.scss new file mode 100644 index 00000000..55942c24 --- /dev/null +++ b/src/src/components/Illustration/Illustration.scss @@ -0,0 +1,65 @@ +@use 'src/styles/abstracts' as *; + +.Illustration { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + overflow: auto; + flex-direction: column; + &__hidden { + display: none; + } + &__container { + height: fit-content; + overflow: hidden; + padding-bottom: 7 * $space-unit; + &__content { + text-align: center; + .qlAnchor { + color: $primary-color; + text-decoration: none; + margin: 0 $space-xxxs; + &:hover { + text-decoration: underline; + } + } + } + &__img { + text-align: center; + & > img, & > svg { + margin: 0 auto; + display: block; + } + &__small { + padding: $space-xs; + & > img, & > svg { + width: 3rem; + height: auto; + } + } + &__medium { + padding: $space-sm; + & > img, & > svg { + width: 7.5rem; + height: auto; + } + } + &__large { + padding: $space-sm; + & > img, & > svg { + width: 14.5rem; + height: auto; + } + } + &__xLarge { + padding: $space-unit; + & > img, & > svg { + width: 19.5rem; + height: auto; + } + } + } + } +} diff --git a/src/src/components/Illustration/Illustration.tsx b/src/src/components/Illustration/Illustration.tsx new file mode 100644 index 00000000..2471f1f3 --- /dev/null +++ b/src/src/components/Illustration/Illustration.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Text } from 'components/kit'; +import { ITextProps } from 'components/kit/Text'; + +import { + IIllustrationProps, + ILLUSTRATION_TYPES, + ILLUSTRATION_LIST, + getDefaultIllustrationContent, + IllustrationSizeType, +} from '.'; + +import './Illustration.scss'; + +const CONTENT_PROPS: Record = { + small: { + size: 12, + }, + medium: { + size: 14, + }, + large: { + size: 16, + }, + xLarge: { + size: 18, + }, +}; + +function Illustration({ + type = ILLUSTRATION_TYPES.Never_Executed, + content = getDefaultIllustrationContent(type), + image, + className = '', + size = 'xLarge', + showImage = true, +}: IIllustrationProps): React.FunctionComponentElement { + return ( +
+
+ {showImage ? ( +
+ {image || ILLUSTRATION_LIST[type]} +
+ ) : null} + + {content} + +
+
+ ); +} + +export default React.memo(Illustration); diff --git a/src/src/components/Illustration/config.tsx b/src/src/components/Illustration/config.tsx new file mode 100644 index 00000000..dbda5bd6 --- /dev/null +++ b/src/src/components/Illustration/config.tsx @@ -0,0 +1,65 @@ +import * as React from 'react'; + +import { ReactComponent as EmptyBookmarks } from 'assets/illustrations/emptyBookmarks.svg'; +import { ReactComponent as EmptySearch } from 'assets/illustrations/emptySearch.svg'; +import { ReactComponent as ExploreData } from 'assets/illustrations/exploreData.svg'; +import { ReactComponent as WrongSearch } from 'assets/illustrations/wrongSearch.svg'; + +import { DOCUMENTATIONS } from 'config/references'; + +import { PipelineStatusEnum } from 'modules/core/engine/types'; + +import { IllustrationType } from '.'; + +const ILLUSTRATION_TYPES: Record = { + Never_Executed: PipelineStatusEnum.Never_Executed, + Insufficient_Resources: PipelineStatusEnum.Insufficient_Resources, + Empty: PipelineStatusEnum.Empty, + Failed: PipelineStatusEnum.Failed, + Empty_Bookmarks: 'emptyBookmarks', +}; + +const ILLUSTRATION_LIST: Record = { + [ILLUSTRATION_TYPES.Never_Executed]: , + [ILLUSTRATION_TYPES.Insufficient_Resources]: , + [ILLUSTRATION_TYPES.Empty]: , + [ILLUSTRATION_TYPES.Failed]: , + [ILLUSTRATION_TYPES.Empty_Bookmarks]: , +}; + +function getDefaultIllustrationContent( + type: IllustrationType = ILLUSTRATION_TYPES.Never_Executed, +): React.ReactNode { + const Never_Executed = ( + <> + It’s super easy to search Aim experiments. Just start typing your query in + the search bar above. +
+ Look up + + search docs + + to learn more. + + ); + const Failed = 'Incorrect Query'; + const Insufficient_Resources = "You don't have any tracked data"; + const Empty = 'No Results'; + const Empty_Bookmarks = "You don't have any saved bookmark"; + + const CONTENT = { + [ILLUSTRATION_TYPES.Never_Executed]: Never_Executed, + [ILLUSTRATION_TYPES.Failed]: Failed, + [ILLUSTRATION_TYPES.Insufficient_Resources]: Insufficient_Resources, + [ILLUSTRATION_TYPES.Empty]: Empty, + [ILLUSTRATION_TYPES.Empty_Bookmarks]: Empty_Bookmarks, + }; + return CONTENT[type] || null; +} + +export { ILLUSTRATION_TYPES, ILLUSTRATION_LIST, getDefaultIllustrationContent }; diff --git a/src/src/components/Illustration/index.ts b/src/src/components/Illustration/index.ts new file mode 100644 index 00000000..5ce4f37c --- /dev/null +++ b/src/src/components/Illustration/index.ts @@ -0,0 +1,6 @@ +import Illustration from './Illustration'; + +export * from './Illustration.d'; +export * from './config'; + +export default Illustration; diff --git a/src/src/components/IllustrationBlock/IllustrationBlock.scss b/src/src/components/IllustrationBlock/IllustrationBlock.scss new file mode 100644 index 00000000..c51c982e --- /dev/null +++ b/src/src/components/IllustrationBlock/IllustrationBlock.scss @@ -0,0 +1,105 @@ +@use 'src/styles/abstracts' as *; + +.IllustrationBlock { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + overflow: auto; + flex-direction: column; + + &__container { + height: fit-content; + overflow: hidden; + padding-bottom: 6 * $space-unit; + } + &__title { + font-size: $text-xl; + text-align: center; + .qlAnchor { + color: $primary-color; + text-decoration: none; + margin: 0 $space-xxxs; + &:hover { + text-decoration: underline; + } + } + } + &__hidden { + display: none; + } + &__content { + font-size: $text-xl; + text-align: center; + } + &__small { + &__title { + font-weight: $font-500; + font-size: $text-md; + } + &__content { + font-weight: $font-500; + font-size: $text-md; + } + &__img { + padding: $space-xs; + img { + width: toRem(50px); + height: toRem(57px); + margin: 0 auto; + display: block; + } + } + } + &__medium { + &__title { + font-weight: $font-500; + font-size: $text-md; + } + &__content { + font-weight: $font-500; + font-size: $text-md; + } + &__img { + padding: $space-sm; + img { + width: toRem(120px); + margin: 0 auto; + display: block; + } + } + } + &__large { + &__title { + font-weight: $font-500; + font-size: $text-lg; + } + &__content { + font-weight: $font-500; + font-size: $text-lg; + } + &__img { + padding: $space-sm; + img { + width: 14.5rem; + margin: 0 auto; + display: block; + } + } + } + &__xLarge { + &__title { + font-weight: $font-500; + margin-bottom: 1rem; + } + &__img { + padding: $space-unit; + img { + width: 19.5rem; + margin: 0 auto; + display: block; + } + } + } +} diff --git a/src/src/components/IllustrationBlock/IllustrationBlock.tsx b/src/src/components/IllustrationBlock/IllustrationBlock.tsx new file mode 100644 index 00000000..fe10847e --- /dev/null +++ b/src/src/components/IllustrationBlock/IllustrationBlock.tsx @@ -0,0 +1,74 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Text } from 'components/kit'; + +import { + IllustrationsEnum, + Illustration_Title_Config, + Illustration_Content_Config, + Illustrations_List, +} from 'config/illustrationConfig/illustrationConfig'; + +import { IIllustrationBlockProps } from 'types/components/IllustrationBlock/IllustrationBlock'; + +import './IllustrationBlock.scss'; + +function IllustrationBlock({ + title, + content, + image, + page = 'metrics', + type = IllustrationsEnum.ExploreData, + className = '', + size = 'small', + showImage = true, +}: IIllustrationBlockProps): React.FunctionComponentElement { + const [imgLoaded, setImgLoaded] = React.useState(false); + + function onImgLoad() { + setImgLoaded(true); + } + + return ( +
+
+ {showImage ? ( +
+ {image || ( + Illustration + )} +
+ ) : null} + + + {title || Illustration_Title_Config[page][type]} + +
+ + {content ? ( + + {content} + + ) : ( + Illustration_Content_Config[page][type] + )} +
+ ); +} + +export default React.memo(IllustrationBlock); diff --git a/src/src/components/ImageFullViewPopover/ImageFullViewPopover.tsx b/src/src/components/ImageFullViewPopover/ImageFullViewPopover.tsx new file mode 100644 index 00000000..cbdb4b90 --- /dev/null +++ b/src/src/components/ImageFullViewPopover/ImageFullViewPopover.tsx @@ -0,0 +1,72 @@ +import React from 'react'; + +import PopoverContent from 'components/ChartPanel/PopoverContent/PopoverContent'; +import { Button, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import blobsURIModel from 'services/models/media/blobsURIModel'; + +import { ChartTypeEnum } from 'utils/d3'; + +import { IImageFullViewPopoverProps } from './types.d'; + +import './styles.scss'; + +function ImageFullViewPopover({ + imageRendering, + imageData, + tooltipContent, + handleClose, + selectOptions, + onRunsTagsChange, +}: IImageFullViewPopoverProps): React.FunctionComponentElement { + const blobData = blobsURIModel.getState()[imageData?.blob_uri]; + + return ( + +
+
+
+ {imageData.caption} +
+
+
+
+ +
+
+ + + +
+
+
+
+ ); +} + +ImageFullViewPopover.displayName = 'ImageFullViewPopover'; + +export default React.memo(ImageFullViewPopover); diff --git a/src/src/components/ImageFullViewPopover/index.ts b/src/src/components/ImageFullViewPopover/index.ts new file mode 100644 index 00000000..7e045a2e --- /dev/null +++ b/src/src/components/ImageFullViewPopover/index.ts @@ -0,0 +1,6 @@ +import ImageFullViewPopover from './ImageFullViewPopover'; + +export * from './types.d'; +export * from './ImageFullViewPopover'; + +export default ImageFullViewPopover; diff --git a/src/src/components/ImageFullViewPopover/styles.scss b/src/src/components/ImageFullViewPopover/styles.scss new file mode 100644 index 00000000..ed0a8d03 --- /dev/null +++ b/src/src/components/ImageFullViewPopover/styles.scss @@ -0,0 +1,64 @@ +@use 'src/styles/abstracts' as *; + +.ImageFullViewPopover { + display: flex; + justify-content: flex-start; + align-items: flex-start; + height: 100%; + width: 100%; + &__imageContainer { + max-width: calc(100% - 20rem); + flex: 1; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + background: $cuddle-10; + &--pixelated { + image-rendering: pixelated; + } + &--smooth { + image-rendering: auto; + } + &__imageBox { + overflow: auto; + max-width: 100%; + max-height: 100%; + } + } + &__detailContainer { + height: 100%; + min-width: 20rem; + max-height: inherit; + position: relative; + width: 20rem; + box-shadow: 0 toRem(4px) toRem(6px) rgba(144, 175, 218, 0.2); + height: 100%; + &__content { + height: calc(100% - 2rem); + max-height: calc(100% - 2rem); + .PopoverContent { + box-shadow: unset; + + &__container { + box-shadow: unset; + max-height: 100%; + overflow-y: scroll; + } + &__imageSetBox { + padding-top: 0; + } + } + } + &__closeButtonContainer { + color: #414b6d; + padding: 0.25rem 0.3125rem 0.25rem 1.125rem; + display: flex; + justify-content: flex-end; + align-items: center; + .Icon__container { + font-size: 0.625rem; + } + } + } +} diff --git a/src/src/components/ImageFullViewPopover/types.d.ts b/src/src/components/ImageFullViewPopover/types.d.ts new file mode 100644 index 00000000..405eacd4 --- /dev/null +++ b/src/src/components/ImageFullViewPopover/types.d.ts @@ -0,0 +1,11 @@ +import { IImageData } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; + +export interface IImageFullViewPopoverProps { + imageData: IImageData; + tooltipContent: ITooltipContent; + handleClose: () => void; + selectOptions: IGroupingSelectOption[]; + imageRendering: string; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; +} diff --git a/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.d.ts b/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.d.ts new file mode 100644 index 00000000..3e220829 --- /dev/null +++ b/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.d.ts @@ -0,0 +1,8 @@ +import { IControlProps } from 'types/pages/imagesExplore/components/Controls/Controls'; + +export interface IImagePropertiesPopoverProps { + additionalProperties: IControlProps['additionalProperties']; + onImageSizeChange: IControlProps['onImageSizeChange']; + onImageRenderingChange: IControlProps['onImageRenderingChange']; + onImageAlignmentChange: IControlProps['onImageAlignmentChange']; +} diff --git a/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.scss b/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.scss new file mode 100644 index 00000000..cd7d9f79 --- /dev/null +++ b/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.scss @@ -0,0 +1,55 @@ +@use 'src/styles/abstracts' as *; + +.ImagePropertiesPopover { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + width: 25rem; + padding: $space-xs; + max-height: 20rem; + &__section { + width: 100%; + display: flex; + flex-direction: column; + padding: 0 $space-xs; + &__mediaItemSize { + display: flex; + align-items: center; + margin-top: $space-xs; + margin-bottom: $space-xxxs; + } + } + &__sizeSlider { + margin-top: $space-unit; + display: flex; + flex-direction: column; + &--disabled { + opacity: 0.2; + pointer-events: none; + } + } + &__subtitle { + text-transform: uppercase; + &__imageRendering { + margin: $space-xs 0; + } + } + &__Radio { + padding-left: 0; + } + &__Slider { + margin: $space-xs 0; + display: flex; + .Slider { + margin: 0 $space-md; + } + } + &__Divider { + width: 100%; + margin: $space-xs 0; + } + &__sizePercent { + margin-left: $space-xs; + } +} diff --git a/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.tsx b/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.tsx new file mode 100644 index 00000000..9773637d --- /dev/null +++ b/src/src/components/ImagePropertiesPopover/ImagePropertiesPopover.tsx @@ -0,0 +1,134 @@ +import React from 'react'; + +import { Divider } from '@material-ui/core'; + +import { Dropdown, Slider, Text, ToggleButton } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { + MediaItemAlignmentEnum, + ImageRenderingEnum, +} from 'config/enums/imageEnums'; +import { + IMAGES_SLIDER_PROPS, + IMAGE_ALIGNMENT_OPTIONS, +} from 'config/mediaConfigs/mediaConfigs'; + +import { IImagePropertiesPopoverProps } from './ImagePropertiesPopover.d'; + +import './ImagePropertiesPopover.scss'; + +function ImagePropertiesPopover({ + additionalProperties, + onImageSizeChange, + onImageRenderingChange, + onImageAlignmentChange, +}: IImagePropertiesPopoverProps): React.FunctionComponentElement { + const [open, setOpen] = React.useState(false); + const [sizeValue, setSizeValue] = React.useState( + additionalProperties.mediaItemSize, + ); + + function onSizeValueChange( + event: React.ChangeEvent<{}>, + newValue: number | number[], + ): void & React.FormEventHandler { + onImageSizeChange(newValue as number); + setSizeValue(newValue as number); + } + + const isOriginalAlignment: boolean = React.useMemo((): boolean => { + return ( + additionalProperties.alignmentType === MediaItemAlignmentEnum.Original + ); + }, [additionalProperties.alignmentType]); + + return ( + +
+
+
+ + Align Images by: + +
+
+ setOpen(true)} + onMenuClose={() => setOpen(false)} + open={open} + withPortal + /> +
+
+
+ + Scale (Relative to window size): + + + {`${sizeValue}%`} + +
+
+ {IMAGES_SLIDER_PROPS.min}% + `${val}`} + value={sizeValue} + disabled={isOriginalAlignment} + onChange={onSizeValueChange as any} + step={IMAGES_SLIDER_PROPS.step} + max={IMAGES_SLIDER_PROPS.max} + min={IMAGES_SLIDER_PROPS.min} + /> + {IMAGES_SLIDER_PROPS.max}% +
+
+
+ +
+ + Image Rendering + + +
+
+
+ ); +} + +ImagePropertiesPopover.displayName = 'ImagePropertiesPopover'; + +export default React.memo(ImagePropertiesPopover); diff --git a/src/src/components/ImagePropertiesPopover/index.ts b/src/src/components/ImagePropertiesPopover/index.ts new file mode 100644 index 00000000..287e0d93 --- /dev/null +++ b/src/src/components/ImagePropertiesPopover/index.ts @@ -0,0 +1,5 @@ +import ImagePropertiesPopover from './ImagePropertiesPopover'; + +export * from './ImagePropertiesPopover'; + +export default ImagePropertiesPopover; diff --git a/src/src/components/LineChart/LineChart.scss b/src/src/components/LineChart/LineChart.scss new file mode 100644 index 00000000..0f8a6054 --- /dev/null +++ b/src/src/components/LineChart/LineChart.scss @@ -0,0 +1,160 @@ +@use 'src/styles/abstracts' as *; + +.LineChart { + background-color: white; + height: 100%; + width: 100%; + position: relative; + overflow: hidden; + user-select: none; + min-width: toRem(150px); + min-height: toRem(150px); + .unableToDrawText { + font-size: $text-md; + text-align: center; + fill: $grey; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 80%; + } + &.backgroundRect { + cursor: crosshair; + } + &.zoomMode rect { + cursor: zoom-in; + } + .HoverCircle { + cursor: pointer; + opacity: 1; + stroke-width: 2.4; + fill: white; + border-radius: 50%; + paint-order: stroke; + /* on click */ + &.focus { + stroke-width: 4; + clip-path: unset; + &__shadow { + stroke-width: 12; + } + } + /* on hover */ + &.active { + stroke-width: 5; + } + } + .Attributes { + &.highlight { + .HoverCircle:not(.active):not(.focus) { + opacity: 0.5; + } + .inProgressLineIndicator:not(.active):not(.focus) { + opacity: 0.8; + } + } + + } + .ChartMouseValue { + position: absolute; + box-sizing: border-box; + padding: $space-xxs $space-xs; + background-color: $primary-bg; + border: 1px solid $primary-light; + color: $primary-dark; + font-size: 10px; + font-weight: $font-400; + white-space: nowrap; + } + .ChartMouseValueXAxis { + transform: translateX(-50%); + border-radius: 0 0 6px 6px; + border-top: none; + overflow: hidden; + } + .ChartMouseValueYAxis { + transform: translateY(-50%); + border-radius: 6px 0 0 6px; + border-right: none; + overflow: hidden; + box-shadow: inset -8px 0 5px -6px #3b5896; /* var(--primary);*/ + } + .Lines { + overflow: hidden; + @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { + &.optimizeRendering { + shape-rendering: optimizeSpeed; + } + } + &.highlight { + .AggrLine { + opacity: 0.2; + &.highlighted { + opacity: 1; + } + } + .AggrArea { + &.highlighted { + opacity: 1; + } + } + & > .Line:not(.active):not(.highlighted):not(.aggregated) { + stroke-width: 1.5; + opacity: 0.2; + } + & > .AggrArea:not(.highlighted) { + opacity: 0.2; + } + } + } + .Line { + stroke-width: 1.5; + opacity: 1; + &.active { + opacity: 1; + stroke-width: 3; + } + &.highlighted { + opacity: 1; + stroke-width: 2.8; + } + &.aggregated { + opacity: 0; + stroke-width: 0.4; + &.active { + opacity: 0.8; + stroke-width: 3; + } + &.highlighted { + opacity: 0.5; + stroke-width: 2.8; + } + } + } + .AggrLine { + opacity: 1; + stroke-width: 2.2; + } + + .inProgressLineIndicator { + animation: inProgressIndicator 0.5s cubic-bezier(0.6, -0.03, 0.22, 0.76) + infinite; + opacity: 1; + paint-order: stroke; + cursor: pointer; + filter: drop-shadow(0 0 0.5px #ffffff) drop-shadow(0 0 0.5px #ffffff) drop-shadow(0 0 0.5px #ffffff); + } + + @keyframes inProgressIndicator { + 0% { + stroke-width: 3; + } + 50% { + stroke-width: 5; + } + 100% { + stroke-width: 3; + } + } +} diff --git a/src/src/components/LineChart/LineChart.tsx b/src/src/components/LineChart/LineChart.tsx new file mode 100644 index 00000000..cea56f62 --- /dev/null +++ b/src/src/components/LineChart/LineChart.tsx @@ -0,0 +1,330 @@ +import * as React from 'react'; +import classNames from 'classnames'; +import { useResizeObserver } from 'hooks'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { RENDER_LINES_OPTIMIZED_LIMIT } from 'config/charts'; + +import { + IAttributesRef, + ILineChartProps, + ILineChartRef, +} from 'types/components/LineChart/LineChart'; +import { IFocusedState } from 'types/services/models/metrics/metricsAppModel'; + +import { + drawArea, + clearArea, + drawAxes, + drawLines, + processLineChartData, + drawBrush, + drawHoverAttributes, + drawUnableToRender, + CurveEnum, + HighlightEnum, + ScaleEnum, +} from 'utils/d3'; + +import './LineChart.scss'; + +const LineChart = React.forwardRef(function LineChart( + props: ILineChartProps, + ref: React.ForwardedRef, +): React.FunctionComponentElement { + const { + data, + index, + id = `${index}`, + nameKey = '', + aggregatedData, + aggregationConfig, + syncHoverState, + axesScaleRange, + ignoreOutliers = false, + alignmentConfig, + highlightMode = HighlightEnum.Off, + curveInterpolation = CurveEnum.Linear, + chartTitle, + zoom, + onZoomChange, + resizeMode, + onMount, + axesScaleType = { + xAxis: ScaleEnum.Linear, + yAxis: ScaleEnum.Linear, + }, + readOnly = false, + margin = { + top: 30, + right: 20, + bottom: 30, + left: 60, + }, + } = props; + + // boxes + const visBoxRef = React.useRef({ + margin, + height: 0, + width: 0, + }); + const plotBoxRef = React.useRef({ + height: 0, + width: 0, + }); + + // containers + const parentRef = React.useRef(null); + const visAreaRef = React.useRef(null); + + // d3 node elements + const svgNodeRef = React.useRef(null); + const bgRectNodeRef = React.useRef(null); + const plotNodeRef = React.useRef(null); + const axesNodeRef = React.useRef(null); + const linesNodeRef = React.useRef(null); + const attributesNodeRef = React.useRef(null); + const xAxisLabelNodeRef = React.useRef(null); + const yAxisLabelNodeRef = React.useRef(null); + const highlightedNodeRef = React.useRef(null); + + // methods and values refs + const axesRef = React.useRef({}); + const linesRef = React.useRef({}); + const attributesRef = React.useRef({}); + const humanizerConfigRef = React.useRef({}); + const rafIDRef = React.useRef(); + + const unableToDrawConditions: { condition: boolean; text?: string }[] = []; + const updateDeps = [ + data, + zoom, + ignoreOutliers, + highlightMode, + axesScaleType, + axesScaleRange, + curveInterpolation, + aggregationConfig, + readOnly, + alignmentConfig, + resizeMode, + id, + ]; + + function draw() { + drawArea({ + index, + id, + nameKey, + visBoxRef, + plotBoxRef, + parentRef, + visAreaRef, + svgNodeRef, + bgRectNodeRef, + plotNodeRef, + axesNodeRef, + linesNodeRef, + attributesNodeRef, + chartTitle, + }); + + const { processedData, processedAggrData, min, max } = processLineChartData( + { + data, + ignoreOutliers, + visBoxRef, + axesScaleType, + axesScaleRange, + aggregatedData, + aggregationConfig, + unableToDrawConditions, + attributesRef, + }, + ); + + drawAxes({ + svgNodeRef, + axesNodeRef, + axesRef, + plotBoxRef, + xScale: attributesRef.current.xScale, + yScale: attributesRef.current.yScale, + visBoxRef, + alignmentConfig, + axesScaleType, + humanizerConfigRef, + drawBgTickLines: { y: true, x: false }, + }); + + drawLines({ + id, + processedData, + nameKey, + linesNodeRef, + linesRef, + curveInterpolation, + xScale: attributesRef.current.xScale, + yScale: attributesRef.current.yScale, + highlightMode, + aggregationConfig, + processedAggrData, + readOnly, + }); + + /** + * render lines with low quality if lines count are more than 'RENDER_LINES_OPTIMIZED_LIMIT' + */ + if (!readOnly && linesNodeRef.current) { + const linesCount = linesNodeRef.current.selectChildren().size(); + if (linesCount > RENDER_LINES_OPTIMIZED_LIMIT) { + linesNodeRef.current.classed('optimizeRendering', true); + } + } + + drawBrush({ + id, + plotBoxRef, + plotNodeRef, + visBoxRef, + axesRef, + attributesRef, + linesRef, + svgNodeRef, + axesScaleType, + min, + max, + axesScaleRange, + zoom, + onZoomChange, + readOnly, + unableToDrawConditions, + }); + + if (!readOnly) { + drawHoverAttributes({ + index, + id, + nameKey, + data, + processedData, + axesScaleType, + highlightMode, + syncHoverState, + visAreaRef, + attributesRef, + plotBoxRef, + visBoxRef, + svgNodeRef, + bgRectNodeRef, + attributesNodeRef, + xAxisLabelNodeRef, + yAxisLabelNodeRef, + linesNodeRef, + highlightedNodeRef, + aggregationConfig, + alignmentConfig, + }); + } + + drawUnableToRender({ + renderArr: unableToDrawConditions, + visAreaRef, + attributesRef, + readOnly, + syncHoverState, + }); + } + + function renderChart() { + clearArea({ visAreaRef }); + draw(); + } + + const resizeObserverCallback: ResizeObserverCallback = React.useCallback( + (entries: ResizeObserverEntry[]) => { + if (entries?.length) { + rafIDRef.current = window.requestAnimationFrame(renderChart); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + updateDeps, + ); + + const observerReturnCallback = React.useCallback(() => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }, []); + + useResizeObserver(resizeObserverCallback, parentRef, observerReturnCallback); + + React.useEffect(() => { + attributesRef.current.currentXValue = undefined; + }, [alignmentConfig, data]); + + React.useEffect(() => { + rafIDRef.current = window.requestAnimationFrame(renderChart); + return () => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, updateDeps); + + React.useEffect(() => { + if (typeof onMount === 'function') { + onMount(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useImperativeHandle(ref, () => ({ + setActiveLineAndCircle: ( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => { + attributesRef.current.setActiveLineAndCircle?.( + lineKey, + focusedStateActive, + force, + ); + }, + updateHoverAttributes: (xValue: number, dataSelector?: string) => { + attributesRef.current.updateHoverAttributes?.(xValue, dataSelector); + }, + clearHoverAttributes: () => { + attributesRef.current.clearHoverAttributes?.(); + }, + setFocusedState: (focusedState: IFocusedState) => { + if (focusedState) { + attributesRef.current.focusedState = { + ...focusedState, + visId: focusedState.visId ?? `${focusedState.chartIndex}`, + }; + } + }, + })); + + return ( + +
+
+
+ + ); +}); + +LineChart.displayName = 'LineChart'; + +export default React.memo(LineChart); diff --git a/src/src/components/LiveUpdateSettings/LiveUpdateSettings.scss b/src/src/components/LiveUpdateSettings/LiveUpdateSettings.scss new file mode 100644 index 00000000..8bb255ef --- /dev/null +++ b/src/src/components/LiveUpdateSettings/LiveUpdateSettings.scss @@ -0,0 +1,10 @@ +@use 'src/styles/abstracts' as *; + +.LiveUpdateSettings { + margin-right: 1.5rem; + display: flex; + align-items: flex-end; + &__Text { + margin-right: 0.625em; + } +} diff --git a/src/src/components/LiveUpdateSettings/LiveUpdateSettings.tsx b/src/src/components/LiveUpdateSettings/LiveUpdateSettings.tsx new file mode 100644 index 00000000..fb9591ca --- /dev/null +++ b/src/src/components/LiveUpdateSettings/LiveUpdateSettings.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +import { Switcher, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import './LiveUpdateSettings.scss'; + +export interface ILiveUpdateSettingsProp { + delay: number; + enabled: boolean; + onLiveUpdateConfigChange: ({ enabled }: { enabled: boolean }) => void; +} + +function LiveUpdateSettings( + props: ILiveUpdateSettingsProp, +): React.FunctionComponentElement { + return ( + +
+ + Live Update: + + { + props.onLiveUpdateConfigChange({ enabled: !props.enabled }); + }} + size='small' + color='primary' + /> +
+
+ ); +} + +export default React.memo(LiveUpdateSettings); diff --git a/src/src/components/MediaList/ImageBox.tsx b/src/src/components/MediaList/ImageBox.tsx new file mode 100644 index 00000000..88e35689 --- /dev/null +++ b/src/src/components/MediaList/ImageBox.tsx @@ -0,0 +1,183 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Skeleton } from '@material-ui/lab'; +import { Dialog } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; +import ImageFullViewPopover from 'components/ImageFullViewPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { BATCH_COLLECT_DELAY } from 'config/mediaConfigs/mediaConfigs'; +import { MediaItemAlignmentEnum } from 'config/enums/imageEnums'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import blobsURIModel from 'services/models/media/blobsURIModel'; +import * as analytics from 'services/analytics'; + +import { IImageBoxProps } from './MediaList.d'; + +const ImageBox = ({ + index, + style, + data, + addUriToList, + mediaItemHeight, + focusedState, + tooltip, + additionalProperties, + selectOptions, + onRunsTagsChange, +}: IImageBoxProps): React.FunctionComponentElement => { + const { format, blob_uri } = data; + const [isImageFullViewPopupOpened, setIsImageFullViewPopupOpened] = + React.useState(false); + let [blobData, setBlobData] = React.useState( + blobsURIModel.getState()[blob_uri] ?? null, + ); + + React.useEffect(() => { + let timeoutID: number; + let subscription: any; + + if (blobData === null) { + if (blobsURIModel.getState()[blob_uri]) { + setBlobData(blobsURIModel.getState()[blob_uri]); + } else { + subscription = blobsURIModel.subscribe(blob_uri, (data) => { + setBlobData(data[blob_uri]); + subscription.unsubscribe(); + }); + timeoutID = window.setTimeout(() => { + if (blobsURIModel.getState()[blob_uri]) { + setBlobData(blobsURIModel.getState()[blob_uri]); + subscription.unsubscribe(); + } else { + addUriToList(blob_uri); + } + }, BATCH_COLLECT_DELAY); + } + } + + return () => { + if (timeoutID) { + clearTimeout(timeoutID); + } + if (subscription) { + subscription.unsubscribe(); + } + }; + }, [addUriToList, blobData, blob_uri]); + + function onImageFullSizeModeButtonClick(e: React.ChangeEvent): void { + e.stopPropagation(); + setIsImageFullViewPopupOpened(true); + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.images.imagesPanel.openFullSizeMode, + ); + } + + const skeletonSize = { + width: style.width - 6, // 6px -> 0.375rem gap + height: + additionalProperties.alignmentType !== MediaItemAlignmentEnum.Height + ? style.width / (data.width / data.height) - 6 // 6px -> 0.375rem gap + : mediaItemHeight - 40, + containerWidth: style.width - 4, + containerHeight: + additionalProperties.alignmentType !== MediaItemAlignmentEnum.Height + ? style.width / (data.width / data.height) - 4 + : mediaItemHeight - 40, + }; + + return ( + +
+
+
+
+ {blobData ? ( + {data.caption} + ) : ( +
+ +
+ )} + + {data.caption} + +
+ +
+
+ + setIsImageFullViewPopupOpened(false)} + aria-labelledby='customized-dialog-title' + className='MediaPanel__Container__imageFullViewPopup' + open={isImageFullViewPopupOpened} + > + setIsImageFullViewPopupOpened(false)} + onRunsTagsChange={onRunsTagsChange} + /> + + +
+
+ ); +}; + +export default ImageBox; diff --git a/src/src/components/MediaList/MediaList.d.ts b/src/src/components/MediaList/MediaList.d.ts new file mode 100644 index 00000000..e3ee9b36 --- /dev/null +++ b/src/src/components/MediaList/MediaList.d.ts @@ -0,0 +1,38 @@ +import { IMediaPanelProps } from 'components/MediaPanel'; +import { MediaTypeEnum } from 'components/MediaPanel/config'; + +import { + IGroupingSelectOption, + IImageData, +} from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { + IFocusedState, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; + +export interface IMediaListProps { + data: IImageData[]; + addUriToList: (blobUrl: string) => void; + wrapperOffsetWidth: number; + wrapperOffsetHeight: number; + mediaItemHeight: number; + focusedState: IFocusedState; + additionalProperties?: IMediaPanelProps['additionalProperties']; + tooltip?: ITooltip; + mediaType: MediaTypeEnum; + selectOptions: IGroupingSelectOption[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; +} + +export interface IImageBoxProps { + data: IImageData; + addUriToList: (blobUrl: string) => void; + index: number; + mediaItemHeight: number; + focusedState: IFocusedState; + tooltip?: ITooltip; + additionalProperties?: IMediaPanelProps['additionalProperties']; + style: { [key: string]: any }; + selectOptions: IGroupingSelectOption[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; +} diff --git a/src/src/components/MediaList/MediaList.scss b/src/src/components/MediaList/MediaList.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/src/components/MediaList/MediaList.tsx b/src/src/components/MediaList/MediaList.tsx new file mode 100644 index 00000000..f47c55b5 --- /dev/null +++ b/src/src/components/MediaList/MediaList.tsx @@ -0,0 +1,132 @@ +import React from 'react'; +import { areEqual, VariableSizeList as List } from 'react-window'; + +import { MediaTypeEnum } from 'components/MediaPanel/config'; +import AudioBox from 'components/kit/AudioBox'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { + MEDIA_ITEMS_SIZES, + MEDIA_LIST_HEIGHT, +} from 'config/mediaConfigs/mediaConfigs'; + +import getBiggestImageFromList from 'utils/getBiggestImageFromList'; + +import ImageBox from './ImageBox'; +import { IMediaListProps } from './MediaList.d'; + +const mediaBoxType: any = { + [MediaTypeEnum.IMAGE]: ImageBox, + [MediaTypeEnum.AUDIO]: AudioBox, +}; + +function MediaList({ + data, + wrapperOffsetWidth, + addUriToList, + mediaItemHeight, + focusedState, + additionalProperties, + tooltip, + mediaType, + wrapperOffsetHeight, + selectOptions, + onRunsTagsChange, +}: IMediaListProps): React.FunctionComponentElement { + const itemSize = React.useCallback( + (index: number) => { + if (mediaType === MediaTypeEnum.AUDIO) { + return MEDIA_ITEMS_SIZES[mediaType]().width; + } else { + return MEDIA_ITEMS_SIZES[mediaType]({ + data, + index, + additionalProperties, + wrapperOffsetWidth, + wrapperOffsetHeight, + }).width; + } + }, + [ + additionalProperties, + data, + mediaType, + wrapperOffsetHeight, + wrapperOffsetWidth, + ], + ); + + const listHeight = React.useMemo(() => { + const { maxWidth, maxHeight } = getBiggestImageFromList(data); + const { alignmentType, mediaItemSize } = additionalProperties; + if (mediaType === MediaTypeEnum.IMAGE) { + return MEDIA_LIST_HEIGHT[mediaType]({ + alignmentType, + maxHeight, + maxWidth, + wrapperOffsetWidth, + mediaItemSize, + mediaItemHeight, + }); + } else { + return MEDIA_LIST_HEIGHT[mediaType](mediaItemHeight); + } + }, [ + additionalProperties, + data, + mediaItemHeight, + mediaType, + wrapperOffsetWidth, + ]); + + return ( + + + {MediaBoxMemoized} + + + ); +} + +export default MediaList; + +const MediaBoxMemoized = React.memo(function MediaBoxMemoized(props: any) { + const { index, style, data } = props; + const Component = mediaBoxType[data.mediaType]; + + return ( + + + + ); +}, areEqual); diff --git a/src/src/components/MediaList/index.ts b/src/src/components/MediaList/index.ts new file mode 100644 index 00000000..adb05413 --- /dev/null +++ b/src/src/components/MediaList/index.ts @@ -0,0 +1,4 @@ +import MediaList from './MediaList'; + +export * from './MediaList'; +export default MediaList; diff --git a/src/src/components/MediaPanel/MediaPanel.d.ts b/src/src/components/MediaPanel/MediaPanel.d.ts new file mode 100644 index 00000000..253113ce --- /dev/null +++ b/src/src/components/MediaPanel/MediaPanel.d.ts @@ -0,0 +1,45 @@ +import React from 'react'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { + IFocusedState, + IGroupingSelectOption, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; +import { IImagesExploreAppConfig } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { IIllustrationConfig } from 'types/components/Table/Table'; + +import { ChartTypeEnum } from 'utils/d3'; +import { SortFields } from 'utils/getSortedFields'; + +import { MediaTypeEnum } from './config'; + +export interface IMediaPanelProps { + data: { [key: string]: any }; + orderedMap: { [key: string]: any }; + isLoading: boolean; + panelResizing: boolean; + wrapperOffsetHeight: number; + wrapperOffsetWidth: number; + controls?: React.ReactNode; + resizeMode?: ResizeModeEnum; + tooltip?: ITooltip; + focusedState: IFocusedState; + selectOptions?: IGroupingSelectOption[]; + additionalProperties?: + | IImagesExploreAppConfig['images']['additionalProperties'] + | any; + tableHeight: string; + mediaType: MediaTypeEnum; + actionPanel?: React.ReactNode; + actionPanelSize?: number; + tooltipType?: ChartTypeEnum; + onActivePointChange?: (activePoint: any, focusedStateActive: boolean) => void; + getBlobsData: (uris: string[]) => Promise; + sortFieldsDict?: { [key: string]: SortField }; + sortFields?: SortFields; + illustrationConfig?: IIllustrationConfig; + onRunsTagsChange?: (runHash: string, tags: ITagInfo[]) => void; + onChangeTooltip?: (tooltip: ITooltip) => void; +} diff --git a/src/src/components/MediaPanel/MediaPanel.scss b/src/src/components/MediaPanel/MediaPanel.scss new file mode 100644 index 00000000..e1323bd9 --- /dev/null +++ b/src/src/components/MediaPanel/MediaPanel.scss @@ -0,0 +1,51 @@ +@use 'src/styles/abstracts' as *; + +.MediaPanel__Container { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + overflow: hidden; + &__imageFullViewPopup { + .MuiDialog-paperWidthSm { + max-width: unset; + width: 100%; + height: 100%; + } + } + &__resizing { + display: flex; + width: 100%; + height: 100%; + flex-direction: column; + align-items: center; + justify-content: center; + background-color: $primary-color-5; + user-select: none; + } + + .MediaPanel { + display: flex; + flex: 1; + height: calc(100% - 3rem); + &__loader { + .ChartLoader { + span { + margin-left: 0; + } + } + } + &__mediaSetContainer { + overflow-x: auto; + padding-left: 1.25rem; + padding-top: 0.25rem; + flex: 1; + } + &__controls { + border-left: 0.0625rem solid #dceafb; + width: 3.75rem; + max-height: 100%; + overflow-y: auto; + } + } +} diff --git a/src/src/components/MediaPanel/MediaPanel.tsx b/src/src/components/MediaPanel/MediaPanel.tsx new file mode 100644 index 00000000..2b270d7e --- /dev/null +++ b/src/src/components/MediaPanel/MediaPanel.tsx @@ -0,0 +1,360 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import MediaSet from 'components/MediaSet/MediaSet'; +import BusyLoaderWrapper from 'components/BusyLoaderWrapper/BusyLoaderWrapper'; +import ChartLoader from 'components/ChartLoader/ChartLoader'; +import { Text } from 'components/kit'; +import ChartPopover from 'components/ChartPanel/ChartPopover/ChartPopover'; +import { throttle } from 'components/Table/utils'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import IllustrationBlock from 'components/IllustrationBlock/IllustrationBlock'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { BATCH_SEND_DELAY } from 'config/mediaConfigs/mediaConfigs'; +import { IllustrationsEnum } from 'config/illustrationConfig/illustrationConfig'; + +import blobsURIModel from 'services/models/media/blobsURIModel'; + +import { IMediaPanelProps } from './MediaPanel.d'; + +import './MediaPanel.scss'; + +function MediaPanel({ + data, + isLoading, + panelResizing, + wrapperOffsetHeight, + wrapperOffsetWidth, + orderedMap, + resizeMode, + tooltip, + focusedState, + additionalProperties, + tableHeight, + mediaType, + controls, + actionPanel, + actionPanelSize, + tooltipType, + onActivePointChange, + getBlobsData, + sortFieldsDict, + sortFields, + illustrationConfig, + onChangeTooltip = () => {}, + selectOptions = [], + onRunsTagsChange = () => {}, +}: IMediaPanelProps): React.FunctionComponentElement { + const [activePointRect, setActivePointRect] = React.useState<{ + top: number; + bottom: number; + left: number; + right: number; + } | null>(null); + const [encodedDataKey, setEncodedDataKey] = React.useState(''); + const [encodedSortFieldsDictKey, setEncodedSortFieldsDictKey] = + React.useState(''); + let processedBlobUriArray = React.useRef([]); + let blobUriArray = React.useRef([]); + let timeoutID = React.useRef(0); + const containerRef = React.useRef(null); + const activePointRef = React.useRef(null); + const requestRef = React.useRef(); + const scrollTopOffset = React.useRef(0); + const rafMouseOverId = React.useRef(0); + + const setActiveElemPos = React.useCallback(() => { + if (activePointRef.current && containerRef.current) { + const { pointRect } = activePointRef.current; + setActivePointRect({ + bottom: pointRect.bottom, + right: pointRect.right, + top: pointRect.top, + left: pointRect.left, + }); + } else { + setActivePointRect(null); + } + }, [setActivePointRect]); + + const syncHoverState = React.useCallback( + (args: { + activePoint: object | null; + focusedStateActive?: boolean; + }): void => { + const { activePoint, focusedStateActive = false } = args; + activePointRef.current = activePoint; + // on MouseEnter + if (activePoint !== null) { + if (onActivePointChange) { + onActivePointChange(activePoint, focusedStateActive); + } + setActiveElemPos(); + } + // on MouseLeave + else { + setActivePointRect(null); + // TODO remove after implementing active focusedState logic + if (onActivePointChange) { + onActivePointChange({ key: null }, focusedStateActive); + } + } + }, + [onActivePointChange, setActivePointRect, setActiveElemPos], + ); + + const closePopover = React.useCallback((): void => { + if (focusedState?.key || activePointRect) { + if (rafMouseOverId.current) { + window.cancelAnimationFrame(rafMouseOverId.current); + } + syncHoverState({ activePoint: null }); + } + }, [focusedState?.key, activePointRect, syncHoverState]); + + const onMouseOver = React.useCallback( + (e: React.MouseEvent): void => { + if (e) { + e.stopPropagation(); + if (e.target) { + rafMouseOverId.current = window.requestAnimationFrame(() => { + const targetElem = e.target as Element; + const closestNode = targetElem.closest( + '[data-mediasetitem="mediaSetItem"]', + ); + if (closestNode) { + const key = closestNode.getAttribute('data-key'); + const seqKey = closestNode.getAttribute('data-seqkey'); + const pointRect = closestNode.getBoundingClientRect(); + if ( + pointRect && + (focusedState.key !== key || activePointRect === null) && + !focusedState?.active + ) { + syncHoverState({ + activePoint: { pointRect, key, seqKey }, + }); + } + } else { + closePopover(); + } + }); + } + } + }, + [ + focusedState?.key, + focusedState?.active, + activePointRect, + syncHoverState, + closePopover, + ], + ); + + function omitRunPropertyFromData(data: any) { + if (_.isArray(data)) { + return data.map((item: any) => _.omit(item, 'run')); + } else { + return Object.keys(data ?? []).reduce((acc: any, key: any) => { + acc[key] = omitRunPropertyFromData(data[key]); + return acc; + }, {}); + } + } + + React.useEffect(() => { + const resultEncodedDataKey = JSON.stringify(omitRunPropertyFromData(data)); + if (encodedDataKey !== resultEncodedDataKey) { + setEncodedDataKey(resultEncodedDataKey); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data]); + + React.useEffect(() => { + const resultEncodedSortFieldsDictKey = JSON.stringify(sortFieldsDict); + if (encodedSortFieldsDictKey !== resultEncodedSortFieldsDictKey) { + setEncodedSortFieldsDictKey(resultEncodedSortFieldsDictKey); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [sortFieldsDict]); + + const mediaSetKey = React.useMemo( + () => { + return Date.now(); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [ + encodedDataKey, + wrapperOffsetHeight, + wrapperOffsetWidth, + additionalProperties, + encodedSortFieldsDictKey, + ], + ); + + function addUriToList(blobUrl: string) { + if (blobsURIModel.getState()[blobUrl]) { + return; + } + if (blobUriArray.current.includes(blobUrl)) { + return; + } + if (processedBlobUriArray.current.includes(blobUrl)) { + return; + } + + blobUriArray.current.push(blobUrl); + getBatch(); + } + + const getBatch = throttle(() => { + if (timeoutID.current) { + window.clearTimeout(timeoutID.current); + } + timeoutID.current = window.setTimeout(() => { + if (!_.isEmpty(blobUriArray.current)) { + const processingBlobUriArray = Object.assign([], blobUriArray.current); + blobUriArray.current = []; + processedBlobUriArray.current = [ + ...new Set([ + ...processedBlobUriArray.current, + ...processingBlobUriArray, + ]), + ]; + requestRef.current = getBlobsData(processingBlobUriArray); + requestRef.current.call().catch((err: any) => { + processedBlobUriArray.current = processedBlobUriArray.current.filter( + (uri: string) => !processingBlobUriArray.includes(uri), + ); + }); + } + }, BATCH_SEND_DELAY); + }, BATCH_SEND_DELAY); + + function onListScroll({ scrollOffset }: { scrollOffset: number }): void { + if (Math.abs(scrollOffset - scrollTopOffset.current) > window.innerHeight) { + if (requestRef.current) { + requestRef.current.abort(); + } + } + scrollTopOffset.current = scrollOffset; + closePopover(); + } + + React.useEffect(() => { + document.addEventListener('mouseover', closePopover); + return () => { + document.removeEventListener('mouseover', closePopover); + }; + }, [closePopover]); + + React.useEffect(() => { + return () => { + if (timeoutID.current) { + window.clearTimeout(timeoutID.current); + } + if (requestRef.current) { + requestRef.current.abort(); + } + blobsURIModel.init(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + + } + > + {panelResizing ? ( +
+ + Release to resize + +
+ ) : ( + <> +
+ {!_.isEmpty(data) ? ( +
+
+ + + +
+ {tooltipType && ( + + + + )} + {controls && ( + +
+ {controls} +
+
+ )} +
+ ) : ( + + )} + {actionPanel} +
+ + )} +
+
+ ); +} + +export default React.memo(MediaPanel); diff --git a/src/src/components/MediaPanel/config.ts b/src/src/components/MediaPanel/config.ts new file mode 100644 index 00000000..a61eeb62 --- /dev/null +++ b/src/src/components/MediaPanel/config.ts @@ -0,0 +1,6 @@ +enum MediaTypeEnum { + IMAGE = 'image', + AUDIO = 'audio', +} + +export { MediaTypeEnum }; diff --git a/src/src/components/MediaPanel/index.ts b/src/src/components/MediaPanel/index.ts new file mode 100644 index 00000000..fecaa725 --- /dev/null +++ b/src/src/components/MediaPanel/index.ts @@ -0,0 +1,4 @@ +import MediaPanel from './MediaPanel'; + +export * from './MediaPanel.d'; +export default MediaPanel; diff --git a/src/src/components/MediaSet/MediaSet.d.ts b/src/src/components/MediaSet/MediaSet.d.ts new file mode 100644 index 00000000..f19246ec --- /dev/null +++ b/src/src/components/MediaSet/MediaSet.d.ts @@ -0,0 +1,30 @@ +import { IMediaPanelProps } from 'components/MediaPanel'; +import { MediaTypeEnum } from 'components/MediaPanel/config'; + +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { + IFocusedState, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; + +import { SortFields } from 'utils/getSortedFields'; + +export interface IMediaSetProps { + data: { [key: string]: any }; + orderedMap: { [key: string]: any }; + onListScroll: ({ scrollOffset: number }) => void; + addUriToList: (blobUrl: string) => void; + index?: number; + mediaSetKey: number; + wrapperOffsetHeight: number; + wrapperOffsetWidth: number; + focusedState: IFocusedState; + additionalProperties?: IMediaPanelProps['additionalProperties']; + tableHeight: IMediaPanelProps['tableHeight']; + tooltip?: ITooltip; + mediaType: MediaTypeEnum; + sortFieldsDict?: { [key: string]: SortField }; + sortFields?: SortFields; + selectOptions: IGroupingSelectOption[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; +} diff --git a/src/src/components/MediaSet/MediaSet.scss b/src/src/components/MediaSet/MediaSet.scss new file mode 100644 index 00000000..90364919 --- /dev/null +++ b/src/src/components/MediaSet/MediaSet.scss @@ -0,0 +1,152 @@ +@use 'src/styles/abstracts' as *; + +.MediaSet { + width: 100%; + background-color: #ffffff; + &__connectorLine { + position: absolute; + top: -0.375rem; + height: 100%; + width: 1px; + background: $cuddle-70; + } + &__container { + display: flex; + flex-direction: column; + &.withDash { + position: relative; + &::before { + content: ''; + position: absolute; + top: 0.375rem; + left: -0.625rem; + width: 0.375rem; + height: 0.0625rem; + background: $cuddle-70; + } + } + &__path { + display: inline-flex; + &__title { + padding-bottom: $space-xxxxs; + font-size: $text-sm; + position: relative; + display: inline-flex; + align-items: center; + &__pointer { + cursor: pointer; + } + &__key, + &__value { + &.stacked { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: inline-block; + } + } + &__key { + margin-right: $space-xxxs; + &.stacked { + max-width: toRem(137px); + } + } + &__value { + margin-left: $space-xxxs; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + &.stacked { + max-width: toRem(227px); + } + } + } + } + &__mediaItemsList { + padding-bottom: $space-xxxs; + padding-top: $space-xxs; + display: flex; + } + } +} + +.ImageBox { + height: 100%; + position: absolute; + &__imageWrapper { + height: 100%; + width: 100%; + position: relative; + &-item { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + width: calc(100% - 0.25rem); + & > span { + height: 1rem; + margin-top: $space-xxxxs; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; + } + & > img { + margin-top: toRem(5px); + padding: toRem(1px); + width: 100%; + height: 100%; + } + &-heightAlign { + img { + height: calc(100% - 0.375rem); + } + } + } + &__zoomIconWrapper { + position: absolute; + top: toRem(14px); + right: toRem(16px); + color: $white; + display: flex; + align-items: center; + justify-content: center; + background: $primary-color-10; + color: $primary-color; + &:hover { + background: $primary-color-20; + color: $primary-color; + } + &.isHidden { + display: none; + } + } + } + .skeletonContainer { + margin-top: toRem(5px); + display: flex; + justify-content: center; + align-items: center; + padding: toRem(1px); + } + .focus img { + box-shadow: 0 0 0 toRem(1.5px) $primary-color, + inset 0 0 0px toRem(0.5px) $primary-color; + } + .active { + & img, + & .skeletonContainer { + box-shadow: 0 0 0 toRem(1.5px) #b9d5f8, inset 0 0 0px toRem(0.5px) #b9d5f8; + } + } + &__image { + &--pixelated { + image-rendering: pixelated; + } + &--smooth { + image-rendering: auto; + } + } +} diff --git a/src/src/components/MediaSet/MediaSet.tsx b/src/src/components/MediaSet/MediaSet.tsx new file mode 100644 index 00000000..9d45abe7 --- /dev/null +++ b/src/src/components/MediaSet/MediaSet.tsx @@ -0,0 +1,437 @@ +import React from 'react'; +import _ from 'lodash-es'; +import { VariableSizeList as List, areEqual } from 'react-window'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import MediaList from 'components/MediaList'; +import { JsonViewPopover } from 'components/kit'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import { MediaTypeEnum } from 'components/MediaPanel/config'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import DepthDropdown from 'components/DepthDropdown/DepthDropdown'; +import DepthSlider from 'components/DepthSlider/DepthSlider'; + +import { + MEDIA_ITEMS_SIZES, + MEDIA_SET_SIZE, + MEDIA_SET_SLIDER_HEIGHT, + MEDIA_SET_TITLE_HEIGHT, + MEDIA_SET_WRAPPER_PADDING_HEIGHT, +} from 'config/mediaConfigs/mediaConfigs'; + +import { formatValue } from 'utils/formatValue'; +import { jsonParse } from 'utils/jsonParse'; +import { SortField } from 'utils/getSortedFields'; +import getBiggestImageFromList from 'utils/getBiggestImageFromList'; + +import { IMediaSetProps } from './MediaSet.d'; + +import './MediaSet.scss'; + +const MediaSet = ({ + data, + onListScroll, + addUriToList, + index = 0, + mediaSetKey, + wrapperOffsetHeight, + wrapperOffsetWidth, + orderedMap, + focusedState, + additionalProperties, + tableHeight, + tooltip, + mediaType, + sortFieldsDict, + sortFields, + selectOptions, + onRunsTagsChange, +}: IMediaSetProps): React.FunctionComponentElement => { + const [depthMap, setDepthMap] = React.useState([]); + let content: [(string | {})[], [] | [][]][] = []; // the actual items list to be passed to virtualized list component + let keysMap: { [key: string]: number } = {}; // cache for checking whether the group title is already added to list + + fillContent(data, [''], orderedMap); + + function setStackedList(list: [], stackedList: [][]): void { + for (let j = 0; j < list.length; j++) { + if (!stackedList[j]) { + stackedList[j] = []; + } + stackedList[j].push(list[j]); + } + } + + function setStackedContent(list: [], path: (string | {})[]): void { + const [lastContentPath, lastContentList] = content[content.length - 1]; + const [orderedMapKey, value] = (path[path.length - 1] as string).split( + ' = ', + ); + if (path.length === lastContentPath.length) { + (lastContentPath[lastContentPath.length - 1] as any)[orderedMapKey].push( + value, + ); + setStackedList(list, lastContentList); + } else { + let stackedList: [][] = []; + setStackedList(list, stackedList); + path[path.length - 1] = { [orderedMapKey]: [value] }; + content.push([path, stackedList]); + } + } + + function getOrderedContentList(list: []): [] { + const listKeys: string[] = []; + const listOrderTypes: any[] = []; + sortFields?.forEach((sortField: SortField) => { + listKeys.push(sortField.value); + listOrderTypes.push(sortField.order); + }); + return _.orderBy(list, listKeys, listOrderTypes) as []; + } + + function fillContent( + list: [] | { [key: string]: [] | {} }, + path: (string | {})[] = [''], + orderedMap: { [key: string]: any }, + ) { + if (Array.isArray(list)) { + const orderedContentList = getOrderedContentList(list); + if (additionalProperties.stacking && content.length) { + setStackedContent(orderedContentList, path); + } else { + content.push([path, orderedContentList]); + } + } else { + const fieldSortedValues = _.orderBy( + [...(orderedMap?.ordering || [])].reduce((acc: any, value: any) => { + acc.push({ [orderedMap.key]: value }); + return acc; + }, []), + [orderedMap?.key || ''], + [sortFieldsDict?.[orderedMap?.orderKey]?.order || 'asc'], + ).map((value: any) => value[orderedMap?.key]); + fieldSortedValues.forEach((val: any) => { + const fieldName = `${orderedMap.key} = ${formatValue(val)}`; + if (!keysMap.hasOwnProperty(path.join(''))) { + content.push([path, []]); + keysMap[path.join('')] = 1; + } + fillContent( + list[fieldName], + path.concat([fieldName]), + orderedMap[fieldName], + ); + }); + } + } + + function getItemSize(index: number): number { + let [path, items] = content[index]; + const { maxHeight, maxWidth } = getBiggestImageFromList(items.flat()); + const { mediaItemSize, alignmentType, stacking } = additionalProperties; + const lastPath = path[path.length - 1]; + const isStackedPath = stacking && typeof lastPath === 'object'; + const { pathValue } = getPathDetails({ + isStackedPath, + lastPath, + }); + if (path.length === 1) { + return 0; + } + if (items.length > 0) { + if (mediaType === MediaTypeEnum.IMAGE) { + return MEDIA_SET_SIZE[mediaType]({ + maxHeight, + maxWidth, + mediaItemHeight, + alignmentType, + wrapperOffsetWidth, + mediaItemSize, + stacking: isStackedPath && pathValue.length > 1, + }); + } + if (mediaType === MediaTypeEnum.AUDIO) { + return MEDIA_SET_SIZE[mediaType](); + } + } + return MEDIA_SET_TITLE_HEIGHT + MEDIA_SET_WRAPPER_PADDING_HEIGHT; + } + + const onDepthChange = React.useCallback( + (value: number, index: number): void => { + if (value !== depthMap[index]) { + let tmpDepthMap = [...depthMap]; + tmpDepthMap[index] = value; + setDepthMap(tmpDepthMap); + } + }, + [depthMap, setDepthMap], + ); + + const mediaItemHeight = React.useMemo(() => { + if (mediaType === MediaTypeEnum.AUDIO) { + return MEDIA_ITEMS_SIZES[mediaType]()?.height; + } else { + return MEDIA_ITEMS_SIZES[mediaType]({ + data, + additionalProperties, + wrapperOffsetWidth, + wrapperOffsetHeight, + })?.height; + } + }, [ + additionalProperties, + data, + mediaType, + wrapperOffsetHeight, + wrapperOffsetWidth, + ]); + + React.useEffect(() => { + if (additionalProperties.stacking && content.length) { + setDepthMap(Array(content.length).fill(0)); + } + }, [additionalProperties.stacking, data, content.length]); + + return ( + + + {MediaGroupedList} + + + ); +}; + +function propsComparator( + prevProps: IMediaSetProps, + nextProps: IMediaSetProps, +): boolean { + if ( + prevProps.mediaSetKey !== nextProps.mediaSetKey || + prevProps.focusedState !== nextProps.focusedState || + prevProps.sortFieldsDict !== nextProps.sortFieldsDict + ) { + return false; + } + return true; +} + +export default React.memo(MediaSet, propsComparator); + +const MediaGroupedList = React.memo(function MediaGroupedList({ + index, + style, + data, +}: { + index: number; + style: React.CSSProperties; + data: { [key: string]: any }; +}) { + const [path, items] = data.data[index]; + const lastPath = path[path.length - 1]; + const depth = data.depthMap[index] || 0; + const isStackedPath = + data.additionalProperties.stacking && typeof lastPath === 'object'; + const { pathKey, pathValue } = getPathDetails({ + isStackedPath, + lastPath, + }); + const { currentValue, currentItems } = getCurrentContent({ + isStackedPath, + pathValue, + depth, + items, + }); + const json: string | object = jsonParse(currentValue); + const isJson: boolean = typeof json === 'object'; + const renderStacking = + currentItems.length > 0 && isStackedPath && pathValue.length > 1; + return ( + +
+ {path.slice(2).map((key: string, i: number) => ( + +
+ + ))} +
2 ? 'withDash' : ''}`} + > + {path.length > 1 && ( + + ( + + + + + {pathKey} + + = + + {currentValue} + + + + {renderStacking && ( + + )} + + )} + component={} + /> + + )} + {renderStacking && ( + + )} + {currentItems.length > 0 && ( +
+ +
+ )} +
+
+
+ ); +}, +areEqual); + +function getPathDetails({ + isStackedPath, + lastPath, +}: { + isStackedPath: boolean; + lastPath: any; +}) { + let pathKey = ''; + let pathValue: string | string[] = ''; + if (isStackedPath) { + pathKey = Object.keys(lastPath)[0]; + pathValue = lastPath[pathKey]; + } else { + [pathKey = '', pathValue = ''] = lastPath?.split(' = '); + } + return { pathKey, pathValue }; +} + +function getCurrentContent({ + isStackedPath, + pathValue, + depth, + items, +}: { + isStackedPath: boolean; + pathValue: string | string[]; + depth: number; + items: [] | [][]; +}) { + let currentValue = ''; + let currentItems: [] = []; + + if (isStackedPath) { + currentValue = (pathValue[depth] as string)?.trim(); + for (let item of items) { + if (item[depth]) { + currentItems.push(item[depth]); + } + } + } else { + currentValue = (pathValue as string)?.trim(); + currentItems = items as []; + } + return { currentValue, currentItems }; +} diff --git a/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.d.ts b/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.d.ts new file mode 100644 index 00000000..d1a45e03 --- /dev/null +++ b/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.d.ts @@ -0,0 +1,6 @@ +export interface INameAndDescriptionCardProps { + title?: string; + defaultName?: string; + defaultDescription: string; + onSave: (name: string, description: string) => void; +} diff --git a/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.scss b/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.scss new file mode 100644 index 00000000..1390aca2 --- /dev/null +++ b/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.scss @@ -0,0 +1,106 @@ +@use 'src/styles/abstracts' as *; + +.NameAndDescriptionCard { + width: 100%; + padding: $space-lg; + background-color: #ffffff; + border: $border-grey; + margin-bottom: $space-unit; + border-radius: $border-radius-lg; + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: column; + &__header { + width: 100%; + display: flex; + justify-content: space-between; + margin-bottom: $space-xs; + } + &__content { + display: flex; + flex-direction: column; + width: 100%; + &__nameBox { + margin-bottom: $space-unit * 2; + &__nameInput { + width: 40%; + .MuiFormHelperText-root { + position: absolute; + bottom: -1.5rem; + } + } + .MuiInputLabel-outlined { + transform: translate(14px, 10px) scale(1); + font-size: $text-md; + &.MuiInputLabel-shrink { + font-size: $text-xs; + color: $pico-50; + font-weight: $font-500; + } + } + } + &__descriptionBox { + width: 100%; + &__descriptionInput { + height: 5.25rem; + width: 100%; + .MuiOutlinedInput-root.Mui-error .MuiOutlinedInput-notchedOutline { + border-color: #f44336 !important; + } + .MuiOutlinedInput-multiline { + padding: $space-xs $space-unit; + overflow: hidden; + height: 5.25rem; + + .MuiOutlinedInput-inputMultiline { + height: 100% !important; + overflow-y: scroll !important; + } + } + + .MuiInputLabel-outlined { + transform: translate(14px, 9px) scale(1); + &.MuiInputLabel-shrink { + transform: translate(14px, -6px) scale(0.75); + font-size: $text-xs; + color: $pico-50; + font-weight: $font-500; + } + } + + .MuiFormLabel-root { + color: $pico-50; + font-weight: $font-500; + font-size: $text-md; + &.Mui-error { + color: #f44336; + } + } + + .MuiInputBase-root { + .MuiInputBase-input { + font-weight: $font-500; + font-size: $text-md; + color: $text-color; + } + + .MuiOutlinedInput-notchedOutline { + border-color: $cuddle; + } + + .PrivateNotchedOutline-legendLabelled-13 { + span { + padding-right: 0; + } + } + } + } + } + } + &__saveBtn { + &.Mui-disabled { + color: $white !important; + } + } +} diff --git a/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.tsx b/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.tsx new file mode 100644 index 00000000..036b3e92 --- /dev/null +++ b/src/src/components/NameAndDescriptionCard/NameAndDescriptionCard.tsx @@ -0,0 +1,96 @@ +import React, { memo } from 'react'; +import * as yup from 'yup'; +import _ from 'lodash-es'; +import { useFormik } from 'formik'; + +import { Button, TextField } from '@material-ui/core'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { INameAndDescriptionCardProps } from '.'; + +import './NameAndDescriptionCard.scss'; + +function NameAndDescriptionCard({ + title = 'Run Properties', + defaultName, + defaultDescription, + onSave, +}: INameAndDescriptionCardProps): React.FunctionComponentElement { + const formik = useFormik({ + initialValues: { + name: defaultName ?? '', + description: defaultDescription ?? '', + }, + onSubmit: _.noop, + validationSchema: yup.object({ + name: yup.string().required('Name is a required field'), + }), + }); + + const { values, errors, touched, setFieldValue, setFieldTouched } = formik; + + function onChange(e: React.ChangeEvent, fieldName: string) { + setFieldValue(fieldName, e?.target?.value, true).then(() => { + setFieldTouched(fieldName, true); + }); + } + + function saveHandler() { + onSave(values.name, values.description); + } + + return ( + +
+
+ + {title} + + +
+
+
+ onChange(e, 'name')} + error={!!(touched.name && errors.name)} + helperText={touched.name && errors.name} + label='Name' + /> +
+
+ onChange(e, 'description')} + error={!!(touched.description && errors.description)} + helperText={touched.description && errors.description} + /> +
+
+
+
+ ); +} + +export default memo(NameAndDescriptionCard); diff --git a/src/src/components/NameAndDescriptionCard/index.ts b/src/src/components/NameAndDescriptionCard/index.ts new file mode 100644 index 00000000..48bb8476 --- /dev/null +++ b/src/src/components/NameAndDescriptionCard/index.ts @@ -0,0 +1,5 @@ +import NameAndDescriptionCard from './NameAndDescriptionCard'; + +export * from './NameAndDescriptionCard.d'; + +export default NameAndDescriptionCard; diff --git a/src/src/components/NotificationContainer/NotificationContainer.d.ts b/src/src/components/NotificationContainer/NotificationContainer.d.ts new file mode 100644 index 00000000..f84328dd --- /dev/null +++ b/src/src/components/NotificationContainer/NotificationContainer.d.ts @@ -0,0 +1,23 @@ +export interface INotificationContainer { + data: INotification[]; + handleClose: (id: number) => void; +} + +export interface INotification { + id: number; + messages: string[]; + closeDelay?: number; + severity: 'error' | 'info' | 'success' | 'warning'; +} + +export interface ISyntaxErrorDetail { + line: number; + offset: number; + end_offset?: number; + statement: string; +} + +export interface ISyntaxErrorDetails { + detail: ISyntaxErrorDetail; + message: string; +} diff --git a/src/src/components/NotificationContainer/NotificationContainer.scss b/src/src/components/NotificationContainer/NotificationContainer.scss new file mode 100644 index 00000000..1720f2d5 --- /dev/null +++ b/src/src/components/NotificationContainer/NotificationContainer.scss @@ -0,0 +1,47 @@ +@use 'src/styles/abstracts' as *; + +.NotificationContainer { + .MuiAlert-outlinedSuccess { + border: 0.0625rem solid #2bc784; + } + .MuiAlert-outlinedError { + border: 0.0625rem solid #e64e48; + } + .MuiPaper-root { + background: $white; + height: 4rem; + display: flex; + align-items: center; + border-radius: $border-radius-main; + .MuiAlert-icon { + padding: 0; + svg { + width: 2.375rem; + height: 2.375rem; + } + } + + .MuiAlert-action { + display: flex; + align-items: flex-start; + height: 100%; + .MuiSvgIcon-fontSizeSmall { + font-size: 1.05rem; + fill: $pico; + } + } + } + &__contentBox { + &__severity { + font-weight: $font-600; + font-size: $text-md; + text-transform: capitalize; + color: $pico; + } + &__message { + font-weight: $font-400; + font-size: $text-md; + color: $pico; + } + } +} diff --git a/src/src/components/NotificationContainer/NotificationContainer.tsx b/src/src/components/NotificationContainer/NotificationContainer.tsx new file mode 100644 index 00000000..38528a76 --- /dev/null +++ b/src/src/components/NotificationContainer/NotificationContainer.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { Alert } from '@material-ui/lab'; +import { Box, Snackbar } from '@material-ui/core'; + +import { ReactComponent as SuccessIcon } from 'assets/icons/notifications/success.svg'; +import { ReactComponent as ErrorIcon } from 'assets/icons/notifications/error.svg'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { INotificationContainer } from 'types/components/NotificationContainer/NotificationContainer'; + +import './NotificationContainer.scss'; + +export default function NotificationContainer({ + data = [], + handleClose, +}: INotificationContainer): React.FunctionComponentElement { + return ( + + {!_.isEmpty(data) ? ( +
+ +
+ {data.map(({ id, severity, messages }) => ( + + handleClose(+id)} + variant='outlined' + severity={severity} + iconMapping={{ + success: , + error: , + }} + style={{ height: 'auto' }} + > +
+

+ {severity} +

+ {messages.map((message: string, i: number) => { + return message ? ( +

+ {message} +

+ ) : null; + })} +
+
+
+ ))} +
+
+
+ ) : null} +
+ ); +} diff --git a/src/src/components/NotificationContainer/NotificationContainerStore.ts b/src/src/components/NotificationContainer/NotificationContainerStore.ts new file mode 100644 index 00000000..16184ace --- /dev/null +++ b/src/src/components/NotificationContainer/NotificationContainerStore.ts @@ -0,0 +1,28 @@ +import create from 'zustand'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; + +function createNotificationEngine() { + const state = create<{ data: INotification[] }>(() => ({ + data: [], + })); + + const onNotificationDelete = (id: number) => { + const notificationList = state.getState().data; + state.setState({ + data: notificationList.filter((notification) => notification.id !== id), + }); + }; + + const onNotificationAdd = (notificationData: INotification) => { + const notificationList = state.getState().data ?? []; + state.setState({ data: [...notificationList, notificationData] }); + setTimeout(() => { + onNotificationDelete(notificationData.id); + }, 3000); + }; + + return { notificationState: state, onNotificationDelete, onNotificationAdd }; +} + +export default createNotificationEngine(); diff --git a/src/src/components/NotificationContainer/index.ts b/src/src/components/NotificationContainer/index.ts new file mode 100644 index 00000000..bb991968 --- /dev/null +++ b/src/src/components/NotificationContainer/index.ts @@ -0,0 +1,7 @@ +import NotificationContainer from './NotificationContainer'; +import notificationContainerStore from './NotificationContainerStore'; +import useNotificationContainer from './useNotificationContainer'; + +export * from './NotificationContainer.d'; +export { notificationContainerStore, useNotificationContainer }; +export default NotificationContainer; diff --git a/src/src/components/NotificationContainer/useNotificationContainer.tsx b/src/src/components/NotificationContainer/useNotificationContainer.tsx new file mode 100644 index 00000000..8ea433ef --- /dev/null +++ b/src/src/components/NotificationContainer/useNotificationContainer.tsx @@ -0,0 +1,19 @@ +import React from 'react'; + +import { INotification } from './NotificationContainer.d'; +import notificationEngine from './NotificationContainerStore'; + +function useNotificationContainer() { + const { current: engine } = React.useRef(notificationEngine); + const notificationState: { data: INotification[] } = engine.notificationState( + (state: { data: INotification[] }) => state, + ); + + return { + notificationState: notificationState?.data || [], + onNotificationDelete: engine.onNotificationDelete, + onNotificationAdd: engine.onNotificationAdd, + }; +} + +export default useNotificationContainer; diff --git a/src/src/components/ProgressBar/ProgressBar.d.ts b/src/src/components/ProgressBar/ProgressBar.d.ts new file mode 100644 index 00000000..187e1933 --- /dev/null +++ b/src/src/components/ProgressBar/ProgressBar.d.ts @@ -0,0 +1,8 @@ +import { IRunRequestProgress } from 'utils/app/setRunRequestProgress'; + +export interface IProgressBarProps { + progress: IRunRequestProgress; + processing?: boolean; + pendingStatus?: boolean; + setIsProgressBarVisible?: (isVisible: boolena) => void; +} diff --git a/src/src/components/ProgressBar/ProgressBar.scss b/src/src/components/ProgressBar/ProgressBar.scss new file mode 100644 index 00000000..901db447 --- /dev/null +++ b/src/src/components/ProgressBar/ProgressBar.scss @@ -0,0 +1,101 @@ +@use 'src/styles/abstracts' as *; + +.ProgressBar { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + margin: 0 auto; + position: absolute; + width: 100%; + height: 100%; + background-color: white; + z-index: 9; + opacity: 1; + transform: translateY(0); + left: $space-xxxxs; + &.fadeOutProgress { + animation: fadeOutProgress 0.55s cubic-bezier(0.39, -0.01, 0.27, 1) forwards; + animation-delay: 0.7s; + .ProgressBar__container { + animation: fadeOutProgressInner 0.6s cubic-bezier(0.39, -0.01, 0.27, 1) forwards; + animation-delay: 0.75s; + } + } + @keyframes fadeOutProgress { + from { + opacity: 0.9; + } + to { + opacity: 0; + } + } + @keyframes fadeOutProgressInner { + from { + transform: translateY(0); + } + to { + transform: translateY(-15px); + } + } + &__container { + width: toRem(482px); + height: toRem(65px); + &__title { + color: $pico; + } + &__bar { + box-shadow: 0 0 0 1px #0000000f inset; + box-sizing: content-box; + position: relative; + background: $cuddle-70; + border-radius: $border-radius-xl; + height: toRem(8px); + margin: $space-sm 0 $space-xs; + & > span { + display: block; + height: 100%; + border-radius: $border-radius-xl; + background-color: $primary-color; + position: relative; + overflow: hidden; + will-change: width; + transition: width 0.3s ease-out; + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background-image: linear-gradient( + 315deg, + rgba(255, 255, 255, 0.09), + rgb(255 255 255 / 50%) 60%, + rgb(255 255 255 / 0%) 100% + ); + overflow: hidden; + transform: translateX(-100%); + animation: move 1.5s ease-out infinite; + } + @keyframes move { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(100%); + } + } + } + } + &__info { + display: flex; + color: $pico-70; + font-family: Inter, sans-serif; + font-feature-settings: 'tnum'; + &__matched { + margin-left: auto; + } + } + } +} diff --git a/src/src/components/ProgressBar/ProgressBar.tsx b/src/src/components/ProgressBar/ProgressBar.tsx new file mode 100644 index 00000000..a154eac8 --- /dev/null +++ b/src/src/components/ProgressBar/ProgressBar.tsx @@ -0,0 +1,88 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Text } from '../kit'; + +import { IProgressBarProps } from './ProgressBar.d'; + +import './ProgressBar.scss'; + +function ProgressBar({ + progress = {}, + processing = false, + pendingStatus = false, + setIsProgressBarVisible, +}: IProgressBarProps) { + const { checked = 0, trackedRuns = 0, matched = 0, percent = 0 } = progress; + const [renderBar, setRenderBar] = React.useState(false); + const timeoutIdRef = React.useRef(0); + + React.useEffect(() => { + if (processing || pendingStatus) { + setRenderBar(true); + setIsProgressBarVisible?.(true); + } else { + const hidingDelay = 2000; + if (timeoutIdRef.current) { + window.clearTimeout(timeoutIdRef.current); + } + timeoutIdRef.current = window.setTimeout(() => { + setRenderBar(false); + }, hidingDelay); + } + return () => { + if (timeoutIdRef.current) { + window.clearTimeout(timeoutIdRef.current); + } + setIsProgressBarVisible?.(false); + }; + }, [processing, pendingStatus, setIsProgressBarVisible]); + + const barWidth = React.useMemo( + () => (pendingStatus ? percent + '%' : 'unset'), + [pendingStatus, percent], + ); + const fadeOutProgress = React.useMemo( + () => !(processing || pendingStatus), + [pendingStatus, processing], + ); + const title = React.useMemo( + () => (pendingStatus ? 'Searching over runs...' : 'Processing...'), + [pendingStatus], + ); + + return renderBar ? ( +
+
+ + {title} + +
+ +
+ {trackedRuns !== 0 && ( +
+ + {checked} of {trackedRuns} checked + + + {matched} matched run(s) + +
+ )} +
+
+ ) : null; +} + +export default React.memo(ProgressBar); diff --git a/src/src/components/ProjectWrapper/ProjectWrapper.tsx b/src/src/components/ProjectWrapper/ProjectWrapper.tsx new file mode 100644 index 00000000..19493f1e --- /dev/null +++ b/src/src/components/ProjectWrapper/ProjectWrapper.tsx @@ -0,0 +1,21 @@ +import React from 'react'; + +import projectsModel from 'services/models/projects/projectsModel'; + +const projectDataRequestRef = projectsModel.getProjectsData(); +projectDataRequestRef.call(); +const pinnedSequencesRequestRef = projectsModel.getPinnedSequences(); +pinnedSequencesRequestRef.call(); + +function ProjectWrapper() { + React.useEffect(() => { + return () => { + projectDataRequestRef.abort(); + pinnedSequencesRequestRef.abort(); + }; + }, []); + + return null; +} + +export default ProjectWrapper; diff --git a/src/src/components/RangePanel/RangePanel.d.ts b/src/src/components/RangePanel/RangePanel.d.ts new file mode 100644 index 00000000..68640a25 --- /dev/null +++ b/src/src/components/RangePanel/RangePanel.d.ts @@ -0,0 +1,33 @@ +import { IValidationMetadata, IValidationPatterns } from 'components/kit/Input'; + +export interface IRangeSliderWithInputItem { + sliderName: string; + inputName: string; + sliderTitle: string; + inputTitle: string; + sliderTitleTooltip: string; + inputTitleTooltip: string; + /** + * min, max values + */ + rangeEndpoints: [number, number]; + selectedRangeValue: [number, number]; + inputValue: number; + sliderType: 'single' | 'range'; // This type is same as SliderWithInput component sliderType prop type. + inputValidationPatterns?: IValidationPatterns; + infoPropertyName?: string; +} + +export type RangeSliderData = IRangeSliderWithInputItem[]; + +export interface IRangeSliderPanelProps { + items?: RangeSliderData; + onApply: () => void; + onInputChange: ( + name: string, + value: number, + metadata?: IValidationMetadata, + ) => void; + onRangeSliderChange: (name: string, newValue: number[] | number) => void; + applyButtonDisabled: boolean; +} diff --git a/src/src/components/RangePanel/RangePanel.scss b/src/src/components/RangePanel/RangePanel.scss new file mode 100644 index 00000000..42857658 --- /dev/null +++ b/src/src/components/RangePanel/RangePanel.scss @@ -0,0 +1,50 @@ +@use 'src/styles/abstracts' as *; + +.RangePanel { + display: flex; + align-items: center; + height: 3rem; + width: 100%; + justify-content: center; + background: $white; + border-top: $border-main; + border-bottom-right-radius: toRem(6px); + .RangePanelContainer { + display: flex; + align-items: center; + height: 100%; + width: 100%; + max-width: 85rem; + padding: 0 2.125rem; + justify-content: center; + .ApplyButtonContainer { + height: 100%; + display: flex; + align-items: center; + .ApplyButton { + height: 1.5rem !important; + width: 5.125rem; + } + } + + .VerticalDivider { + width: 0.0625rem; + height: 1.5rem; + background: $primary-color-10; + margin-right: 2.75rem; + margin-left: 2.75rem; + } + .InfoMassageBox { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + i { + margin-right: $space-sm; + } + .InfoMessageBoldText { + margin: 0 toRem(3px); + } + } + } +} diff --git a/src/src/components/RangePanel/RangePanel.tsx b/src/src/components/RangePanel/RangePanel.tsx new file mode 100644 index 00000000..206f4e79 --- /dev/null +++ b/src/src/components/RangePanel/RangePanel.tsx @@ -0,0 +1,110 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import SliderWithInput from 'components/SliderWithInput'; +import { Button, Icon, Text } from 'components/kit'; +import { IValidationMetadata } from 'components/kit/Input'; + +import { IRangeSliderPanelProps } from './RangePanel.d'; + +import './RangePanel.scss'; + +function RangePanel({ + onApply, + applyButtonDisabled, + onRangeSliderChange, + onInputChange, + items, +}: IRangeSliderPanelProps) { + return ( +
{ + e.preventDefault(); + onApply(); + }} + > +
+ {items?.map((item) => { + const rangeLength = _.range( + item.rangeEndpoints?.[0] ?? 0, + (item.rangeEndpoints?.[1] ?? 0) + 1, + ).length; + return ( + + {item.rangeEndpoints?.[0] !== item.rangeEndpoints?.[1] ? ( + + onRangeSliderChange(item.sliderName, value) + } + onCountChange={(value, metadata?: IValidationMetadata) => { + onInputChange(item.inputName, value, metadata); + }} + inputValidationPatterns={ + item?.inputValidationPatterns ?? [ + { + errorCondition: (value: string | number) => +value <= 0, + errorText: `Value should be greater then ${0}`, + }, + { + errorCondition: (value: string | number) => { + return +value > rangeLength; + }, + errorText: `Value should be smaller then ${ + rangeLength + 1 + }`, + }, + ] + } + /> + ) : ( +
+ + + You have only + + 1 {item?.infoPropertyName || 'step'} + + logged. + +
+ )} +
+ + ); + })} +
+ +
+
+ + ); +} + +RangePanel.displayName = 'RangePanel'; + +export default React.memo(RangePanel); diff --git a/src/src/components/RangePanel/index.tsx b/src/src/components/RangePanel/index.tsx new file mode 100644 index 00000000..b48f3912 --- /dev/null +++ b/src/src/components/RangePanel/index.tsx @@ -0,0 +1,5 @@ +import RangePanel from './RangePanel'; + +export * from './RangePanel.d'; + +export default RangePanel; diff --git a/src/src/components/ReleaseNoteItem/ReleaseNoteItem.d.ts b/src/src/components/ReleaseNoteItem/ReleaseNoteItem.d.ts new file mode 100644 index 00000000..e586a5cd --- /dev/null +++ b/src/src/components/ReleaseNoteItem/ReleaseNoteItem.d.ts @@ -0,0 +1,20 @@ +import React from 'react'; + +/** + * @description The IReleaseNoteItemProps interface. + */ +export interface IReleaseNoteItemProps + extends Partial> { + /** + * @description The info of the release note + * @type string + * @example '[feat] Add support for new metrics' + */ + info: string; + /** + * @description tag name of the release note + * @type string + * @example 'v3.13.0' + */ + tagName: string; +} diff --git a/src/src/components/ReleaseNoteItem/ReleaseNoteItem.scss b/src/src/components/ReleaseNoteItem/ReleaseNoteItem.scss new file mode 100644 index 00000000..8186f218 --- /dev/null +++ b/src/src/components/ReleaseNoteItem/ReleaseNoteItem.scss @@ -0,0 +1,45 @@ +@use 'src/styles/abstracts' as *; + +.ReleaseNoteItem { + display: flex; + padding-left: 18px; + margin-bottom: $space-sm; + position: relative; + text-decoration: none; + p { + word-break: break-word; + } + &__tagName { + color: $primary-color; + font-weight: 600; + } + &::before { + content: ''; + position: absolute; + left: 0; + top: 3px; + width: 7px; + height: 7px; + z-index: 1; + border-radius: $border-radius-circle; + background-color: $primary-color; + } + &::after { + content: ''; + position: absolute; + left: 3px; + top: 3px; + height: 100%; + width: 1px; + background-color: $pico-20; + } + &:last-child { + margin-bottom: 0; + } + + &:hover { + text-decoration: underline; + text-decoration-color: $text-color; + cursor: pointer; + } +} diff --git a/src/src/components/ReleaseNoteItem/ReleaseNoteItem.tsx b/src/src/components/ReleaseNoteItem/ReleaseNoteItem.tsx new file mode 100644 index 00000000..b361f140 --- /dev/null +++ b/src/src/components/ReleaseNoteItem/ReleaseNoteItem.tsx @@ -0,0 +1,23 @@ +import React from 'react'; + +import { Text } from 'components/kit'; + +import { IReleaseNoteItemProps } from './ReleaseNoteItem.d'; + +import './ReleaseNoteItem.scss'; + +function ReleaseNoteItem({ + info, + tagName, + ...rest +}: IReleaseNoteItemProps): React.FunctionComponentElement { + return ( + + + {tagName} - {info} + + + ); +} + +export default React.memo(ReleaseNoteItem); diff --git a/src/src/components/ResizeElement/ResizableElement.d.ts b/src/src/components/ResizeElement/ResizableElement.d.ts new file mode 100644 index 00000000..608a74ed --- /dev/null +++ b/src/src/components/ResizeElement/ResizableElement.d.ts @@ -0,0 +1,8 @@ +import * as React from 'react'; + +export interface ResizableElementProps + extends React.HTMLAttributes { + resizingFallback?: React.ReactNode; + children: React.ReactNode | ((resizing: boolean) => React.ReactNode); + hide?: boolean; +} diff --git a/src/src/components/ResizeElement/ResizableElement.tsx b/src/src/components/ResizeElement/ResizableElement.tsx new file mode 100644 index 00000000..db4a3164 --- /dev/null +++ b/src/src/components/ResizeElement/ResizableElement.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import classNames from 'classnames'; + +import { ResizeElementContext, ResizableElementProps } from './'; + +const ResizableElement = React.forwardRef(function ResizableElement( + props: ResizableElementProps, + ref?: React.LegacyRef, +) { + const { + children, + className = '', + resizingFallback = null, + hide = false, + } = props; + const { resizing } = React.useContext(ResizeElementContext); + + const childrenElement = React.useMemo(() => { + return typeof children === 'function' ? children(resizing) : children; + }, [children, resizing]); + return ( +
+ {hide + ? null + : resizing && resizingFallback + ? resizingFallback + : childrenElement} +
+ ); +}); + +ResizableElement.displayName = 'ResizableElement'; + +export default ResizableElement; diff --git a/src/src/components/ResizeElement/ResizeElement.d.ts b/src/src/components/ResizeElement/ResizeElement.d.ts new file mode 100644 index 00000000..cbd0dc0b --- /dev/null +++ b/src/src/components/ResizeElement/ResizeElement.d.ts @@ -0,0 +1,31 @@ +import React from 'react'; +import { HeightProperty, WidthProperty } from 'csstype'; + +import { ResizableSideEnum } from './'; + +export interface ResizeElementProps { + id?: string; + children: React.ReactNode; + side?: ResizableSideEnum; + gutterSize?: number; + snapOffset?: number; + useLocalStorage?: boolean; + initialSizes: { + width?: WidthProperty; + height?: HeightProperty; + maxWidth: number; + maxHeight: number; + }; + onResizeStart?: ( + resizeElement: React.RefObject, + gutterSize: number, + ) => void; + onResize?: ( + resizeElement: React.RefObject, + gutterSize: number, + ) => void; + onResizeEnd?: ( + resizeElement: React.RefObject, + gutterSize: number, + ) => void; +} diff --git a/src/src/components/ResizeElement/ResizeElement.scss b/src/src/components/ResizeElement/ResizeElement.scss new file mode 100644 index 00000000..c797c90e --- /dev/null +++ b/src/src/components/ResizeElement/ResizeElement.scss @@ -0,0 +1,49 @@ +@use 'src/styles/abstracts' as *; + +.ResizeElement { + position: relative; + display: flex; + overflow: scroll; + &__gutter { + position: absolute; + display: inline-flex; + z-index: 1; + transition: all 0.25s cubic-bezier(1,.14,1,.5); + &__left { + cursor: col-resize; + height: 100%; + left: 0; + top: 0; + box-shadow: inset 2px 0 0 0 $primary-color-20; + } + &__right { + cursor: col-resize; + height: 100%; + right: 0; + top: 0; + box-shadow: inset 2px 0 0 0 $primary-color-20; + } + &__top { + cursor: row-resize; + width: 100%; + left: 0; + top: 0; + box-shadow: inset 0 2px 0 0 $primary-color-20; + } + &__bottom { + cursor: row-resize; + width: 100%; + left: 0; + bottom: 0; + box-shadow: inset 0 -2px 0 0 $primary-color-20; + } + &:hover, &:active { + background-color: $primary-color-50; + box-shadow: unset; + } + } + & > .ResizableElement { + width: 100%; + height: 100%; + } +} diff --git a/src/src/components/ResizeElement/ResizeElement.tsx b/src/src/components/ResizeElement/ResizeElement.tsx new file mode 100644 index 00000000..f8115692 --- /dev/null +++ b/src/src/components/ResizeElement/ResizeElement.tsx @@ -0,0 +1,234 @@ +import * as React from 'react'; +import { WidthProperty, HeightProperty } from 'csstype'; + +import ErrorBoundary from 'components/ErrorBoundary'; + +import { + ResizeElementProps, + ResizeElementContext, + ResizableSideEnum, +} from './'; + +import './ResizeElement.scss'; + +function ResizeElement(props: ResizeElementProps) { + const { + id = 'ResizeElement', + children, + gutterSize = 4, + snapOffset = 0, + side = ResizableSideEnum.LEFT, + initialSizes, + useLocalStorage = false, + onResizeEnd, + onResizeStart, + onResize, + } = props; + const containerRef = React.useRef(null); + const gutterElemRef = React.useRef(null); + const containerRectRef = React.useRef(); + + const [resizing, setResizing] = React.useState(false); + + const isHorizontal = [ + ResizableSideEnum.LEFT, + ResizableSideEnum.RIGHT, + ].includes(side); + + const containerInitialSize = React.useMemo( + () => ({ + width: '100%' as WidthProperty, + height: '100%' as HeightProperty, + ...initialSizes, + }), + [initialSizes], + ); + + const getResizeHandler = React.useCallback( + (side: ResizableSideEnum, containerNode: HTMLElement) => { + const { maxWidth, maxHeight } = containerInitialSize; + + const checkVerticalBounds = (height: number) => { + return !(height < gutterSize || (maxHeight && height > maxHeight)); + }; + const checkHorizontalBounds = (width: number) => { + return !(width < gutterSize || (maxWidth && width > maxWidth)); + }; + + const getSize = (size: number, maxSize?: number): number => { + let newSize; + if (size < snapOffset) { + newSize = gutterSize; + } else if (maxSize && maxSize - size < snapOffset) { + newSize = maxSize; + } else { + newSize = size; + } + return newSize; + }; + const setHeight = (height: number) => { + const newHeight = getSize(height, maxHeight); + containerNode.style.height = `${newHeight}px`; + }; + const setWidth = (width: number) => { + const newWidth = getSize(width, maxWidth); + containerNode.style.width = `${newWidth}px`; + }; + + const dict = { + [ResizableSideEnum.LEFT]: (e: MouseEvent, rect: DOMRect) => { + const width = rect.right - e.pageX; + if (checkHorizontalBounds(width)) { + setWidth(width); + } + }, + [ResizableSideEnum.RIGHT]: (e: MouseEvent, rect: DOMRect) => { + const width = e.pageX - rect.left; + if (checkHorizontalBounds(width)) { + setWidth(width); + } + }, + [ResizableSideEnum.TOP]: (e: MouseEvent, rect: DOMRect) => { + const height = rect.bottom - e.pageY; + if (checkVerticalBounds(height)) { + setHeight(height); + } + }, + [ResizableSideEnum.BOTTOM]: (e: MouseEvent, rect: DOMRect) => { + const height = e.pageY - rect.top; + if (checkVerticalBounds(height)) { + setHeight(height); + } + }, + }; + return dict[side]; + }, + [gutterSize, snapOffset, containerInitialSize], + ); + + const getStringifiedSize = (size: string | number) => { + return typeof size === 'string' ? size : `${size}px`; + }; + + React.useEffect(() => { + const containerNode = containerRef.current; + if (!containerNode) return; + + /** + * Set initial sizes + */ + const { maxHeight, maxWidth } = containerInitialSize; + containerNode.style.maxHeight = getStringifiedSize(maxHeight); + containerNode.style.maxWidth = getStringifiedSize(maxWidth); + + if (useLocalStorage) { + const savedSizes = localStorage.getItem(id); + if (savedSizes) { + const { width, height } = JSON.parse(savedSizes); + + containerNode.style.width = width; + containerNode.style.height = height; + return; + } + } + + const { width, height } = containerInitialSize; + containerNode.style.width = getStringifiedSize(width); + containerNode.style.height = getStringifiedSize(height); + }, [containerInitialSize, useLocalStorage, id]); + + React.useEffect(() => { + const containerNode = containerRef.current; + const gutterNode = gutterElemRef.current; + if (!containerNode || !gutterNode) return; + + /** + * Set resize listeners/handlers + */ + const resizeHandler = getResizeHandler(side, containerNode); + + const onMouseMove = (e: MouseEvent) => { + e.stopPropagation(); + const rect = containerRectRef.current as DOMRect; + resizeHandler(e, rect); + onResize && onResize(containerRef, gutterSize); + }; + + const onMouseUp = (e: MouseEvent) => { + e.stopPropagation(); + setResizing(false); + document.removeEventListener('mousemove', onMouseMove); + document.removeEventListener('mouseup', onMouseUp); + document.body.style.userSelect = 'unset'; + document.body.style.cursor = 'unset'; + document.body.style.pointerEvents = 'unset'; + if (useLocalStorage) { + const { offsetWidth, offsetHeight } = containerNode; + const sizes: Record = { + width: + offsetWidth < snapOffset + ? getStringifiedSize(containerInitialSize.width) + : containerNode.style.width, + height: + offsetHeight < snapOffset + ? getStringifiedSize(containerInitialSize.height) + : containerNode.style.height, + }; + localStorage.setItem(id, JSON.stringify(sizes)); + } + onResizeEnd && onResizeEnd(containerRef, gutterSize); + }; + + const onMouseDown = (e: MouseEvent) => { + e.stopPropagation(); + setResizing(true); + document.body.style.pointerEvents = 'none'; + document.body.style.userSelect = 'none'; + document.body.style.cursor = isHorizontal ? 'col-resize' : 'row-resize'; + document.addEventListener('mousemove', onMouseMove); + document.addEventListener('mouseup', onMouseUp); + containerRectRef.current = containerNode.getBoundingClientRect(); + onResizeStart && onResizeStart(containerRef, gutterSize); + }; + + gutterNode.addEventListener('mousedown', onMouseDown); + return () => { + gutterNode.removeEventListener('mousedown', onMouseDown); + }; + }, [ + side, + id, + useLocalStorage, + isHorizontal, + gutterSize, + snapOffset, + getResizeHandler, + onResize, + onResizeEnd, + onResizeStart, + containerInitialSize, + ]); + + const gutterStyle = { + width: isHorizontal ? gutterSize : '100%', + height: !isHorizontal ? gutterSize : '100%', + }; + return ( + + +
+
+ {children} +
+ + + ); +} + +ResizeElement.displayName = 'ResizeElement'; + +export default React.memo(ResizeElement); diff --git a/src/src/components/ResizeElement/context.ts b/src/src/components/ResizeElement/context.ts new file mode 100644 index 00000000..125e7b0b --- /dev/null +++ b/src/src/components/ResizeElement/context.ts @@ -0,0 +1,7 @@ +import * as React from 'react'; + +const ResizeElementContext = React.createContext({ + resizing: false, +}); + +export default ResizeElementContext; diff --git a/src/src/components/ResizeElement/index.ts b/src/src/components/ResizeElement/index.ts new file mode 100644 index 00000000..efd4778f --- /dev/null +++ b/src/src/components/ResizeElement/index.ts @@ -0,0 +1,16 @@ +import ResizeElement from './ResizeElement'; +import ResizableElement from './ResizableElement'; +import ResizeElementContext from './context'; + +export * from './ResizeElement.d'; +export * from './ResizableElement.d'; + +enum ResizableSideEnum { + LEFT = 'left', + RIGHT = 'right', + TOP = 'top', + BOTTOM = 'bottom', +} + +export { ResizableElement, ResizeElementContext, ResizableSideEnum }; +export default ResizeElement; diff --git a/src/src/components/ResizeModeActions/ResizeModeActions.scss b/src/src/components/ResizeModeActions/ResizeModeActions.scss new file mode 100644 index 00000000..b7c711e8 --- /dev/null +++ b/src/src/components/ResizeModeActions/ResizeModeActions.scss @@ -0,0 +1,23 @@ +.ResizeModeActions { + padding-right: 1rem; + display: flex; + align-items: center; + justify-content: center; + border-right: 0.0625rem solid #e8f1fd; + margin-right: 1rem; + + button { + &:nth-child(2) { + margin: 0 0.25rem; + } + } + + &__fullHeight { + padding: 0.25rem; + button { + &:nth-child(2) { + margin: 0 0.25rem; + } + } + } +} diff --git a/src/src/components/ResizeModeActions/ResizeModeActions.tsx b/src/src/components/ResizeModeActions/ResizeModeActions.tsx new file mode 100644 index 00000000..4fff41c1 --- /dev/null +++ b/src/src/components/ResizeModeActions/ResizeModeActions.tsx @@ -0,0 +1,56 @@ +import React from 'react'; + +import { IconName } from 'components/kit/Icon'; +import { Button, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { IResizeModeActions } from 'types/components/ResizeModeActions/ResizeModeActions'; + +import './ResizeModeActions.scss'; + +const resizeButtons: { mode: ResizeModeEnum; icon: IconName }[] = [ + { + mode: ResizeModeEnum.Hide, + icon: 'table-resize-hide', + }, + { + mode: ResizeModeEnum.Resizable, + icon: 'table-resize-resizable', + }, + { + mode: ResizeModeEnum.MaxHeight, + icon: 'table-resize-maximize', + }, +]; + +function ResizeModeActions({ + onTableResizeModeChange, + resizeMode, + className, +}: IResizeModeActions): React.FunctionComponentElement { + return ( + +
+ {resizeButtons.map(({ icon, mode }) => ( + + ))} +
+
+ ); +} + +export default ResizeModeActions; diff --git a/src/src/components/ResizePanel/ResizePanel.scss b/src/src/components/ResizePanel/ResizePanel.scss new file mode 100644 index 00000000..c5408e43 --- /dev/null +++ b/src/src/components/ResizePanel/ResizePanel.scss @@ -0,0 +1,28 @@ +@use 'src/styles/abstracts' as *; + +.ResizePanel { + cursor: row-resize; + justify-content: center; + display: flex; + align-items: center; + height: toRem(4px); + transition: all 0.15s ease-out 0.2s; + background-color: transparent; + box-shadow: inset 0 2px 0 0 $primary-color-20; + &:hover, + &:active, + &.resizing { + background-color: $primary-color-50; + box-shadow: unset; + } + &__fullHeight { + background-color: $cuddle-10; + border-top: $border-main; + display: flex; + justify-content: center; + align-items: center; + } + &__hidden { + display: none; + } +} diff --git a/src/src/components/ResizePanel/ResizePanel.tsx b/src/src/components/ResizePanel/ResizePanel.tsx new file mode 100644 index 00000000..8409c618 --- /dev/null +++ b/src/src/components/ResizePanel/ResizePanel.tsx @@ -0,0 +1,42 @@ +import React from 'react'; + +import ResizeModeActions from 'components/ResizeModeActions/ResizeModeActions'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { IResizePanelProps } from 'types/components/ResizePanel/ResizePanel'; + +import './ResizePanel.scss'; + +function ResizePanel({ + panelResizing, + resizeElemRef, + resizeMode, + onTableResizeModeChange, + className, +}: IResizePanelProps): React.FunctionComponentElement | null { + return ( + +
+ {resizeMode === ResizeModeEnum.Hide ? ( + + ) : null} +
+
+ ); +} + +export default React.memo(ResizePanel); diff --git a/src/src/components/ResizingFallback/ResizingFallback.scss b/src/src/components/ResizingFallback/ResizingFallback.scss new file mode 100644 index 00000000..153cd57f --- /dev/null +++ b/src/src/components/ResizingFallback/ResizingFallback.scss @@ -0,0 +1,16 @@ +@use 'src/styles/abstracts' as *; + +.ResizingFallback { + display: flex; + width: 100%; + height: 100%; + flex-direction: column; + align-items: center; + justify-content: center; + background-color: $primary-color-5; + user-select: none; + text-align: center; + &__text { + padding: $space-xxs $space-sm; + } +} diff --git a/src/src/components/ResizingFallback/ResizingFallback.tsx b/src/src/components/ResizingFallback/ResizingFallback.tsx new file mode 100644 index 00000000..d589c2df --- /dev/null +++ b/src/src/components/ResizingFallback/ResizingFallback.tsx @@ -0,0 +1,17 @@ +import React from 'react'; + +import { Text } from 'components/kit'; + +import './ResizingFallback.scss'; + +function ResizingFallback() { + return ( +
+ + Release to resize + +
+ ); +} + +export default React.memo(ResizingFallback); diff --git a/src/src/components/ResizingFallback/index.ts b/src/src/components/ResizingFallback/index.ts new file mode 100644 index 00000000..9086fe25 --- /dev/null +++ b/src/src/components/ResizingFallback/index.ts @@ -0,0 +1,3 @@ +import ResizingFallback from './ResizingFallback'; + +export default ResizingFallback; diff --git a/src/src/components/RouteLeavingGuard/RouteLeavingGuard.d.ts b/src/src/components/RouteLeavingGuard/RouteLeavingGuard.d.ts new file mode 100644 index 00000000..cf96252e --- /dev/null +++ b/src/src/components/RouteLeavingGuard/RouteLeavingGuard.d.ts @@ -0,0 +1,5 @@ +export interface IRouteLeavingGuardProps { + when: boolean; + message?: string; + confirmBtnText?: string; +} diff --git a/src/src/components/RouteLeavingGuard/RouteLeavingGuard.tsx b/src/src/components/RouteLeavingGuard/RouteLeavingGuard.tsx new file mode 100644 index 00000000..ed8d3894 --- /dev/null +++ b/src/src/components/RouteLeavingGuard/RouteLeavingGuard.tsx @@ -0,0 +1,84 @@ +import React from 'react'; +import { Prompt, useHistory } from 'react-router-dom'; + +import ConfirmModal from 'components/ConfirmModal/ConfirmModal'; +import { Icon } from 'components/kit'; + +import { IRouteLeavingGuardProps } from './RouteLeavingGuard.d'; + +function RouteLeavingGuard({ + when, + message = 'Changes you made may not be saved.', + confirmBtnText = 'Leave', +}: IRouteLeavingGuardProps) { + const [openModal, setOpenModal] = React.useState(false); + const [nextLocation, setNextLocation] = React.useState(''); + const [confirmNavigation, setConfirmNavigation] = React.useState(false); + const history = useHistory(); + + React.useEffect(() => { + if (confirmNavigation) { + history.push(nextLocation); + setConfirmNavigation(false); + } + window.addEventListener('beforeunload', onBeforeUnload); + return () => { + window.removeEventListener('beforeunload', onBeforeUnload); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [confirmNavigation, when]); + + function onBeforeUnload(event: any): string | undefined { + if (!when) { + return; + } else { + event?.preventDefault(); + if (event) { + event.returnValue = + 'Your changes is not saved. Do you still want to leave'; + } + return ''; + } + } + + function showModal(location: string): void { + setOpenModal(true); + setNextLocation(location); + } + + function closeModal() { + setOpenModal(false); + } + + function handleBlockedNavigation(location: Location | any): boolean { + if (!confirmNavigation) { + showModal(location.pathname); + return false; + } + return true; + } + function handleConfirm(): void { + closeModal(); + if (nextLocation) { + setConfirmNavigation(true); + } + } + + return ( + <> + + } + statusType='warning' + confirmBtnText={confirmBtnText} + title='Are you sure' + /> + + ); +} + +export default RouteLeavingGuard; diff --git a/src/src/components/RouteLeavingGuard/index.ts b/src/src/components/RouteLeavingGuard/index.ts new file mode 100644 index 00000000..166e1ab5 --- /dev/null +++ b/src/src/components/RouteLeavingGuard/index.ts @@ -0,0 +1,5 @@ +import RouteLeavingGuard from './RouteLeavingGuard'; + +export * from './RouteLeavingGuard.d'; + +export default RouteLeavingGuard; diff --git a/src/src/components/ScatterPlot/ScatterPlot.tsx b/src/src/components/ScatterPlot/ScatterPlot.tsx new file mode 100644 index 00000000..c9d8b722 --- /dev/null +++ b/src/src/components/ScatterPlot/ScatterPlot.tsx @@ -0,0 +1,274 @@ +import React from 'react'; +import { useResizeObserver } from 'hooks'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IAttributesRef } from 'types/components/LineChart/LineChart'; +import { IFocusedState } from 'types/services/models/metrics/metricsAppModel'; + +import { + clearArea, + drawArea, + drawAxes, + getAxisScale, + drawHoverAttributes, + drawScatterTrendline, + drawPoints, + drawUnableToRender, +} from 'utils/d3'; + +import { IScatterPlotProps } from './types.d'; + +import './styles.scss'; + +const ScatterPlot = React.forwardRef(function ScatterPlot( + props: IScatterPlotProps, + ref, +): React.FunctionComponentElement { + const { + index, + id = `${index}`, + nameKey = '', + data: { dimensions, data }, + syncHoverState, + chartTitle, + trendlineOptions, + readOnly = false, + resizeMode, + onMount, + margin = { + top: 30, + right: 20, + bottom: 30, + left: 60, + }, + } = props; + + // boxes + const visBoxRef = React.useRef({ + margin, + height: 0, + width: 0, + }); + const plotBoxRef = React.useRef({ + height: 0, + width: 0, + }); + + // containers + const parentRef = React.useRef(null); + const visAreaRef = React.useRef(null); + + // d3 node elements + const svgNodeRef = React.useRef(null); + const bgRectNodeRef = React.useRef(null); + const plotNodeRef = React.useRef(null); + const axesNodeRef = React.useRef(null); + const linesNodeRef = React.useRef(null); + const attributesNodeRef = React.useRef(null); + const highlightedNodeRef = React.useRef(null); + + // methods and values refs + const axesRef = React.useRef({}); + const linesRef = React.useRef({}); + const attributesRef = React.useRef({}); + const humanizerConfigRef = React.useRef({}); + const rafIDRef = React.useRef(); + + const [yDimension, xDimension] = Object.values(dimensions); + + const unableToDrawConditions: { condition: boolean; text?: string }[] = []; + const updateDeps = [data, dimensions, trendlineOptions, readOnly, resizeMode]; + + function draw() { + drawArea({ + index, + id, + nameKey, + visBoxRef, + plotBoxRef, + parentRef, + visAreaRef, + svgNodeRef, + bgRectNodeRef, + plotNodeRef, + axesNodeRef, + linesNodeRef, + attributesNodeRef, + chartTitle, + }); + + const { width, height, margin } = visBoxRef.current; + + const axesScaleType = { + xAxis: xDimension.scaleType, + yAxis: yDimension.scaleType, + }; + + const xScale = getAxisScale({ + domainData: xDimension.domainData, + rangeData: [0, width - margin.left - margin.right], + scaleType: axesScaleType.xAxis, + }); + const yScale = getAxisScale({ + domainData: yDimension.domainData, + rangeData: [height - margin.top - margin.bottom, 0], + scaleType: axesScaleType.yAxis, + }); + + unableToDrawConditions.unshift({ + condition: + yDimension.domainData[0] === '-' || xDimension.domainData[0] === '-', + text: 'Unable to draw points with the current data. Please adjust the data.', + }); + + attributesRef.current.xScale = xScale; + attributesRef.current.yScale = yScale; + + drawAxes({ + svgNodeRef, + axesNodeRef, + axesRef, + plotBoxRef, + xScale, + yScale, + visBoxRef, + axesScaleType, + humanizerConfigRef, + drawBgTickLines: { y: true, x: true }, + }); + + drawPoints({ + index, + data, + nameKey, + xScale, + yScale, + pointsRef: linesRef, + pointsNodeRef: linesNodeRef, + }); + + if (!readOnly) { + drawHoverAttributes({ + index, + id, + nameKey, + data, + axesScaleType, + syncHoverState, + visAreaRef, + attributesRef, + plotBoxRef, + visBoxRef, + svgNodeRef, + bgRectNodeRef, + attributesNodeRef, + linesNodeRef, + highlightedNodeRef, + drawAxisLines: { x: false, y: false }, + drawAxisLabels: { x: false, y: false }, + }); + } + + if (trendlineOptions.isApplied) { + drawScatterTrendline({ + index, + nameKey, + data, + type: trendlineOptions.type, + bandwidth: trendlineOptions.bandwidth, + xScale, + yScale, + targetRef: linesNodeRef, + }); + } + + drawUnableToRender({ + renderArr: unableToDrawConditions, + visAreaRef, + attributesRef, + readOnly, + syncHoverState, + }); + } + + function renderChart() { + clearArea({ visAreaRef }); + draw(); + } + + const resizeObserverCallback: ResizeObserverCallback = React.useCallback( + (entries: ResizeObserverEntry[]) => { + if (entries?.length) { + rafIDRef.current = window.requestAnimationFrame(renderChart); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + updateDeps, + ); + + const observerReturnCallback = React.useCallback(() => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }, []); + + useResizeObserver(resizeObserverCallback, parentRef, observerReturnCallback); + + React.useEffect(() => { + rafIDRef.current = window.requestAnimationFrame(renderChart); + return () => { + if (rafIDRef.current) { + window.cancelAnimationFrame(rafIDRef.current); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, updateDeps); + + React.useEffect(() => { + if (typeof onMount === 'function') { + onMount(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useImperativeHandle(ref, () => ({ + setActiveLineAndCircle: ( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => { + attributesRef.current.setActiveLineAndCircle?.( + lineKey, + focusedStateActive, + force, + ); + }, + updateHoverAttributes: (xValue: number, dataSelector?: string) => { + attributesRef.current.updateHoverAttributes?.(xValue, dataSelector); + }, + clearHoverAttributes: () => { + attributesRef.current.clearHoverAttributes?.(); + }, + setFocusedState: (focusedState: IFocusedState) => { + if (focusedState) { + attributesRef.current.focusedState = { + ...focusedState, + visId: focusedState.visId ?? `${focusedState.chartIndex}`, + }; + } + }, + })); + + return ( + +
+
+
+ + ); +}); + +ScatterPlot.displayName = 'ScatterPlot'; + +export default React.memo(ScatterPlot); diff --git a/src/src/components/ScatterPlot/index.ts b/src/src/components/ScatterPlot/index.ts new file mode 100644 index 00000000..9c176f70 --- /dev/null +++ b/src/src/components/ScatterPlot/index.ts @@ -0,0 +1,6 @@ +import ScatterPlot from './ScatterPlot'; + +export * from './types.d'; +export * from './ScatterPlot'; + +export default ScatterPlot; diff --git a/src/src/components/ScatterPlot/styles.scss b/src/src/components/ScatterPlot/styles.scss new file mode 100644 index 00000000..870efc9b --- /dev/null +++ b/src/src/components/ScatterPlot/styles.scss @@ -0,0 +1,98 @@ +@use 'src/styles/abstracts' as *; + +.ScatterPlot { + background-color: white; + height: 100%; + width: 100%; + position: relative; + overflow: hidden; + user-select: none; + min-width: toRem(150px); + min-height: toRem(150px); + .unableToDrawText { + font-size: $text-md; + text-align: center; + fill: $grey; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 80%; + } + &.backgroundRect { + cursor: crosshair; + } + &.zoomMode rect { + cursor: zoom-in; + } + .HoverCircle { + cursor: pointer; + opacity: 1; + stroke-width: 3; + fill: white; + border-radius: 50%; + paint-order: stroke; + /* on click */ + &.focus { + stroke-width: 4; + clip-path: unset; + &__shadow { + stroke-width: 12; + } + } + /* on hover */ + &.active { + stroke-width: 5; + } + } + .Attributes { + &.highlight > .HoverCircle:not(.active):not(.focus) { + opacity: 0.5; + } + } + .ChartMouseValue { + position: absolute; + box-sizing: border-box; + padding: $space-xxs $space-xs; + background-color: $primary-bg; + border: 1px solid $primary-light; + color: $primary-dark; + font-size: 10px; + font-weight: $font-400; + white-space: nowrap; + } + .ChartMouseValueXAxis { + transform: translateX(-50%); + border-radius: 0 0 6px 6px; + border-top: none; + overflow: hidden; + } + .ChartMouseValueYAxis { + transform: translateY(-50%); + border-radius: 6px 0 0 6px; + border-right: none; + overflow: hidden; + box-shadow: inset -8px 0 5px -6px #3b5896; /* var(--primary);*/ + } + .Lines { + overflow: hidden; + &.highlight > .Circle:not(.active):not(.highlighted) { + opacity: 0.2; + } + } + .Circle { + cursor: pointer; + opacity: 1; + stroke-width: 2.4; + fill: white; + outline: 0 solid; + border-radius: 50%; + paint-order: stroke; + &.active { + stroke-width: 5; + } + &.highlighted { + opacity: 1; + } + } +} diff --git a/src/src/components/ScatterPlot/types.d.ts b/src/src/components/ScatterPlot/types.d.ts new file mode 100644 index 00000000..8a23c904 --- /dev/null +++ b/src/src/components/ScatterPlot/types.d.ts @@ -0,0 +1,33 @@ +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { IChartTitle } from 'types/services/models/metrics/metricsAppModel'; +import { ITrendlineOptions } from 'types/services/models/scatter/scatterAppModel'; +import { ISyncHoverStateArgs } from 'types/utils/d3/drawHoverAttributes'; +import { IDimensionType } from 'types/utils/d3/drawParallelAxes'; +import { IRun } from 'types/services/models/metrics/runModel'; + +export interface IPoint { + key: string; + data: { + xValues: number[] | string[]; + yValues: number[] | string[]; + }; + color: string; + groupKey: string; + chartIndex?: number; + run?: IRun; +} + +export interface IScatterPlotProps { + index: number; + id?: string; + nameKey?: string; + data: { dimensions: IDimensionType[]; data: IPoint[] }; + chartTitle?: IChartTitle; + trendlineOptions: ITrendlineOptions; + syncHoverState: (args: ISyncHoverStateArgs) => void; + resizeMode?: ResizeModeEnum; + onMount?: () => void; + readOnly?: boolean; + margin?: { top: number; right: number; bottom: number; left: number }; +} diff --git a/src/src/components/SelectTag/SelectTag.scss b/src/src/components/SelectTag/SelectTag.scss new file mode 100644 index 00000000..dc4db4cf --- /dev/null +++ b/src/src/components/SelectTag/SelectTag.scss @@ -0,0 +1,87 @@ +@use 'src/styles/abstracts' as *; + +.SelectTag { + max-width: 20rem; + width: 20rem; + max-height: 240px; + display: flex; + flex-direction: column; + &__searchBarContainer { + padding: $space-xs; + } + &__tags { + overflow: auto; + max-height: 200px; + flex: 1 1; + .icon-check { + padding: 0; + } + + &__item { + display: flex; + width: 100%; + max-width: 100%; + border-bottom: $border-main; + padding: $space-xs toRem(25px) $space-xs toRem(30px); + position: relative; + cursor: pointer; + &:hover { + background-color: $cuddle-20; + } + &:last-child { + border-bottom: $border-transparent; + } + &__checkedIcon { + position: absolute; + left: toRem(10px); + top: $space-xs; + } + &__deleteButton { + position: absolute; + right: toRem(10px); + top: $space-xxs; + } + &__content { + display: flex; + max-width: 100%; + flex-direction: column; + width: 100%; + padding-right: $space-xxxs; + + &__nameWrapper { + display: flex; + align-items: flex-start; + &__name { + word-break: break-all; + } + &__colorBadge { + width: toRem(14px); + min-width: toRem(14px); + height: toRem(14px); + display: block; + border-radius: $border-radius-circle; + margin-right: $space-xxxs; + } + } + + &__description { + margin-top: $space-xxxxs; + word-break: break-all; + } + } + } + } + + &__noTags { + padding: 1rem 0; + display: flex; + justify-content: center; + flex: 1; + align-items: center; + } + + &__createTag__container { + padding: $space-xs $space-unit; + text-align: center; + } +} diff --git a/src/src/components/SelectTag/SelectTag.tsx b/src/src/components/SelectTag/SelectTag.tsx new file mode 100644 index 00000000..36ec04b1 --- /dev/null +++ b/src/src/components/SelectTag/SelectTag.tsx @@ -0,0 +1,245 @@ +import React from 'react'; +import _ from 'lodash-es'; +import { Link as RouteLink } from 'react-router-dom'; + +import { Divider, Link } from '@material-ui/core'; + +import { Text, Button, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import SearchInput from 'components/kit/DataList/SearchBar/SearchInput'; + +import { PathEnum } from 'config/enums/routesEnum'; + +import tagsService from 'services/api/tags/tagsService'; +import runsService from 'services/api/runs/runsService'; + +import { ISelectTagProps } from 'types/components/SelectTag/SelectTag'; +import { ITagInfo, ITagInfoWithSelectedProperty } from 'types/pages/tags/Tags'; + +import './SelectTag.scss'; + +function SelectTag({ + runHash, + attachedTags, + setAttachedTags, + onRunsTagsChange, + updatePopover, +}: ISelectTagProps): JSX.Element { + const [tags, setTags] = React.useState([]); + const [searchValue, setSearchValue] = React.useState(''); + const [sortedTags, setSortedTags] = React.useState< + ITagInfoWithSelectedProperty[] + >([]); + const getTagsRef = React.useRef(null); + const attachTagToRunRef = React.useRef(null); + const deleteRunsTagRef = React.useRef(null); + + const addSelectedPropertyToTags = function ( + tags: ITagInfo[], + ): ITagInfoWithSelectedProperty[] { + return tags.map((tag: ITagInfo) => { + const selected = !!attachedTags.find( + (attachedTag) => attachedTag.id === tag.id, + ); + return { ...tag, selected }; + }); + }; + + const deleteRunsTag = React.useCallback( + (run_id: string, tag: ITagInfo): void => { + deleteRunsTagRef.current = runsService?.deleteRunsTag(run_id, tag.id); + deleteRunsTagRef.current.call(); + }, + [], + ); + + const onAttachedTagDelete = React.useCallback( + (e): void => { + const tag_id = e.currentTarget?.id; + const tag = attachedTags.find((tag) => tag.id === tag_id); + if (tag) { + const resultTags: ITagInfo[] = attachedTags.filter( + (t) => tag.id !== t.id, + ); + setAttachedTags(resultTags); + deleteRunsTag(runHash, tag); + onRunsTagsChange && onRunsTagsChange(runHash, resultTags); + setSortedTags((sT) => + sT.map((tag: ITagInfoWithSelectedProperty) => { + if (tag.id === tag_id) { + return { ...tag, selected: false }; + } + return tag; + }), + ); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [onRunsTagsChange, setAttachedTags, attachedTags, deleteRunsTag, runHash], + ); + + const attachTagToRun = React.useCallback((tag: ITagInfo, run_id: string) => { + attachTagToRunRef.current = runsService?.attachRunsTag( + { tag_name: tag.name }, + run_id, + ); + attachTagToRunRef.current.call(); + }, []); + + const onAttachedTagAdd = React.useCallback( + (e: React.MouseEvent): void => { + const tag_id = e.currentTarget?.id; + if (!attachedTags.find((tag) => tag.id === tag_id)) { + const tag = tags.find((tag) => tag.id === tag_id); + if (tag) { + setAttachedTags((prevState) => [...prevState, tag]); + attachTagToRun(tag, runHash); + onRunsTagsChange && onRunsTagsChange(runHash, [...attachedTags, tag]); + setSortedTags((sT) => + sT.map((tag: ITagInfoWithSelectedProperty) => { + if (tag.id === tag_id) { + return { ...tag, selected: true }; + } + return tag; + }), + ); + } + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [ + attachedTags, + attachTagToRun, + runHash, + setAttachedTags, + tags, + onRunsTagsChange, + ], + ); + + React.useEffect(() => { + if (runHash) { + getTagsRef.current = tagsService?.getTags(); + getTagsRef.current?.call().then((tags: ITagInfo[]) => { + setSortedTags( + tags + ? _.orderBy( + addSelectedPropertyToTags(tags), + ['selected', 'name'], + ['desc', 'asc'], + ) + : [], + ); + setTags(tags ?? []); + if (updatePopover) { + updatePopover(`${Date.now()}`); + } + }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [runHash]); + + const filteredTagsList = React.useMemo(() => { + if (searchValue) { + return sortedTags.filter((tag) => + tag.name.toLowerCase().includes(searchValue.toLowerCase()), + ); + } + return sortedTags; + }, [searchValue, sortedTags]); + + React.useEffect(() => { + return () => { + getTagsRef.current?.abort(); + attachTagToRunRef.current?.abort(); + deleteRunsTagRef.current?.abort(); + }; + }, []); + + return ( + +
+
+ setSearchValue('')} + onInputChange={(value) => setSearchValue(value)} + isDisabled={_.isEmpty(sortedTags)} + isValidInput={true} + /> +
+ + {filteredTagsList?.length > 0 ? ( +
+ {filteredTagsList.map((tag: ITagInfoWithSelectedProperty) => { + return ( +
+ tag.selected ? onAttachedTagDelete(e) : onAttachedTagAdd(e) + } + > + {tag.selected && ( + + )} +
+
+ + + {tag.name} + +
+ {tag.description ? ( + + {tag.description} + + ) : null} +
+
+ ); + })} +
+ ) : ( +
+ + No Tags Found + +
+ )} + +
+ + + +
+
+
+ ); +} + +export default React.memo(SelectTag); diff --git a/src/src/components/SideBar/SideBar.tsx b/src/src/components/SideBar/SideBar.tsx new file mode 100644 index 00000000..e94ab360 --- /dev/null +++ b/src/src/components/SideBar/SideBar.tsx @@ -0,0 +1,120 @@ +import React from 'react'; +import { NavLink } from 'react-router-dom'; + +import { Drawer, Tooltip } from '@material-ui/core'; + +import logoImg from 'assets/logo.svg'; +import { ReactComponent as DiscordIcon } from 'assets/icons/discord.svg'; + +import { Icon, Text } from 'components/kit'; +import { IconName } from 'components/kit/Icon'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import CommunityPopup from 'components/CommunityPopup'; + +import { PathEnum } from 'config/enums/routesEnum'; +import { AIM_VERSION } from 'config/config'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DOCUMENTATIONS } from 'config/references'; + +import routes, { IRoute } from 'routes/routes'; + +import { trackEvent } from 'services/analytics'; + +import { getItem } from 'utils/storage'; + +import './Sidebar.scss'; + +function SideBar(): React.FunctionComponentElement { + function getPathFromStorage(route: PathEnum): PathEnum | string { + const path = getItem(`${route.slice(1)}Url`) ?? ''; + if (path !== '' && path.startsWith(route)) { + return path; + } + return route; + } + + return ( + +
+ +
    + +
  • + logo +
  • +
    +
    + {Object.values(routes).map((route: IRoute, index: number) => { + const { showInSidebar, path, displayName, icon } = route; + return ( + showInSidebar && ( + getPathFromStorage(path)} + exact={true} + isActive={(m, location) => + location.pathname.split('/')[1] === path.split('/')[1] + } + activeClassName='Sidebar__NavLink--active' + className='Sidebar__NavLink' + > +
  • + + + {displayName} + +
  • +
    + ) + ); + })} +
    +
+ +
+
+
+ ); +} + +export default React.memo(SideBar); diff --git a/src/src/components/SideBar/Sidebar.scss b/src/src/components/SideBar/Sidebar.scss new file mode 100644 index 00000000..7cb3f4a0 --- /dev/null +++ b/src/src/components/SideBar/Sidebar.scss @@ -0,0 +1,105 @@ +@use 'src/styles/abstracts' as *; + +.Sidebar { + width: 75px; + max-width: 75px; + position: relative; + z-index: 10; + .MuiDrawer-paperAnchorDockedLeft { + border-right: unset; + } + .MuiDrawer-paper { + top: unset; + } + &__Paper { + background-color: #1d2253; + width: 75.6px; + overflow: hidden; + } + &__List { + flex: 1 100%; + padding: 0; + overflow: hidden; + display: flex; + flex-direction: column; + &__container { + overflow: hidden auto; + } + &__item { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: 80px; + padding: 0.5rem; + img { + width: 2.25rem; + margin: auto; + } + &--icon { + color: #fff; + } + &--text { + margin-top: 6px; + font-size: 0.7rem; + font-style: normal; + font-weight: $font-500; + color: #fff; + } + } + } + &__NavLink { + position: relative; + text-decoration: none; + &--active { + display: block; + &:before { + content: ''; + position: absolute; + top: 20px; + left: 0px; + height: 40px; + width: 3px; + background-color: #ffff; + border-radius: 0 0.375rem 0.375rem 0; + } + } + } + &__bottom { + padding-top: $space-xxxs; + position: relative; + padding-bottom: $space-md; + display: flex; + flex-direction: column; + &__anchor { + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: $text-xxl; + text-align: center; + color: $pico-20; + text-decoration: none; + height: toRem(44px); + transition: color 0.18s ease-out; + &:hover { + color: $white; + svg { + fill: $white; + } + } + } + &::before { + content: ''; + width: toRem(40px); + left: calc(50% - 1.25rem); + border-top: 1px solid $pico-70; + position: absolute; + top: 0; + } + & > span { + text-align: center; + margin-top: $space-xs; + } + } +} diff --git a/src/src/components/SliderWithInput/SliderWithInput.scss b/src/src/components/SliderWithInput/SliderWithInput.scss new file mode 100644 index 00000000..ec72ba89 --- /dev/null +++ b/src/src/components/SliderWithInput/SliderWithInput.scss @@ -0,0 +1,86 @@ +@use 'src/styles/abstracts' as *; + +.SliderWithInput { + display: flex; + align-items: center; + height: 100%; + max-width: toRem(520px); + width: 100%; + &__densityWrapper { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + &__densityField { + width: 5.375rem; + height: 1.25rem; + border: 0.0625rem solid $cuddle-70; + border-radius: $border-radius-xss; + font-size: 0.625rem; + font-weight: $font-600; + color: $pico-80; + padding-left: 0.375rem; + /* Chrome, Safari, Edge, Opera */ + &::-webkit-outer-spin-button, + &::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + + /* Firefox */ + &[type='number'] { + -moz-appearance: textfield; + } + &:focus-visible { + outline: unset; + } + } + &__densityTitleBox { + display: flex; + &__labelTooltip { + background-color: $pico-70; + width: 0.6875rem; + height: 0.6875rem; + color: $white; + font-size: 0.4375rem; + display: flex; + align-items: center; + justify-content: center; + border-radius: $border-radius-circle; + margin-top: 0.0625rem; + cursor: pointer; + } + &__densityFieldLabel { + margin-right: 0.16rem; + min-width: 4.4rem; + margin-bottom: 0.1875rem; + } + } + } + &__sliderWrapper { + max-width: 24.875rem; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; + margin-right: 2rem; + padding-bottom: toRem(8px); + .Slider { + padding-bottom: toRem(3px); + } + &__sliderTitleBox { + line-height: toRem(18px); + } + &__title { + margin-right: 0.25rem; + font-size: $text-xxs; + font-weight: $font-400; + color: $pico-70; + } + &__sliderValuesLabel { + width: 4.875rem; + margin-right: 0.5rem; + } + } +} diff --git a/src/src/components/SliderWithInput/SliderWithInput.tsx b/src/src/components/SliderWithInput/SliderWithInput.tsx new file mode 100644 index 00000000..74b5f6ad --- /dev/null +++ b/src/src/components/SliderWithInput/SliderWithInput.tsx @@ -0,0 +1,118 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import { Text, Slider, InputWrapper } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ISliderWithInputProps } from './types.d'; + +import './SliderWithInput.scss'; + +/** + * @property {string} sliderTitle - title of slider + * @property {string} countInputTitle - title of count input + * @property {number} selectedRangeValue - selected range value + * @property {number} selectedCountValue - selected input value + * @property {function} onSearch - search method + * @property {function} onCountChange - count change method + * @property {function} onRangeChange - range change method + * @property {number} min - minimum range value + * @property {number} max - maximum range value + * @property {string} sliderTitleTooltip - tooltip value of slider title + * @property {string} countTitleTooltip - tooltip value of count title + */ + +function SliderWithInput({ + sliderTitle, + countInputTitle, + selectedRangeValue, + selectedCountValue, + onSearch, + onCountChange, + onRangeChange, + min, + max, + sliderTitleTooltip, + countTitleTooltip, + sliderType = 'range', + inputValidationPatterns, +}: ISliderWithInputProps): React.FunctionComponentElement { + return ( + +
+
+
+ {sliderTitleTooltip ? ( + + + {sliderTitle}: + + + ) : ( + + {sliderTitle}: + + )} + {`${selectedRangeValue[0]} - ${selectedRangeValue[1]}`} +
+ {sliderType === 'single' ? ( + { + onCountChange(value); + }} + getAriaValueText={(value) => `${value}`} + aria-labelledby='track-false-slider' + track={false} + min={selectedRangeValue[0]} + max={selectedRangeValue[1]} + valueLabelDisplay='auto' + /> + ) : ( + onRangeChange(value)) as any} + min={min} + max={max} + valueLabelDisplay='auto' + getAriaValueText={(value) => `${value}`} + onKeyPress={(e) => { + if (e.which === 13) { + onSearch(); + } + }} + /> + )} +
+
+ { + onCountChange(value, metadata); + }} + validationPatterns={inputValidationPatterns ?? []} + /> +
+
+
+ ); +} + +SliderWithInput.displayName = 'SliderWithInput'; + +export default React.memo(SliderWithInput); diff --git a/src/src/components/SliderWithInput/index.ts b/src/src/components/SliderWithInput/index.ts new file mode 100644 index 00000000..d17dddb0 --- /dev/null +++ b/src/src/components/SliderWithInput/index.ts @@ -0,0 +1,5 @@ +import SliderWithInput from './SliderWithInput'; + +export * from './types.d'; + +export default SliderWithInput; diff --git a/src/src/components/SliderWithInput/types.d.ts b/src/src/components/SliderWithInput/types.d.ts new file mode 100644 index 00000000..1c37cc64 --- /dev/null +++ b/src/src/components/SliderWithInput/types.d.ts @@ -0,0 +1,17 @@ +import { IValidationMetadata } from 'components/kit/Input'; + +export interface ISliderWithInputProps { + sliderTitle: string; + countInputTitle: string; + sliderTitleTooltip?: string; + countTitleTooltip?: string; + min: number; + max: number; + selectedRangeValue: number[]; + selectedCountValue: number; + sliderType?: 'range' | 'single'; + onSearch: () => void; + onCountChange: (value: number, metadata?: IValidationMetadata) => void; + onRangeChange: (newValue: number[] | number) => void; + inputValidationPatterns?: IValidationPatterns; +} diff --git a/src/src/components/SmoothingPopover/SmoothingPopover.scss b/src/src/components/SmoothingPopover/SmoothingPopover.scss new file mode 100644 index 00000000..6f844324 --- /dev/null +++ b/src/src/components/SmoothingPopover/SmoothingPopover.scss @@ -0,0 +1,21 @@ +@use 'src/styles/abstracts' as *; + +.SmoothingPopover { + width: 24.5rem; + padding: $space-xs; + &__Divider { + margin: $space-xs 0; + } + + &__subtitle { + text-transform: uppercase; + padding: $space-xs $space-xs; + } + &__ToggleButton { + padding: 0 $space-xs; + } + + &__Slider { + margin: 0 $space-xs; + } +} diff --git a/src/src/components/SmoothingPopover/SmoothingPopover.tsx b/src/src/components/SmoothingPopover/SmoothingPopover.tsx new file mode 100644 index 00000000..4bcd30cf --- /dev/null +++ b/src/src/components/SmoothingPopover/SmoothingPopover.tsx @@ -0,0 +1,159 @@ +import React from 'react'; + +import { Divider, MenuItem, Slider } from '@material-ui/core'; + +import { Text, ToggleButton } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import { ISmoothingPopoverProps } from 'types/components/SmoothingPopover/SmoothingPopover'; + +import { SmoothingAlgorithmEnum } from 'utils/smoothingData'; +import { CurveEnum } from 'utils/d3'; + +import './SmoothingPopover.scss'; + +const emaProps = { + marks: [ + { value: 0, label: '0' }, + { value: 0.25, label: '0.25' }, + { value: 0.5, label: '0.5' }, + { value: 0.75, label: '0.75' }, + { value: 0.99, label: '0.99' }, + ], + step: 0.01, + min: 0, + max: 0.99, + default: CONTROLS_DEFAULT_CONFIG.metrics.smoothing.factor, +}; + +const cmaProps = { + marks: [ + { value: 1, label: '1' }, + { value: 25, label: '25' }, + { value: 51, label: '51' }, + { value: 75, label: '75' }, + { value: 99, label: '99' }, + ], + step: 2, + min: 1, + max: 99, + default: 59, +}; + +function SmoothingPopover( + props: ISmoothingPopoverProps, +): React.FunctionComponentElement { + const [factor, setFactor] = React.useState(props.smoothing.factor); + + const handleAlgorithmChange = React.useCallback( + (event): void => { + const factorMin: number = + event.target.id === SmoothingAlgorithmEnum.EMA + ? emaProps.default + : cmaProps.default; + setFactor(factorMin); + props.onSmoothingChange({ + algorithm: event.target.id, + factor: factorMin, + }); + }, + [props], + ); + + function handleFactorChange( + event: React.ChangeEvent, + val: number | any, + ): void { + if (val !== factor) { + setFactor(val); + } + } + + function handleInterpolation(value: CurveEnum, id: string | number): void { + props.onSmoothingChange({ + curveInterpolation: value, + }); + } + + function handleSmoothingData( + ev: React.ChangeEvent, + value: number | any, + ): void { + props.onSmoothingChange({ + factor: value, + }); + } + + const sliderProps = React.useMemo(() => { + return props.smoothing.algorithm === SmoothingAlgorithmEnum.EMA + ? emaProps + : cmaProps; + }, [props.smoothing.algorithm]); + + return ( + +
+
+ + Chart Smoothing + +
+ `${val}s`} + value={factor} + onChange={handleFactorChange} + onChangeCommitted={handleSmoothingData} + marks={sliderProps.marks} + step={sliderProps.step} + max={sliderProps.max} + min={sliderProps.min} + /> +
+
+ + Exponential Moving Average + + + Centred Moving Average + +
+
+ +
+ + Curve Interpolation method + + +
+
+
+ ); +} + +export default React.memo(SmoothingPopover); diff --git a/src/src/components/SplitPane/SplitPane.d.ts b/src/src/components/SplitPane/SplitPane.d.ts new file mode 100644 index 00000000..173d8182 --- /dev/null +++ b/src/src/components/SplitPane/SplitPane.d.ts @@ -0,0 +1,6 @@ +import { SplitProps } from 'react-split'; + +interface SplitPaneProps extends SplitProps { + resizing?: boolean; + useLocalStorage?: boolean; +} diff --git a/src/src/components/SplitPane/SplitPane.scss b/src/src/components/SplitPane/SplitPane.scss new file mode 100644 index 00000000..acc7601e --- /dev/null +++ b/src/src/components/SplitPane/SplitPane.scss @@ -0,0 +1,42 @@ +@use 'src/styles/abstracts' as *; + +.SplitPane { + display: flex; + width: 100%; + height: 100%; + .gutter { + transition: all 0.15s ease-out 0.2s; + background-color: white; + } + &.horizontal { + flex-direction: row; + .gutter-horizontal { + cursor: col-resize; + box-shadow: inset 2px 0 0 0 $primary-color-20; + &:hover, &:active { + background-color: $primary-color-50; + box-shadow: unset; + } + } + .SplitPaneItem { + overflow-x: auto; + } + } + &.vertical { + flex-direction: column; + .gutter-vertical { + cursor: row-resize; + box-shadow: inset 0 2px 0 0 $primary-color-20; + &:hover, &:active { + background-color: $primary-color-50; + box-shadow: unset; + } + } + .SplitPaneItem { + overflow-y: auto; + } + } + &.hide { + visibility: hidden; + } +} diff --git a/src/src/components/SplitPane/SplitPane.tsx b/src/src/components/SplitPane/SplitPane.tsx new file mode 100644 index 00000000..6477775f --- /dev/null +++ b/src/src/components/SplitPane/SplitPane.tsx @@ -0,0 +1,93 @@ +import * as React from 'react'; +import Split from 'react-split'; +import classNames from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { SplitPaneProps, SplitPaneContext } from '.'; + +import './SplitPane.scss'; + +function SplitPane(props: SplitPaneProps) { + const { + id = '', + sizes, + children, + resizing, + direction = 'horizontal', + gutterSize = 4, + className = '', + onDragStart, + onDragEnd, + useLocalStorage = false, + ...rest + } = props; + const [resizingPane, setResizingPane] = React.useState(false); + + const onResizeStart = React.useCallback( + (startSizes: number[]) => { + setResizingPane(true); + if (typeof onDragStart === 'function') { + onDragStart(startSizes); + } + }, + [onDragStart], + ); + + const onResizeEnd = React.useCallback( + (endSizes: number[]) => { + setResizingPane(false); + if (typeof onDragEnd === 'function') { + onDragEnd(endSizes); + } + if (useLocalStorage) { + localStorage.setItem(`${id}-panesSizes`, JSON.stringify(endSizes)); + } + }, + [onDragEnd, id, useLocalStorage], + ); + + const getSizes = React.useCallback( + (useLocalStorage: boolean, id: string, sizes?: number[]) => { + if (useLocalStorage) { + const savedSizes = localStorage.getItem(`${id}-panesSizes`); + if (savedSizes) { + return JSON.parse(savedSizes); + } + } + return sizes; + }, + [], + ); + + React.useEffect(() => { + if (typeof resizing === 'boolean') { + setResizingPane(resizing); + } + }, [resizing]); + + return ( + + + + {children} + + + + ); +} + +SplitPane.displayName = 'SplitPane'; + +export default SplitPane; diff --git a/src/src/components/SplitPane/SplitPaneItem.d.ts b/src/src/components/SplitPane/SplitPaneItem.d.ts new file mode 100644 index 00000000..fb842562 --- /dev/null +++ b/src/src/components/SplitPane/SplitPaneItem.d.ts @@ -0,0 +1,7 @@ +import * as React from 'react'; + +export interface SplitPaneItemProps extends React.HTMLAttributes { + resizingFallback?: React.ReactNode; + children: React.ReactNode | ((resizing: boolean) => React.ReactNode); + hide?: boolean; +} diff --git a/src/src/components/SplitPane/SplitPaneItem.tsx b/src/src/components/SplitPane/SplitPaneItem.tsx new file mode 100644 index 00000000..23ee3a18 --- /dev/null +++ b/src/src/components/SplitPane/SplitPaneItem.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import classNames from 'classnames'; + +import { SplitPaneContext, SplitPaneItemProps } from '.'; + +const SplitPaneItem = React.forwardRef(function SplitPaneItem( + props: SplitPaneItemProps, + ref?: React.LegacyRef, +) { + const { + children, + className = '', + resizingFallback = null, + hide = false, + } = props; + const { resizing } = React.useContext(SplitPaneContext); + + const childrenElement = React.useMemo(() => { + return typeof children === 'function' ? children(resizing) : children; + }, [children, resizing]); + return ( +
+ {hide + ? null + : resizing && resizingFallback + ? resizingFallback + : childrenElement} +
+ ); +}); + +SplitPaneItem.displayName = 'SplitPaneItem'; + +export default SplitPaneItem; diff --git a/src/src/components/SplitPane/context.ts b/src/src/components/SplitPane/context.ts new file mode 100644 index 00000000..3e28b619 --- /dev/null +++ b/src/src/components/SplitPane/context.ts @@ -0,0 +1,7 @@ +import * as React from 'react'; + +const SplitPaneContext = React.createContext({ + resizing: false, +}); + +export default SplitPaneContext; diff --git a/src/src/components/SplitPane/index.ts b/src/src/components/SplitPane/index.ts new file mode 100644 index 00000000..302ff852 --- /dev/null +++ b/src/src/components/SplitPane/index.ts @@ -0,0 +1,10 @@ +import SplitPane from './SplitPane'; +import SplitPaneItem from './SplitPaneItem'; +import SplitPaneContext from './context'; + +export * from './SplitPane.d'; +export * from './SplitPaneItem.d'; + +export { SplitPaneItem, SplitPaneContext }; + +export default SplitPane; diff --git a/src/src/components/StatisticsBar/StatisticsBar.d.ts b/src/src/components/StatisticsBar/StatisticsBar.d.ts new file mode 100644 index 00000000..a55fbea7 --- /dev/null +++ b/src/src/components/StatisticsBar/StatisticsBar.d.ts @@ -0,0 +1,20 @@ +type StatisticsBarItem = { + percent: number; + color: string; + label?: string; + highlighted?: boolean; +}; + +export interface IStatisticsBarProps { + data: Array; + width?: number | string; + height?: number | string; + onMouseOver?: (id: string, source: string) => void; + onMouseLeave?: () => void; +} + +export interface IBarStyle { + width: string; + left: number; + backgroundColor: string; +} diff --git a/src/src/components/StatisticsBar/StatisticsBar.scss b/src/src/components/StatisticsBar/StatisticsBar.scss new file mode 100644 index 00000000..641a6155 --- /dev/null +++ b/src/src/components/StatisticsBar/StatisticsBar.scss @@ -0,0 +1,27 @@ +@use 'src/styles/abstracts' as *; + +.StatisticsBar { + position: relative; + background-color: $pico-2; + border-radius: $border-radius-sm; + &__item { + display: inline-flex; + height: 100%; + position: absolute; + transition: all 0.18s ease-out; + &:first-child { + border-top-left-radius: $border-radius-sm; + border-bottom-left-radius: $border-radius-sm; + } + &:last-child { + border-top-right-radius: $border-radius-sm; + border-bottom-right-radius: $border-radius-sm; + } + &.highlighted { + z-index: 1; + height: calc(100% + 2px); + margin-top: -1px; + box-shadow: 0 0 0 2px white; + } + } +} diff --git a/src/src/components/StatisticsBar/StatisticsBar.tsx b/src/src/components/StatisticsBar/StatisticsBar.tsx new file mode 100644 index 00000000..66c91ca1 --- /dev/null +++ b/src/src/components/StatisticsBar/StatisticsBar.tsx @@ -0,0 +1,61 @@ +import * as React from 'react'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import { IBarStyle, IStatisticsBarProps } from '.'; + +import './StatisticsBar.scss'; + +function StatisticsBar({ + data = [], + width = '100%', + height = 8, + onMouseOver, + onMouseLeave, +}: IStatisticsBarProps) { + const onSafeMouseOver = React.useCallback( + (id: string) => { + if (typeof onMouseOver === 'function') { + onMouseOver(id, 'bar'); + } + }, + [onMouseOver], + ); + const barStyles = React.useMemo(() => { + const styles: IBarStyle[] = []; + for (let i = 0; i < data.length; i++) { + const item = data[i]; + const prevItemLeftPos = styles[i - 1]?.left || 0; + const prevItemPercent = data[i - 1]?.percent || 0; + const style = { + width: `${item.percent.toFixed(2)}%`, + left: i === 0 ? 0 : prevItemLeftPos + prevItemPercent, + backgroundColor: item.color, + }; + styles.push(style); + } + return styles; + }, [data]); + return ( +
+ {Object.values(data).map( + ({ percent, color, label = '', highlighted }, i) => + percent ? ( + +
onSafeMouseOver(label)} + /> + + ) : null, + )} +
+ ); +} + +StatisticsBar.displayName = 'StatisticsBar'; + +export default React.memo(StatisticsBar); diff --git a/src/src/components/StatisticsBar/index.ts b/src/src/components/StatisticsBar/index.ts new file mode 100644 index 00000000..353e7bbd --- /dev/null +++ b/src/src/components/StatisticsBar/index.ts @@ -0,0 +1,5 @@ +import StatisticsBar from './StatisticsBar'; + +export * from './StatisticsBar.d'; + +export default StatisticsBar; diff --git a/src/src/components/StatisticsCard/StatisticsCard.d.ts b/src/src/components/StatisticsCard/StatisticsCard.d.ts new file mode 100644 index 00000000..b9c7f069 --- /dev/null +++ b/src/src/components/StatisticsCard/StatisticsCard.d.ts @@ -0,0 +1,18 @@ +import * as React from 'react'; + +import { IconName } from 'components/kit/Icon'; + +export interface IStatisticsCardProps { + label: string; + count: number; + badge?: { value: string; style?: React.CSSProperties }; + icon?: IconName; + iconBgColor?: string; + cardBgColor?: string; + onMouseOver?: (id: string, source: string) => void; + onMouseLeave?: () => void; + navLink?: string; + highlighted?: boolean; + outlined?: boolean; + isLoading?: boolean; +} diff --git a/src/src/components/StatisticsCard/StatisticsCard.scss b/src/src/components/StatisticsCard/StatisticsCard.scss new file mode 100644 index 00000000..34ddbbc0 --- /dev/null +++ b/src/src/components/StatisticsCard/StatisticsCard.scss @@ -0,0 +1,55 @@ +@use 'src/styles/abstracts' as *; + +.StatisticsCard { + padding: $space-xs; + display: inline-flex; + align-items: center; + justify-content: flex-start; + border-radius: $border-radius-sm; + min-width: toRem(132px); + max-width: toRem(132px); + border: $border-transparent; + transition: all 0.18s ease-out; + position: relative; + &__iconWrapper { + width: 2rem; + min-width: 2rem; + height: 2rem; + border-radius: 50%; + margin-right: $space-xs; + display: inline-flex; + align-items: center; + justify-content: center; + } + &__info { + display: flex; + flex-direction: column; + overflow: hidden; + &__label, + &__count { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + color: $pico; + user-select: none; + } + &__label { + text-transform: capitalize; + } + } + &__badge { + position: absolute; + top: -$space-xs; + right: -$space-xxs; + text-align: center; + white-space: nowrap; + padding: $space-xxxxxs $space-xxxs; + border-radius: $border-radius-xss; + background-color: white; + box-shadow: 0 1px 2px 0 #00000029; + user-select: none; + } + &.highlighted { + cursor: pointer; + } +} diff --git a/src/src/components/StatisticsCard/StatisticsCard.tsx b/src/src/components/StatisticsCard/StatisticsCard.tsx new file mode 100644 index 00000000..fec0f021 --- /dev/null +++ b/src/src/components/StatisticsCard/StatisticsCard.tsx @@ -0,0 +1,96 @@ +import * as React from 'react'; +import { useHistory } from 'react-router-dom'; +import classNames from 'classnames'; + +import { Icon, Text } from 'components/kit'; + +import hexToRgbA from 'utils/hexToRgbA'; + +import { IStatisticsCardProps } from './index'; + +import './StatisticsCard.scss'; + +function StatisticsCard({ + label, + badge = { value: '' }, + count, + icon, + iconBgColor = '#000000', + cardBgColor = hexToRgbA(iconBgColor, 0.1), + onMouseOver, + onMouseLeave, + navLink, + highlighted, + outlined = false, + isLoading = false, +}: IStatisticsCardProps) { + const history = useHistory(); + const onSafeMouseOver = React.useCallback( + (id: string) => { + if (typeof onMouseOver === 'function') { + onMouseOver(id, 'card'); + } + }, + [onMouseOver], + ); + const styles = { + card: { + borderColor: outlined ? iconBgColor : 'transparent', + backgroundColor: highlighted ? iconBgColor : cardBgColor, + }, + iconWrapper: { + backgroundColor: highlighted ? '#fff' : iconBgColor, + }, + iconColor: highlighted ? iconBgColor : '#fff', + label: highlighted ? { color: '#fff' } : {}, + count: highlighted ? { color: '#fff' } : {}, + }; + return ( +
navLink && history.push(navLink)} + onMouseLeave={onMouseLeave} + onMouseOver={() => onSafeMouseOver(label)} + className={classNames('StatisticsCard', { highlighted })} + style={styles.card} + > + {badge?.value && ( + + {badge.value} + + )} + {icon && ( +
+ +
+ )} +
+ + {label} + + + {isLoading ? '--' : count} + +
+
+ ); +} + +StatisticsCard.displayName = 'StatisticsCard'; + +export default React.memo(StatisticsCard); diff --git a/src/src/components/StatisticsCard/index.ts b/src/src/components/StatisticsCard/index.ts new file mode 100644 index 00000000..e957ea86 --- /dev/null +++ b/src/src/components/StatisticsCard/index.ts @@ -0,0 +1,5 @@ +import StatisticsCard from './StatisticsCard'; + +export * from './StatisticsCard.d'; + +export default StatisticsCard; diff --git a/src/src/components/StatusLabel/StatusLabel.tsx b/src/src/components/StatusLabel/StatusLabel.tsx new file mode 100644 index 00000000..d19e3cef --- /dev/null +++ b/src/src/components/StatusLabel/StatusLabel.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import stopPropagation from 'utils/stopPropagation'; + +import { IStatusLabelProps } from './types.d'; + +import './styles.scss'; + +/** + * @property {string} title - label title + * @property {string} status - status type + * @property {string} className - component className + */ +function StatusLabel({ + title, + status = 'success', + className = '', + disabled = false, +}: IStatusLabelProps): React.FunctionComponentElement { + return ( + +
+ {title && ( + + {title} + + )} +
+
+ ); +} + +StatusLabel.displayName = 'StatusLabel'; + +export default React.memo(StatusLabel); diff --git a/src/src/components/StatusLabel/index.ts b/src/src/components/StatusLabel/index.ts new file mode 100644 index 00000000..acaf136f --- /dev/null +++ b/src/src/components/StatusLabel/index.ts @@ -0,0 +1,6 @@ +import StatusLabel from './StatusLabel'; + +export * from './types.d'; +export * from './StatusLabel'; + +export default StatusLabel; diff --git a/src/src/components/StatusLabel/styles.scss b/src/src/components/StatusLabel/styles.scss new file mode 100644 index 00000000..e60b4341 --- /dev/null +++ b/src/src/components/StatusLabel/styles.scss @@ -0,0 +1,48 @@ +@use 'src/styles/abstracts' as *; + +.StatusLabel { + display: flex; + justify-content: center; + align-items: center; + height: 1.25rem; + padding: 0.25rem 0.5rem 0.25rem 1.375rem; + border-radius: $border-radius-sm; + position: relative; + &.success { + background: $success-color-10; + .title { + color: $success-color-100; + } + &::before { + background: $success-color-100; + } + &.disabled { + &::before { + background: $success-color-50; + } + } + } + &.alert { + background: $pico-5; + .title { + color: $pico-50; + } + &::before { + background: $pico-50; + } + &.disabled { + &::before { + background: $pico-30; + } + } + } + &::before { + content: ''; + width: 6px; + height: 6px; + position: absolute; + top: 7px; + left: 7px; + border-radius: $border-radius-circle; + } +} diff --git a/src/src/components/StatusLabel/types.d.ts b/src/src/components/StatusLabel/types.d.ts new file mode 100644 index 00000000..937055e1 --- /dev/null +++ b/src/src/components/StatusLabel/types.d.ts @@ -0,0 +1,6 @@ +export interface IStatusLabelProps { + title?: string; + className?: string; + status?: 'success' | 'alert' | 'warning' | 'error'; + disabled?: boolean; +} diff --git a/src/src/components/StepsDensityPopover/StepsDensityPopover.tsx b/src/src/components/StepsDensityPopover/StepsDensityPopover.tsx new file mode 100644 index 00000000..23a1aea8 --- /dev/null +++ b/src/src/components/StepsDensityPopover/StepsDensityPopover.tsx @@ -0,0 +1,35 @@ +import React from 'react'; + +import { Box, Slider } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +const marks = [ + { value: 10, label: '10' }, + { value: 100, label: '100' }, + { value: 200, label: '200' }, + { value: 300, label: '300' }, + { value: 400, label: '400' }, + { value: 500, label: '500' }, +]; +function StepsDensityPopover(): React.FunctionComponentElement { + return ( + + + Number Of Steps: + + + + + + ); +} + +export default React.memo(StepsDensityPopover); diff --git a/src/src/components/TabPanel/TabPanel.tsx b/src/src/components/TabPanel/TabPanel.tsx new file mode 100644 index 00000000..38d693ad --- /dev/null +++ b/src/src/components/TabPanel/TabPanel.tsx @@ -0,0 +1,30 @@ +import React, { memo } from 'react'; + +import { Box } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary'; + +import { ITabPanelProps } from 'types/components/TabPanel/TabPanel'; + +function TabPanel({ + children, + value, + index, + className, +}: ITabPanelProps): React.FunctionComponentElement { + return ( + + + + ); +} + +export default memo(TabPanel); diff --git a/src/src/components/Table/ArchiveModal.tsx b/src/src/components/Table/ArchiveModal.tsx new file mode 100644 index 00000000..bd90d11f --- /dev/null +++ b/src/src/components/Table/ArchiveModal.tsx @@ -0,0 +1,276 @@ +import React from 'react'; +import _ from 'lodash-es'; +import moment from 'moment'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon, Modal, Text } from 'components/kit'; +import DataList from 'components/kit/DataList'; + +import { DATE_WITH_SECONDS } from 'config/dates/dates'; + +import { processDurationTime } from 'utils/processDurationTime'; + +function ArchiveModal({ + opened, + onClose, + selectedRows = {}, + archiveMode, + onRowSelect, + archiveRuns, +}: { + opened: boolean; + onClose: () => void; + selectedRows: { [key: string]: any }; + archiveMode: boolean; + onRowSelect: ({ + actionType, + data, + }: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + }) => { + [key: string]: any; + }; + archiveRuns: ( + ids: string[], + archived: boolean, + ) => { + call: () => Promise; + abort: () => void; + }; +}): React.FunctionComponentElement { + const tableRef = React.useRef({}); + const disabledTableRef = React.useRef({}); + const archivedText = archiveMode ? 'archive' : 'unarchive'; + + const tableColumns = [ + { + dataKey: 'experiment', + key: 'experiment', + title: 'Experiment', + width: 0, + flexGrow: 1, + cellRenderer: function cellRenderer({ cellData, rowIndex }: any) { + return ( + +
+ + {cellData} + +
+
+ ); + }, + }, + { + dataKey: 'date', + key: 'date', + title: 'Date', + width: 275, + cellRenderer: function cellRenderer({ cellData }: any) { + return ( + +
+ + {cellData} + +
+
+ ); + }, + }, + { + dataKey: 'name', + key: 'name', + title: 'Name', + width: 0, + flexGrow: 1, + cellRenderer: function cellRenderer({ cellData, rowData }: any) { + return ( +
+

+ {cellData} +

+ {!rowData.isDisabled && ( + + )} +
+ ); + }, + }, + ]; + + const { data, disabledData } = React.useMemo(() => { + let archivedList: any[] = []; + let unarchivedList: any[] = []; + const runHashList: string[] = []; + Object.values(selectedRows).forEach((selectedRow: any) => { + if (!runHashList.includes(selectedRow.runHash)) { + runHashList.push(selectedRow.runHash); + const rowData = { + key: selectedRow.runHash, + date: `${moment(selectedRow.creation_time * 1000).format( + DATE_WITH_SECONDS, + )} • ${processDurationTime( + selectedRow?.creation_time * 1000, + selectedRow?.end_time ? selectedRow?.end_time * 1000 : Date.now(), + )}`, + experiment: selectedRow?.experiment?.name ?? 'default', + name: selectedRow?.name ?? '-', + runHash: selectedRow.runHash, + selectKey: selectedRow.selectKey, + isInProgress: !selectedRow?.end_time, + creationTime: selectedRow.creation_time * 1000000, + isDisabled: + (archiveMode && selectedRow.archived) || + (!archiveMode && !selectedRow.archived), + }; + if (selectedRow.archived) { + unarchivedList.push(rowData); + } else { + archivedList.push(rowData); + } + } + }); + archivedList = _.orderBy(archivedList, ['creationTime'], ['desc']); + unarchivedList = _.orderBy(unarchivedList, ['creationTime'], ['desc']); + tableRef.current?.updateData?.({ + newData: archiveMode ? archivedList : unarchivedList, + }); + disabledTableRef.current?.updateData?.({ + newData: !archiveMode ? archivedList : unarchivedList, + }); + return { + data: archiveMode ? archivedList : unarchivedList, + disabledData: !archiveMode ? archivedList : unarchivedList, + }; + }, [selectedRows, archiveMode]); + + function onArchive() { + const ids = data.map((item: any) => item.runHash); + archiveRuns(ids, archiveMode) + .call() + .then(() => onClose()); + } + + return opened ? ( + +
+ + {archiveMode + ? 'Archived runs are not visible in search by default. You can always go back and unarchive them.' + : 'The runs will become visible in search.'} + +
+ + {Object.values(data).length} + + + {`runs to ${archivedText}.`} + +
+ {!_.isEmpty(data) && ( + + )} + {!_.isEmpty(disabledData) && ( +
+ + {Object.values(disabledData).length} + + + {`runs are already ${archivedText}d.`} + +
+ )} + {!_.isEmpty(disabledData) && ( + + )} +
+
+ ) : ( + <> + ); +} + +export default React.memo(ArchiveModal); diff --git a/src/src/components/Table/AutoResizer.tsx b/src/src/components/Table/AutoResizer.tsx new file mode 100644 index 00000000..2f817e05 --- /dev/null +++ b/src/src/components/Table/AutoResizer.tsx @@ -0,0 +1,46 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; +import AutoSizer from 'react-virtualized-auto-sizer'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +/** + * Decorator component that automatically adjusts the width and height of a single child + */ +const AutoResizer = ({ className, width, height, children, onResize }) => { + const disableWidth = typeof width === 'number'; + const disableHeight = typeof height === 'number'; + + if (disableWidth && disableHeight) { + return ( +
+ {children({ width, height })} +
+ ); + } + + return ( + + + {(size) => + children({ + width: disableWidth ? width : size.width, + height: disableHeight ? height : size.height, + }) + } + + + ); +}; + +export default AutoResizer; diff --git a/src/src/components/Table/BaseTable.scss b/src/src/components/Table/BaseTable.scss new file mode 100644 index 00000000..a137a50a --- /dev/null +++ b/src/src/components/Table/BaseTable.scss @@ -0,0 +1,329 @@ +@use 'src/styles/abstracts' as *; +$table-prefix: BaseTable !default; + +@mixin table-edge-padding($padding-left: null, $padding-right: null) { + .#{$table-prefix} { + &__header-cell, + &__row-cell { + @if $padding-left != null { + &:first-child { + padding-left: $padding-left; + } + } + + @if $padding-right != null { + &:last-child { + padding-right: $padding-right; + } + } + } + } +} + +@mixin fill-layout($top: 0, $bottom: 0) { + position: absolute; + left: 0; + right: 0; + top: $top; + bottom: $bottom; + overflow: hidden; +} + +.#{$table-prefix} { + $table-font-size: 13px !default; + $table-padding-left: 15px !default; + $table-padding-right: 15px !default; + $column-padding: 7.5px !default; + + $background-color: #ffffff !default; + $box-shadow-color: #eeeeee !default; + $box-shadow-offset: 2px !default; + $box-shadow-blur: 4px !default; + $border: 1px solid #eeeeee !default; + $header-background-color: #f8f8f8 !default; + $header-font-weight: $font-600 !default; + $row-hovered-background-color: #e2f2ff !default; + $header-cell-hovered-background-color: #f3f3f3 !default; + $sort-indicator-hovered-color: #888888 !default; + $column-resizer-color: #5bb4ff !default; + + $show-frozen-rows-shadow: false !default; + $show-frozen-columns-shadow: true !default; + + box-shadow: 0 $box-shadow-offset $box-shadow-blur 0 $box-shadow-color; + background-color: $background-color; + position: relative; + box-sizing: border-box; + font-size: $table-font-size; + + &--disabled { + opacity: 0.7; + pointer-events: none; + } + + &--dynamic { + .#{$table-prefix}__row { + overflow: hidden; + align-items: stretch; + } + } + + &:not(.#{$table-prefix}--dynamic), + .#{$table-prefix}__row--frozen { + .#{$table-prefix}__row-cell-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + + @if ($show-frozen-rows-shadow) { + &--has-frozen-rows { + .#{$table-prefix}__header { + box-shadow: 0 $box-shadow-offset $box-shadow-blur 0 $box-shadow-color; + } + } + } + + &__table { + background-color: $background-color; + position: absolute; + top: 0; + // put header after body and reverse the display order + // to prevent header's shadow being covered by body + display: flex; + flex-direction: column-reverse; + + &-main { + @include table-edge-padding($table-padding-left, $table-padding-right); + outline: $border; + left: 0; + + .#{$table-prefix}__header { + background-color: $header-background-color; + color: #1c2852; + } + } + + &-frozen-left, + &-frozen-right { + .#{$table-prefix}__header, + .#{$table-prefix}__body { + overflow: hidden !important; + } + } + + &-frozen-left { + @include table-edge-padding($table-padding-left, null); + @if ($show-frozen-columns-shadow) { + box-shadow: $box-shadow-offset 0 $box-shadow-blur 0 $box-shadow-color; + } + top: 0; + left: 0; + + .#{$table-prefix}__header-row, + .#{$table-prefix}__row { + padding-right: 0 !important; + } + + .#{$table-prefix}__body { + overflow-y: auto !important; + } + } + + &-frozen-right { + @include table-edge-padding(null, $table-padding-right); + @if ($show-frozen-columns-shadow) { + box-shadow: -$box-shadow-offset 0 $box-shadow-blur 0 $box-shadow-color; + } + top: 0; + right: 0; + + .#{$table-prefix}__header-row, + .#{$table-prefix}__row { + padding-left: 0 !important; + } + + .#{$table-prefix}__body { + overflow-y: auto !important; + } + } + } + + &__header { + overflow: hidden !important; + } + + .#{$table-prefix}__header, + .#{$table-prefix}__body { + outline: none; + } + + &__header-row, + &__row { + display: flex; + align-items: center; + border-bottom: $border; + box-sizing: border-box; + } + + &__header-row { + background-color: $header-background-color; + font-weight: $header-font-weight; + } + + &__row { + background-color: $background-color; + cursor: pointer; + + &--hovered { + background-color: $row-hovered-background-color; + } + } + + &__row-expanded { + border-bottom: $border; + } + + &__header-cell, + &__row-cell { + min-width: 0; + height: 100%; + display: flex; + align-items: center; + padding: 0 $column-padding; + box-sizing: border-box; + border-right: $border; + white-space: nowrap; + + &--align-center { + justify-content: center; + text-align: center; + } + + &--align-right { + justify-content: flex-end; + text-align: right; + } + } + + &__header-cell { + position: relative; + cursor: default; + + &:hover { + .#{$table-prefix}__column-resizer { + visibility: visible; + opacity: 0.5; + + &:hover { + opacity: 1; + } + } + } + + .#{$table-prefix}__sort-indicator { + display: none; + } + + &--sortable { + &:hover { + background-color: $header-cell-hovered-background-color; + cursor: pointer; + } + + &:not(.#{$table-prefix}__header-cell--sorting):hover { + .#{$table-prefix}__sort-indicator { + display: block; + color: $sort-indicator-hovered-color; + } + } + } + + &--sorting { + &, + &:hover { + .#{$table-prefix}__sort-indicator { + display: block; + } + } + } + + &--resizing { + .#{$table-prefix}__column-resizer { + visibility: visible; + opacity: 1; + // workaround to prevent header being clicked when resizing stopped on header + &::after { + @include fill-layout(); + content: ''; + left: -9999px; + } + } + } + + &-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: normal; + } + } + + &__header-row--resizing { + .#{$table-prefix}__header-cell { + background-color: transparent; + cursor: col-resize; + + &:not(.#{$table-prefix}__header-cell--sorting) { + .#{$table-prefix}__sort-indicator { + display: none; + } + } + + &:not(.#{$table-prefix}__header-cell--resizing) { + .#{$table-prefix}__column-resizer { + visibility: hidden; + } + } + } + } + + &__column-resizer { + width: 3px; + visibility: hidden; + background-color: $column-resizer-color; + + &:hover { + visibility: visible; + opacity: 1; + } + } + + &__footer { + @include fill-layout(null); + background-color: $background-color; + } + + &__resizing-line { + cursor: col-resize; + position: absolute; + top: 0; + background-color: $column-resizer-color; + width: 3px; + transform: translateX(-100%); + } + + &__empty-layer { + @include fill-layout(); + background-color: $background-color; + } + + &__overlay { + @include fill-layout(); + pointer-events: none; + + & > * { + pointer-events: auto; + } + } +} diff --git a/src/src/components/Table/BaseTable.tsx b/src/src/components/Table/BaseTable.tsx new file mode 100644 index 00000000..3a7d548e --- /dev/null +++ b/src/src/components/Table/BaseTable.tsx @@ -0,0 +1,1277 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; +import memoize from 'memoize-one'; +import cn from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { getValue } from 'utils/helper'; + +import GridTable from './GridTable'; +import TableHeaderRow from './TableHeaderRow'; +import TableRow from './TableRow'; +import TableHeaderCell from './TableHeaderCell'; +import TableCell from './TableCell'; +import Column, { Alignment, FrozenDirection } from './Column'; +import SortOrder from './SortOrder'; +import ExpandIcon from './ExpandIcon'; +import SortIndicator from './SortIndicator'; +import ColumnResizer from './ColumnResizer'; +import ColumnManager from './ColumnManager'; +import { + renderElement, + normalizeColumns, + getEstimatedTotalRowsHeight, + isObjectEqual, + callOrReturn, + hasChildren, + flattenOnKeys, + cloneArray, + throttle, + debounce, + noop, +} from './utils'; + +import './BaseTable.scss'; + +const getColumns = memoize( + (columns, children) => columns || normalizeColumns(children), +); + +const getContainerStyle = (width, maxWidth, height) => ({ + width, + maxWidth, + height, + overflow: 'hidden', +}); + +const DEFAULT_COMPONENTS = { + TableCell, + TableHeaderCell, + ExpandIcon, + SortIndicator, +}; + +const RESIZE_THROTTLE_WAIT = 50; + +// used for memoization +const EMPTY_ARRAY: void[] = []; + +/** + * React table component // TODO: change to function component + */ +class BaseTable extends React.PureComponent { + constructor(props) { + super(props); + + const { columns, children, defaultExpandedRowKeys } = props; + this.state = { + scrollbarSize: 0, + hoveredRowKey: null, + activeRowKey: null, + resizingKey: null, + resizingWidth: 0, + expandedRowKeys: cloneArray(defaultExpandedRowKeys), + }; + this.columnManager = new ColumnManager( + getColumns(columns, children), + props.fixed, + ); + + this._setContainerRef = this._setContainerRef.bind(this); + this._setMainTableRef = this._setMainTableRef.bind(this); + this._setLeftTableRef = this._setLeftTableRef.bind(this); + this._setRightTableRef = this._setRightTableRef.bind(this); + + this.renderExpandIcon = this.renderExpandIcon.bind(this); + this.renderRow = this.renderRow.bind(this); + this.renderRowCell = this.renderRowCell.bind(this); + this.renderHeader = this.renderHeader.bind(this); + this.renderHeaderCell = this.renderHeaderCell.bind(this); + + this._handleScroll = this._handleScroll.bind(this); + this._handleVerticalScroll = this._handleVerticalScroll.bind(this); + this._handleRowsRendered = this._handleRowsRendered.bind(this); + this._handleRowHover = this._handleRowHover.bind(this); + this._handleRowClick = this._handleRowClick.bind(this); + this._handleRowExpand = this._handleRowExpand.bind(this); + this._handleColumnResize = throttle( + this._handleColumnResize.bind(this), + RESIZE_THROTTLE_WAIT, + ); + this._handleColumnResizeStart = this._handleColumnResizeStart.bind(this); + this._handleColumnResizeStop = this._handleColumnResizeStop.bind(this); + this._handleColumnSort = this._handleColumnSort.bind(this); + this._handleFrozenRowHeightChange = + this._handleFrozenRowHeightChange.bind(this); + this._handleRowHeightChange = this._handleRowHeightChange.bind(this); + + this._getLeftTableContainerStyle = memoize(getContainerStyle); + this._getRightTableContainerStyle = memoize(getContainerStyle); + this._flattenOnKeys = memoize((tree, keys, dataKey) => { + this._depthMap = {}; + return flattenOnKeys(tree, keys, this._depthMap, dataKey); + }); + this._resetColumnManager = memoize( + (columns, fixed) => { + this.columnManager.reset(columns, fixed); + + if (this.props.estimatedRowHeight && fixed) { + if (!this.columnManager.hasLeftFrozenColumns()) { + this._leftRowHeightMap = {}; + } + if (!this.columnManager.hasRightFrozenColumns()) { + this._rightRowHeightMap = {}; + } + } + }, + (newArgs, lastArgs) => + isObjectEqual( + newArgs, + lastArgs, + this.props.ignoreFunctionInColumnCompare, + ), + ); + + this._isResetting = false; + this._resetIndex = null; + this._rowHeightMap = {}; + this._rowHeightMapBuffer = {}; + this._mainRowHeightMap = {}; + this._leftRowHeightMap = {}; + this._rightRowHeightMap = {}; + this._getEstimatedTotalRowsHeight = memoize(getEstimatedTotalRowsHeight); + this._getRowHeight = this._getRowHeight.bind(this); + this._updateRowHeights = debounce(() => { + this._isResetting = true; + this._rowHeightMap = { + ...this._rowHeightMap, + ...this._rowHeightMapBuffer, + }; + this.resetAfterRowIndex(this._resetIndex, false); + this._rowHeightMapBuffer = {}; + this._resetIndex = null; + this.forceUpdateTable(); + this.forceUpdate(); + this._isResetting = false; + }, 0); + + this._scroll = { scrollLeft: 0, scrollTop: 0 }; + this._scrollHeight = 0; + this._lastScannedRowIndex = -1; + this._hasDataChangedSinceEndReached = true; + + this._data = props.data; + this._depthMap = {}; + + this._horizontalScrollbarSize = 0; + this._verticalScrollbarSize = 0; + this._scrollbarPresenceChanged = false; + } + + /** + * Get the DOM node of the table + */ + getDOMNode() { + return this.tableNode; + } + + /** + * Get the column manager + */ + getColumnManager() { + return this.columnManager; + } + + /** + * Get internal `expandedRowKeys` state + */ + getExpandedRowKeys() { + const { expandedRowKeys } = this.props; + return expandedRowKeys !== undefined + ? expandedRowKeys || EMPTY_ARRAY + : this.state.expandedRowKeys; + } + + /** + * Get the expanded state, fallback to normal state if not expandable. + */ + getExpandedState() { + return { + expandedData: this._data, + expandedRowKeys: this.getExpandedRowKeys(), + expandedDepthMap: this._depthMap, + }; + } + + /** + * Get the total height of all rows, including expanded rows. + */ + getTotalRowsHeight() { + const { rowHeight, estimatedRowHeight } = this.props; + + if (estimatedRowHeight) { + return this.table + ? this.table.getTotalRowsHeight() + : this._getEstimatedTotalRowsHeight(this._data, estimatedRowHeight); + } + return this._data.length * rowHeight; + } + + /** + * Get the total width of all columns. + */ + getTotalColumnsWidth() { + return this.columnManager.getColumnsWidth(); + } + + /** + * Forcefully re-render the inner Grid component. + * + * Calling `forceUpdate` on `Table` may not re-render the inner Grid since it uses `shallowCompare` as a performance optimization. + * Use this method if you want to manually trigger a re-render. + * This may be appropriate if the underlying row data has changed but the row sizes themselves have not. + */ + forceUpdateTable() { + this.table && this.table.forceUpdateTable(); + this.leftTable && this.leftTable.forceUpdateTable(); + this.rightTable && this.rightTable.forceUpdateTable(); + } + + /** + * Reset cached offsets for positioning after a specific rowIndex, should be used only in dynamic mode(estimatedRowHeight is provided) + * + * @param {number} rowIndex + * @param {boolean} shouldForceUpdate + */ + resetAfterRowIndex(rowIndex = 0, shouldForceUpdate = true) { + if (!this.props.estimatedRowHeight) return; + + this.table && this.table.resetAfterRowIndex(rowIndex, shouldForceUpdate); + this.leftTable && + this.leftTable.resetAfterRowIndex(rowIndex, shouldForceUpdate); + this.rightTable && + this.rightTable.resetAfterRowIndex(rowIndex, shouldForceUpdate); + } + + /** + * Reset row height cache, useful if `data` changed entirely, should be used only in dynamic mode(estimatedRowHeight is provided) + */ + resetRowHeightCache() { + if (!this.props.estimatedRowHeight) return; + + this._resetIndex = null; + this._rowHeightMapBuffer = {}; + this._rowHeightMap = {}; + this._mainRowHeightMap = {}; + this._leftRowHeightMap = {}; + this._rightRowHeightMap = {}; + } + + /** + * Scroll to the specified offset. + * Useful for animating position changes. + * + * @param {object} offset + */ + scrollToPosition(offset) { + this._scroll = offset; + + this.table && this.table.scrollToPosition(offset); + this.leftTable && this.leftTable.scrollToTop(offset.scrollTop); + this.rightTable && this.rightTable.scrollToTop(offset.scrollTop); + } + + /** + * Scroll to the specified offset vertically. + * + * @param {number} scrollTop + */ + scrollToTop(scrollTop) { + this._scroll.scrollTop = scrollTop; + + this.table && this.table.scrollToPosition(this._scroll); + this.leftTable && this.leftTable.scrollToTop(scrollTop); + this.rightTable && this.rightTable.scrollToTop(scrollTop); + } + + /** + * Scroll to the specified offset horizontally. + * + * @param {number} scrollLeft + */ + scrollToLeft(scrollLeft) { + this._scroll.scrollLeft = scrollLeft; + + this.table && this.table.scrollToPosition(this._scroll); + } + + /** + * Scroll to the specified row. + * By default, the table will scroll as little as possible to ensure the row is visible. + * You can control the alignment of the row though by specifying an align property. Acceptable values are: + * + * - `auto` (default) - Scroll as little as possible to ensure the row is visible. + * - `smart` - Same as `auto` if it is less than one viewport away, or it's the same as`center`. + * - `center` - Center align the row within the table. + * - `end` - Align the row to the bottom side of the table. + * - `start` - Align the row to the top side of the table. + * + * @param {number} rowIndex + * @param {string} align + */ + scrollToRow(rowIndex = 0, align = 'auto') { + this.table && this.table.scrollToRow(rowIndex, align); + this.leftTable && this.leftTable.scrollToRow(rowIndex, align); + this.rightTable && this.rightTable.scrollToRow(rowIndex, align); + } + + scrollToRowByKey = (rowKey) => { + let rowIndex = 0; + for (let i = 0; i < this.props.data.length; i++) { + if (this.props.data[i].key === rowKey) { + rowIndex = i; + break; + } + } + + this.scrollToRow(rowIndex, 'smart'); + }; + + /** + * Set `expandedRowKeys` manually. + * This method is available only if `expandedRowKeys` is uncontrolled. + * + * @param {array} expandedRowKeys + */ + setExpandedRowKeys(expandedRowKeys) { + // if `expandedRowKeys` is controlled + if (this.props.expandedRowKeys !== undefined) return; + + this.setState({ + expandedRowKeys: cloneArray(expandedRowKeys), + }); + } + + /** + * Set `hoveredRowKey` manually. + * + * @param {string} rowKey + */ + setHoveredRow = (rowKey) => { + this.setState({ hoveredRowKey: rowKey }); + }; + + /** + * Set `activeRowKey` manually. + * + * @param {string} rowKey + */ + setActiveRow = (rowKey) => { + this.setState({ activeRowKey: rowKey }); + }; + + renderExpandIcon({ rowData, rowIndex, depth, onExpand }) { + const { rowKey, expandColumnKey, expandIconProps } = this.props; + if (!expandColumnKey) return null; + + const expandable = rowIndex >= 0 && hasChildren(rowData); + const expanded = + rowIndex >= 0 && this.getExpandedRowKeys().indexOf(rowData[rowKey]) >= 0; + const extraProps = callOrReturn(expandIconProps, { + rowData, + rowIndex, + depth, + expandable, + expanded, + }); + const ExpandIcon = this._getComponent('ExpandIcon'); + + return ( + + ); + } + + renderRow({ isScrolling, columns, rowData, rowIndex, style }) { + const { + rowClassName, + rowRenderer, + rowEventHandlers, + expandColumnKey, + estimatedRowHeight, + } = this.props; + + const rowClass = callOrReturn(rowClassName, { columns, rowData, rowIndex }); + const extraProps = callOrReturn(this.props.rowProps, { + columns, + rowData, + rowIndex, + }); + const rowKey = rowData[this.props.rowKey]; + const depth = this._depthMap[rowKey] || 0; + + const className = cn(this._prefixClass('row'), rowClass, { + [this._prefixClass(`row--depth-${depth}`)]: + !!expandColumnKey && rowIndex >= 0, + [this._prefixClass('row--expanded')]: + !!expandColumnKey && this.getExpandedRowKeys().indexOf(rowKey) >= 0, + [this._prefixClass('row--hovered')]: + !isScrolling && rowKey === this.state.hoveredRowKey, + [this._prefixClass('row--frozen')]: depth === 0 && rowIndex < 0, + [this._prefixClass('row--customized')]: rowRenderer, + }); + + const hasFrozenColumns = this.columnManager.hasFrozenColumns(); + const rowProps = { + ...extraProps, + role: 'row', + key: `row-${rowKey}`, + isScrolling, + className, + style: { + ...style, + ...rowData?.rowProps?.style, + }, + columns, + rowIndex, + rowData, + rowKey, + expandColumnKey, + depth, + rowEventHandlers, + rowRenderer, + // for frozen rows we use fixed rowHeight + estimatedRowHeight: rowIndex >= 0 ? estimatedRowHeight : undefined, + getIsResetting: this._getIsResetting, + cellRenderer: this.renderRowCell, + expandIconRenderer: this.renderExpandIcon, + onRowExpand: this._handleRowExpand, + // for fixed table, we need to sync the hover state across the inner tables + onRowHover: this._handleRowHover, + onRowClick: this._handleRowClick, + onRowHeightChange: hasFrozenColumns + ? this._handleFrozenRowHeightChange + : this._handleRowHeightChange, + }; + + return ; + } + + renderRowCell({ + isScrolling, + columns, + column, + columnIndex, + rowData, + rowIndex, + expandIcon, + }) { + if (column[ColumnManager.PlaceholderKey]) { + return ( + +
+ + ); + } + + const { className, dataKey, dataGetter, cellRenderer } = column; + const TableCell = this._getComponent('TableCell'); + + const cellData = dataGetter + ? dataGetter({ columns, column, columnIndex, rowData, rowIndex }) + : getValue(rowData, dataKey); + const cellProps = { + isScrolling, + cellData, + columns, + column, + columnIndex, + rowData, + rowIndex, + container: this, + }; + const cell = renderElement( + cellRenderer || ( + + ), + cellProps, + ); + + const cellCls = callOrReturn(className, { + cellData, + columns, + column, + columnIndex, + rowData, + rowIndex, + }); + const cls = cn(this._prefixClass('row-cell'), cellCls, { + [this._prefixClass('row-cell--align-center')]: + column.align === Alignment.CENTER, + [this._prefixClass('row-cell--align-right')]: + column.align === Alignment.RIGHT, + }); + + const extraProps = callOrReturn(this.props.cellProps, { + columns, + column, + columnIndex, + rowData, + rowIndex, + }); + const { tagName, ...rest } = extraProps || {}; + const Tag = tagName || 'div'; + return ( + + {expandIcon} + {cell} + + ); + } + + renderHeader({ columns, headerIndex, style }) { + const { headerClassName, headerRenderer } = this.props; + + const headerClass = callOrReturn(headerClassName, { columns, headerIndex }); + const extraProps = callOrReturn(this.props.headerProps, { + columns, + headerIndex, + }); + + const className = cn(this._prefixClass('header-row'), headerClass, { + [this._prefixClass('header-row--resizing')]: !!this.state.resizingKey, + [this._prefixClass('header-row--customized')]: headerRenderer, + }); + + const headerProps = { + ...extraProps, + role: 'row', + key: `header-${headerIndex}`, + className, + style, + columns, + headerIndex, + headerRenderer, + cellRenderer: this.renderHeaderCell, + expandColumnKey: this.props.expandColumnKey, + expandIcon: this._getComponent('ExpandIcon'), + }; + + return ; + } + + renderHeaderCell({ columns, column, columnIndex, headerIndex, expandIcon }) { + if (column[ColumnManager.PlaceholderKey]) { + return ( +
+ ); + } + + const { headerClassName, headerRenderer } = column; + const { sortBy, sortState, headerCellProps } = this.props; + const TableHeaderCell = this._getComponent('TableHeaderCell'); + const SortIndicator = this._getComponent('SortIndicator'); + + const cellProps = { + columns, + column, + columnIndex, + headerIndex, + container: this, + }; + const cell = renderElement( + headerRenderer || ( + + ), + cellProps, + ); + + let sorting, sortOrder; + + if (sortState) { + const order = sortState[column.key]; + sorting = order === SortOrder.ASC || order === SortOrder.DESC; + sortOrder = sorting ? order : SortOrder.ASC; + } else { + sorting = column.key === sortBy.key; + sortOrder = sorting ? sortBy.order : SortOrder.ASC; + } + + const cellCls = callOrReturn(headerClassName, { + columns, + column, + columnIndex, + headerIndex, + }); + const cls = cn(this._prefixClass('header-cell'), cellCls, { + [this._prefixClass('header-cell--align-center')]: + column.align === Alignment.CENTER, + [this._prefixClass('header-cell--align-right')]: + column.align === Alignment.RIGHT, + [this._prefixClass('header-cell--sortable')]: column.sortable, + [this._prefixClass('header-cell--sorting')]: sorting, + [this._prefixClass('header-cell--resizing')]: + column.key === this.state.resizingKey, + }); + const extraProps = callOrReturn(headerCellProps, { + columns, + column, + columnIndex, + headerIndex, + }); + const { tagName, ...rest } = extraProps || {}; + const Tag = tagName || 'div'; + return ( + + + {expandIcon} + {cell} + {column.sortable && ( + + )} + {column.resizable && ( + + )} + + + ); + } + + renderMainTable() { + const { + width, + headerHeight, + rowHeight, + fixed, + estimatedRowHeight, + ...rest + } = this.props; + const height = this._getTableHeight(); + + let tableWidth = width - this._verticalScrollbarSize; + if (fixed) { + const columnsWidth = this.columnManager.getColumnsWidth(); + // make sure `scrollLeft` is always integer to fix a sync bug when scrolling to end horizontally + tableWidth = Math.max(Math.round(columnsWidth), tableWidth); + } + return ( + + + + ); + } + + renderLeftTable() { + if (!this.columnManager.hasLeftFrozenColumns()) return null; + + const { width, headerHeight, rowHeight, estimatedRowHeight, ...rest } = + this.props; + + const containerHeight = this._getFrozenContainerHeight(); + const offset = this._verticalScrollbarSize || 20; + const columnsWidth = this.columnManager.getLeftFrozenColumnsWidth(); + return ( + + + + ); + } + + renderRightTable() { + if (!this.columnManager.hasRightFrozenColumns()) return null; + + const { width, headerHeight, rowHeight, estimatedRowHeight, ...rest } = + this.props; + + const containerHeight = this._getFrozenContainerHeight(); + const columnsWidth = this.columnManager.getRightFrozenColumnsWidth(); + const scrollbarWidth = this._verticalScrollbarSize; + return ( + + + + ); + } + + renderResizingLine() { + const { width, fixed } = this.props; + const { resizingKey } = this.state; + if (!fixed || !resizingKey) return null; + + const columns = this.columnManager.getMainColumns(); + const idx = columns.findIndex((column) => column.key === resizingKey); + const column = columns[idx]; + const { width: columnWidth, frozen } = column; + const leftWidth = this.columnManager.recomputeColumnsWidth( + columns.slice(0, idx), + ); + + let left = leftWidth + columnWidth; + if (!frozen) { + left -= this._scroll.scrollLeft; + } else if (frozen === FrozenDirection.RIGHT) { + const rightWidth = this.columnManager.recomputeColumnsWidth( + columns.slice(idx + 1), + ); + if (rightWidth + columnWidth > width - this._verticalScrollbarSize) { + left = columnWidth; + } else { + left = width - this._verticalScrollbarSize - rightWidth; + } + } + const style = { + left, + height: this._getTableHeight() - this._horizontalScrollbarSize, + }; + return
; + } + + renderFooter() { + const { footerHeight, footerRenderer } = this.props; + if (footerHeight === 0) return null; + return ( +
+ {renderElement(footerRenderer)} +
+ ); + } + + renderEmptyLayer() { + const { data, frozenData, footerHeight, emptyRenderer } = this.props; + + if ((data && data.length) || (frozenData && frozenData.length)) return null; + const headerHeight = this._getHeaderHeight(); + return ( +
+ {renderElement(emptyRenderer)} +
+ ); + } + + renderOverlay() { + const { overlayRenderer } = this.props; + + return ( +
+ {!!overlayRenderer && renderElement(overlayRenderer)} +
+ ); + } + + render() { + const { + columns, + children, + width, + fixed, + data, + frozenData, + expandColumnKey, + disabled, + className, + style, + footerHeight, + classPrefix, + estimatedRowHeight, + } = this.props; + this._resetColumnManager(getColumns(columns, children), fixed); + + const _data = expandColumnKey + ? this._flattenOnKeys(data, this.getExpandedRowKeys(), this.props.rowKey) + : data; + if (this._data !== _data) { + this.resetAfterRowIndex(0, false); + this._data = _data; + } + // should be after `this._data` assigned + this._calcScrollbarSizes(); + this._totalRowsHeight = this.getTotalRowsHeight(); + + const containerStyle = { + ...style, + width, + height: this._getTableHeight() + footerHeight, + position: 'relative', + }; + const cls = cn(classPrefix, className, { + [`${classPrefix}--fixed`]: fixed, + [`${classPrefix}--expandable`]: !!expandColumnKey, + [`${classPrefix}--empty`]: data.length === 0, + [`${classPrefix}--has-frozen-rows`]: frozenData.length > 0, + [`${classPrefix}--has-frozen-columns`]: + this.columnManager.hasFrozenColumns(), + [`${classPrefix}--disabled`]: disabled, + [`${classPrefix}--dynamic`]: !!estimatedRowHeight, + }); + return ( +
+ {this.renderFooter()} + {this.renderMainTable()} + {this.renderLeftTable()} + {this.renderRightTable()} + {this.renderResizingLine()} + {this.renderEmptyLayer()} + {this.renderOverlay()} +
+ ); + } + + componentDidMount() { + const scrollbarSize = this.props.getScrollbarSize(); + if (scrollbarSize > 0) { + this.setState({ scrollbarSize }); + } + } + + componentDidUpdate(prevProps, prevState) { + const { data, height, maxHeight, estimatedRowHeight } = this.props; + if (data !== prevProps.data) { + this._lastScannedRowIndex = -1; + this._hasDataChangedSinceEndReached = true; + } + + if (maxHeight !== prevProps.maxHeight || height !== prevProps.height) { + this._maybeCallOnEndReached(); + } + this._maybeScrollbarPresenceChange(); + + if (estimatedRowHeight) { + if (this.getTotalRowsHeight() !== this._totalRowsHeight) { + this.forceUpdate(); + } + } + } + + _prefixClass(className) { + return `${this.props.classPrefix}__${className}`; + } + + _setContainerRef(ref) { + this.tableNode = ref; + } + + _setMainTableRef(ref) { + this.table = ref; + } + + _setLeftTableRef(ref) { + this.leftTable = ref; + } + + _setRightTableRef(ref) { + this.rightTable = ref; + } + + _getComponent(name) { + if (this.props.components && this.props.components[name]) + return this.props.components[name]; + return DEFAULT_COMPONENTS[name]; + } + + // for dynamic row height + _getRowHeight(rowIndex) { + const { estimatedRowHeight, rowKey } = this.props; + return ( + this._rowHeightMap[this._data[rowIndex][rowKey]] || + callOrReturn(estimatedRowHeight, { + rowData: this._data[rowIndex], + rowIndex, + }) + ); + } + + _getIsResetting() { + return this._isResetting; + } + + _getHeaderHeight() { + const { headerHeight } = this.props; + if (Array.isArray(headerHeight)) { + return headerHeight.reduce((sum, height) => sum + height, 0); + } + return headerHeight; + } + + _getFrozenRowsHeight() { + const { frozenData, rowHeight } = this.props; + return frozenData.length * rowHeight; + } + + _getTableHeight() { + const { height, maxHeight, footerHeight } = this.props; + let tableHeight = height - footerHeight; + + if (maxHeight > 0) { + const frozenRowsHeight = this._getFrozenRowsHeight(); + const totalRowsHeight = this.getTotalRowsHeight(); + const headerHeight = this._getHeaderHeight(); + const totalHeight = + headerHeight + + frozenRowsHeight + + totalRowsHeight + + this._horizontalScrollbarSize; + tableHeight = Math.min(totalHeight, maxHeight - footerHeight); + } + + return tableHeight; + } + + _getBodyHeight() { + return ( + this._getTableHeight() - + this._getHeaderHeight() - + this._getFrozenRowsHeight() + ); + } + + _getFrozenContainerHeight() { + const { maxHeight } = this.props; + + const tableHeight = + this._getTableHeight() - + (this._data.length > 0 ? this._horizontalScrollbarSize : 0); + // in auto height mode tableHeight = totalHeight + if (maxHeight > 0) return tableHeight; + + const totalHeight = + this.getTotalRowsHeight() + + this._getHeaderHeight() + + this._getFrozenRowsHeight(); + return Math.min(tableHeight, totalHeight); + } + + _calcScrollbarSizes() { + const { fixed, width } = this.props; + const { scrollbarSize } = this.state; + + const totalRowsHeight = this.getTotalRowsHeight(); + const totalColumnsWidth = this.getTotalColumnsWidth(); + + const prevHorizontalScrollbarSize = this._horizontalScrollbarSize; + const prevVerticalScrollbarSize = this._verticalScrollbarSize; + + if (scrollbarSize === 0) { + this._horizontalScrollbarSize = 0; + this._verticalScrollbarSize = 0; + } else { + // we have to set `this._horizontalScrollbarSize` before calling `this._getBodyHeight` + if (!fixed || totalColumnsWidth <= width - scrollbarSize) { + this._horizontalScrollbarSize = 0; + this._verticalScrollbarSize = + totalRowsHeight > this._getBodyHeight() ? scrollbarSize : 0; + } else { + if (totalColumnsWidth > width) { + this._horizontalScrollbarSize = scrollbarSize; + this._verticalScrollbarSize = + totalRowsHeight > + this._getBodyHeight() - this._horizontalScrollbarSize + ? scrollbarSize + : 0; + } else { + this._horizontalScrollbarSize = 0; + this._verticalScrollbarSize = 0; + if (totalRowsHeight > this._getBodyHeight()) { + this._horizontalScrollbarSize = scrollbarSize; + this._verticalScrollbarSize = scrollbarSize; + } + } + } + } + + if ( + prevHorizontalScrollbarSize !== this._horizontalScrollbarSize || + prevVerticalScrollbarSize !== this._verticalScrollbarSize + ) { + this._scrollbarPresenceChanged = true; + } + } + + _maybeScrollbarPresenceChange() { + if (this._scrollbarPresenceChanged) { + const { onScrollbarPresenceChange } = this.props; + this._scrollbarPresenceChanged = false; + + onScrollbarPresenceChange({ + size: this.state.scrollbarSize, + horizontal: this._horizontalScrollbarSize > 0, + vertical: this._verticalScrollbarSize > 0, + }); + } + } + + _maybeCallOnEndReached() { + const { onEndReached, onEndReachedThreshold } = this.props; + const { scrollTop } = this._scroll; + const scrollHeight = this.getTotalRowsHeight(); + const clientHeight = this._getBodyHeight(); + + if (!onEndReached || !clientHeight || !scrollHeight) return; + const distanceFromEnd = + scrollHeight - scrollTop - clientHeight + this._horizontalScrollbarSize; + if ( + this._lastScannedRowIndex >= 0 && + distanceFromEnd <= onEndReachedThreshold && + (this._hasDataChangedSinceEndReached || + scrollHeight !== this._scrollHeight) + ) { + this._hasDataChangedSinceEndReached = false; + this._scrollHeight = scrollHeight; + onEndReached({ distanceFromEnd }); + } + } + + _handleScroll(args) { + const lastScrollTop = this._scroll.scrollTop; + this.scrollToPosition(args); + this.props.onScroll(args); + + if (args.scrollTop > lastScrollTop) this._maybeCallOnEndReached(); + } + + _handleVerticalScroll({ scrollTop }) { + const lastScrollTop = this._scroll.scrollTop; + + if (scrollTop !== lastScrollTop) this.scrollToTop(scrollTop); + if (scrollTop > lastScrollTop) this._maybeCallOnEndReached(); + } + + _handleRowsRendered(args) { + this.props.onRowsRendered(args); + + if (args.overscanStopIndex > this._lastScannedRowIndex) { + this._lastScannedRowIndex = args.overscanStopIndex; + this._maybeCallOnEndReached(); + } + } + + _handleRowHover({ rowKey, hovered }) { + if (this.state.activeRowKey !== null) { + return; + } + + this.setHoveredRow(hovered ? rowKey : null); + if (typeof this.props.onRowHover === 'function') { + this.props.onRowHover(hovered ? rowKey : undefined); + } + } + + _handleRowClick({ rowKey }) { + if (!this.props.disableRowClick) { + const clickedOnSameRow = this.state.activeRowKey === rowKey; + this.setState({ + hoveredRowKey: rowKey, + activeRowKey: clickedOnSameRow ? null : rowKey, + }); + if (typeof this.props.onRowClick === 'function') { + this.props.onRowClick(clickedOnSameRow ? undefined : rowKey); + } + } + } + + _handleRowExpand({ expanded, rowData, rowIndex, rowKey }) { + const expandedRowKeys = cloneArray(this.getExpandedRowKeys()); + if (expanded) { + if (!expandedRowKeys.indexOf(rowKey) >= 0) expandedRowKeys.push(rowKey); + } else { + const index = expandedRowKeys.indexOf(rowKey); + if (index > -1) { + expandedRowKeys.splice(index, 1); + } + } + // if `expandedRowKeys` is uncontrolled, update internal state + if (this.props.expandedRowKeys === undefined) { + this.setState({ expandedRowKeys }); + } + this.props.onRowExpand({ expanded, rowData, rowIndex, rowKey }); + this.props.onExpandedRowsChange(expandedRowKeys); + } + + _handleColumnResize({ key }, width) { + this.columnManager.setColumnWidth(key, width); + this.setState({ resizingWidth: width }); + + const column = this.columnManager.getColumn(key); + this.props.onColumnResize({ column, width }); + } + + _handleColumnResizeStart({ key }) { + this.setState({ resizingKey: key }); + } + + _handleColumnResizeStop() { + const { resizingKey, resizingWidth } = this.state; + this.setState({ resizingKey: null, resizingWidth: 0 }); + + if (!resizingKey || !resizingWidth) return; + + const column = this.columnManager.getColumn(resizingKey); + this.props.onColumnResizeEnd({ column, width: resizingWidth }); + } + + _handleColumnSort(event) { + const key = event.currentTarget.dataset.key; + const { sortBy, sortState, onColumnSort } = this.props; + let order = SortOrder.ASC; + + if (sortState) { + order = sortState[key] === SortOrder.ASC ? SortOrder.DESC : SortOrder.ASC; + } else if (key === sortBy.key) { + order = sortBy.order === SortOrder.ASC ? SortOrder.DESC : SortOrder.ASC; + } + + const column = this.columnManager.getColumn(key); + onColumnSort({ column, key, order }); + } + + _handleFrozenRowHeightChange(rowKey, size, rowIndex, frozen) { + if (!frozen) { + this._mainRowHeightMap[rowKey] = size; + } else if (frozen === FrozenDirection.RIGHT) { + this._rightRowHeightMap[rowKey] = size; + } else { + this._leftRowHeightMap[rowKey] = size; + } + + const height = Math.max( + this._mainRowHeightMap[rowKey] || 0, + this._leftRowHeightMap[rowKey] || 0, + this._rightRowHeightMap[rowKey] || 0, + ); + + if (this._rowHeightMap[rowKey] !== height) { + this._handleRowHeightChange(rowKey, height, rowIndex); + } + } + + _handleRowHeightChange(rowKey, size, rowIndex) { + if (this._resetIndex === null) this._resetIndex = rowIndex; + else if (this._resetIndex > rowIndex) this._resetIndex = rowIndex; + + this._rowHeightMapBuffer[rowKey] = size; + this._updateRowHeights(); + } +} + +BaseTable.Column = Column; +BaseTable.PlaceholderKey = ColumnManager.PlaceholderKey; + +export default BaseTable; diff --git a/src/src/components/Table/Column.tsx b/src/src/components/Table/Column.tsx new file mode 100644 index 00000000..181a8de1 --- /dev/null +++ b/src/src/components/Table/Column.tsx @@ -0,0 +1,27 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +export const Alignment = { + LEFT: 'left', + CENTER: 'center', + RIGHT: 'right', +}; + +export const FrozenDirection = { + LEFT: 'left', + RIGHT: 'right', + DEFAULT: true, + NONE: false, +}; + +/** + * Column for BaseTable + */ +class Column extends React.Component {} + +Column.Alignment = Alignment; +Column.FrozenDirection = FrozenDirection; + +export default Column; diff --git a/src/src/components/Table/ColumnManager.ts b/src/src/components/Table/ColumnManager.ts new file mode 100644 index 00000000..b0c8a30e --- /dev/null +++ b/src/src/components/Table/ColumnManager.ts @@ -0,0 +1,206 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import { FrozenDirection } from './Column'; + +export default class ColumnManager { + constructor(columns, fixed) { + this._origColumns = []; + this.reset(columns, fixed); + } + + _cache(key, fn) { + if (key in this._cached) return this._cached[key]; + this._cached[key] = fn(); + return this._cached[key]; + } + + reset(columns, fixed) { + this._columns = columns.map((column) => { + let width = column.width; + if (column.resizable) { + // don't reset column's `width` if `width` prop doesn't change + const idx = this._origColumns.findIndex((x) => x.key === column.key); + if (idx >= 0 && this._origColumns[idx].width === column.width) { + width = this._columns[idx].width; + } + } + return { ...column, width }; + }); + this._origColumns = columns; + this._fixed = fixed; + this._cached = {}; + this._columnStyles = this.recomputeColumnStyles(); + } + + resetCache() { + this._cached = {}; + } + + getOriginalColumns() { + return this._origColumns; + } + + getColumns() { + return this._columns; + } + + getVisibleColumns() { + return this._cache('visibleColumns', () => { + return this._columns.filter((column) => !column.hidden); + }); + } + + hasFrozenColumns() { + return this._cache('hasFrozenColumns', () => { + return ( + this._fixed && + this.getVisibleColumns().some((column) => !!column.frozen) + ); + }); + } + + hasLeftFrozenColumns() { + return this._cache('hasLeftFrozenColumns', () => { + return ( + this._fixed && + this.getVisibleColumns().some( + (column) => + column.frozen === FrozenDirection.LEFT || column.frozen === true, + ) + ); + }); + } + + hasRightFrozenColumns() { + return this._cache('hasRightFrozenColumns', () => { + return ( + this._fixed && + this.getVisibleColumns().some( + (column) => column.frozen === FrozenDirection.RIGHT, + ) + ); + }); + } + + getMainColumns() { + return this._cache('mainColumns', () => { + const columns = this.getVisibleColumns(); + if (!this.hasFrozenColumns()) return columns; + + const mainColumns = []; + this.getLeftFrozenColumns().forEach((column) => { + //columns placeholder for the fixed table above them + mainColumns.push({ ...column, [ColumnManager.PlaceholderKey]: true }); + }); + this.getVisibleColumns().forEach((column) => { + if (!column.frozen) mainColumns.push(column); + }); + this.getRightFrozenColumns().forEach((column) => { + mainColumns.push({ ...column, [ColumnManager.PlaceholderKey]: true }); + }); + + return mainColumns; + }); + } + + getLeftFrozenColumns() { + return this._cache('leftFrozenColumns', () => { + if (!this._fixed) return []; + return this.getVisibleColumns().filter( + (column) => + column.frozen === FrozenDirection.LEFT || column.frozen === true, + ); + }); + } + + getRightFrozenColumns() { + return this._cache('rightFrozenColumns', () => { + if (!this._fixed) return []; + return this.getVisibleColumns().filter( + (column) => column.frozen === FrozenDirection.RIGHT, + ); + }); + } + + getColumn(key) { + const idx = this._columns.findIndex((column) => column.key === key); + return this._columns[idx]; + } + + getColumnsWidth() { + return this._cache('columnsWidth', () => { + return this.recomputeColumnsWidth(this.getVisibleColumns()); + }); + } + + getLeftFrozenColumnsWidth() { + return this._cache('leftFrozenColumnsWidth', () => { + return this.recomputeColumnsWidth(this.getLeftFrozenColumns()); + }); + } + + getRightFrozenColumnsWidth() { + return this._cache('rightFrozenColumnsWidth', () => { + return this.recomputeColumnsWidth(this.getRightFrozenColumns()); + }); + } + + recomputeColumnsWidth(columns) { + return columns.reduce((width, column) => width + column.width, 0); + } + + setColumnWidth(key, width) { + const column = this.getColumn(key); + column.width = width; + this._cached = {}; + this._columnStyles[column.key] = this.recomputeColumnStyle(column); + } + + getColumnStyle(key) { + return this._columnStyles[key]; + } + + getColumnStyles() { + return this._columnStyles; + } + + recomputeColumnStyle(column) { + let flexGrow = 0; + let flexShrink = 0; + if (!this._fixed) { + flexGrow = typeof column.flexGrow === 'number' ? column.flexGrow : 0; + flexShrink = + typeof column.flexShrink === 'number' ? column.flexShrink : 1; + } + // workaround for Flex bug on IE: https://github.com/philipwalton/flexbugs#flexbug-7 + const flexValue = `${flexGrow} ${flexShrink} auto`; + + const style = { + ...column.style, + flex: flexValue, + msFlex: flexValue, + WebkitFlex: flexValue, + width: column.width, + overflow: 'hidden', + }; + + if (!this._fixed && column.maxWidth) { + style.maxWidth = column.maxWidth; + } + if (!this._fixed && column.minWidth) { + style.minWidth = column.minWidth; + } + + return style; + } + + recomputeColumnStyles() { + return this._columns.reduce((styles, column) => { + styles[column.key] = this.recomputeColumnStyle(column); + return styles; + }, {}); + } +} + +ColumnManager.PlaceholderKey = '__placeholder__'; diff --git a/src/src/components/Table/ColumnResizer.tsx b/src/src/components/Table/ColumnResizer.tsx new file mode 100644 index 00000000..9848de33 --- /dev/null +++ b/src/src/components/Table/ColumnResizer.tsx @@ -0,0 +1,230 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { addClassName, removeClassName } from './utils'; + +const INVALID_VALUE = null; + +// copied from https://github.com/mzabriskie/react-draggable/blob/master/lib/utils/domFns.js +export function addUserSelectStyles(doc) { + if (!doc) return; + let styleEl = doc.getElementById('react-draggable-style-el'); + if (!styleEl) { + styleEl = doc.createElement('style'); + styleEl.type = 'text/css'; + styleEl.id = 'react-draggable-style-el'; + styleEl.innerHTML = + '.react-draggable-transparent-selection *::-moz-selection {all: inherit;}\n'; + styleEl.innerHTML += + '.react-draggable-transparent-selection *::selection {all: inherit;}\n'; + doc.getElementsByTagName('head')[0].appendChild(styleEl); + } + if (doc.body) addClassName(doc.body, 'react-draggable-transparent-selection'); +} + +export function removeUserSelectStyles(doc) { + if (!doc) return; + try { + if (doc.body) + removeClassName(doc.body, 'react-draggable-transparent-selection'); + if (doc.selection) { + doc.selection.empty(); + } else { + // Remove selection caused by scroll, unless it's a focused input + // (we use doc.defaultView in case we're in an iframe) + const selection = (doc.defaultView || window).getSelection(); + if (selection && selection.type !== 'Caret') { + selection.removeAllRanges(); + } + } + } catch (e) { + // probably IE + } +} + +const eventsFor = { + touch: { + start: 'touchstart', + move: 'touchmove', + stop: 'touchend', + }, + mouse: { + start: 'mousedown', + move: 'mousemove', + stop: 'mouseup', + }, +}; + +let dragEventFor = eventsFor.mouse; + +/** + * ColumnResizer for BaseTable + */ +class ColumnResizer extends React.PureComponent { + constructor(props) { + super(props); + + this.isDragging = false; + this.lastX = INVALID_VALUE; + this.width = 0; + + this._setHandleRef = this._setHandleRef.bind(this); + this._handleClick = this._handleClick.bind(this); + this._handleMouseDown = this._handleMouseDown.bind(this); + this._handleMouseUp = this._handleMouseUp.bind(this); + this._handleTouchStart = this._handleTouchStart.bind(this); + this._handleTouchEnd = this._handleTouchEnd.bind(this); + this._handleDragStart = this._handleDragStart.bind(this); + this._handleDragStop = this._handleDragStop.bind(this); + this._handleDrag = this._handleDrag.bind(this); + } + + componentWillUnmount() { + if (this.handleRef) { + const { ownerDocument } = this.handleRef; + ownerDocument.removeEventListener(eventsFor.mouse.move, this._handleDrag); + ownerDocument.removeEventListener( + eventsFor.mouse.stop, + this._handleDragStop, + ); + ownerDocument.removeEventListener(eventsFor.touch.move, this._handleDrag); + ownerDocument.removeEventListener( + eventsFor.touch.stop, + this._handleDragStop, + ); + removeUserSelectStyles(ownerDocument); + } + } + + render() { + const { + style, + column, + onResizeStart, + onResize, + onResizeStop, + minWidth, + ...rest + } = this.props; + + return ( + +
+ + ); + } + + _setHandleRef(ref) { + this.handleRef = ref; + } + + _handleClick(e) { + e.stopPropagation(); + } + + _handleMouseDown(e) { + dragEventFor = eventsFor.mouse; + this._handleDragStart(e); + } + + _handleMouseUp(e) { + dragEventFor = eventsFor.mouse; + this._handleDragStop(e); + } + + _handleTouchStart(e) { + dragEventFor = eventsFor.touch; + this._handleDragStart(e); + } + + _handleTouchEnd(e) { + dragEventFor = eventsFor.touch; + this._handleDragStop(e); + } + + _handleDragStart(e) { + if (typeof e.button === 'number' && e.button !== 0) return; + + this.isDragging = true; + this.lastX = INVALID_VALUE; + this.width = this.props.column.width; + this.props.onResizeStart(this.props.column); + + const { ownerDocument } = this.handleRef; + addUserSelectStyles(ownerDocument); + ownerDocument.addEventListener(dragEventFor.move, this._handleDrag); + ownerDocument.addEventListener(dragEventFor.stop, this._handleDragStop); + } + + _handleDragStop(e) { + if (!this.isDragging) return; + this.isDragging = false; + + this.props.onResizeStop(this.props.column); + + const { ownerDocument } = this.handleRef; + removeUserSelectStyles(ownerDocument); + ownerDocument.removeEventListener(dragEventFor.move, this._handleDrag); + ownerDocument.removeEventListener(dragEventFor.stop, this._handleDragStop); + } + + _handleDrag(e) { + let clientX = e.clientX; + if (e.type === eventsFor.touch.move) { + e.preventDefault(); + if (e.targetTouches && e.targetTouches[0]) + clientX = e.targetTouches[0].clientX; + } + + const { offsetParent } = this.handleRef; + const offsetParentRect = offsetParent.getBoundingClientRect(); + const x = clientX + offsetParent.scrollLeft - offsetParentRect.left; + + if (this.lastX === INVALID_VALUE) { + this.lastX = x; + return; + } + + const { column, minWidth: MIN_WIDTH } = this.props; + const { width, maxWidth, minWidth = MIN_WIDTH } = column; + const movedX = x - this.lastX; + if (!movedX) return; + + this.width = this.width + movedX; + this.lastX = x; + + let newWidth = this.width; + if (maxWidth && newWidth > maxWidth) { + newWidth = maxWidth; + } else if (newWidth < minWidth) { + newWidth = minWidth; + } + + if (newWidth === width) return; + this.props.onResize(column, newWidth); + } +} + +export default ColumnResizer; diff --git a/src/src/components/Table/DeleteModal.tsx b/src/src/components/Table/DeleteModal.tsx new file mode 100644 index 00000000..132c0933 --- /dev/null +++ b/src/src/components/Table/DeleteModal.tsx @@ -0,0 +1,273 @@ +import React from 'react'; +import _ from 'lodash-es'; +import moment from 'moment'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon, Modal, Text } from 'components/kit'; +import DataList from 'components/kit/DataList'; + +import { DATE_WITH_SECONDS } from 'config/dates/dates'; + +import { processDurationTime } from 'utils/processDurationTime'; + +function DeleteModal({ + opened, + onClose, + selectedRows = {}, + onRowSelect, + deleteRuns, +}: { + opened: boolean; + onClose: () => void; + selectedRows: { [key: string]: any }; + onRowSelect: ({ + actionType, + data, + }: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + }) => { + [key: string]: any; + }; + deleteRuns: (ids: string[]) => { + call: () => Promise; + abort: () => void; + }; +}): React.FunctionComponentElement { + const tableRef = React.useRef({}); + const disabledTableRef = React.useRef({}); + + const tableColumns = [ + { + dataKey: 'experiment', + key: 'experiment', + title: 'Experiment', + width: 0, + flexGrow: 1, + cellRenderer: function cellRenderer({ cellData }: any) { + return ( + +
+ + {cellData} + +
+
+ ); + }, + }, + { + dataKey: 'date', + key: 'date', + title: 'Date', + width: 275, + cellRenderer: function cellRenderer({ cellData }: any) { + return ( + +
+ + {cellData} + +
+
+ ); + }, + }, + { + dataKey: 'name', + key: 'name', + title: 'Name', + width: 0, + flexGrow: 1, + cellRenderer: function cellRenderer({ cellData, rowData }: any) { + return ( +
+ + {cellData} + + {!rowData.isDisabled && ( + + )} +
+ ); + }, + }, + ]; + + const { data, disabledData } = React.useMemo(() => { + let finishedList: any[] = []; + let inProgressList: any[] = []; + const runHashList: string[] = []; + Object.values(selectedRows).forEach((selectedRow: any) => { + if (!runHashList.includes(selectedRow.runHash)) { + runHashList.push(selectedRow.runHash); + const rowData = { + key: selectedRow.runHash, + date: `${moment(selectedRow.creation_time * 1000).format( + DATE_WITH_SECONDS, + )} • ${processDurationTime( + selectedRow?.creation_time * 1000, + Date.now(), + )}`, + experiment: selectedRow?.experiment?.name ?? 'default', + name: selectedRow?.name ?? '-', + runHash: selectedRow.runHash, + selectKey: selectedRow.selectKey, + isInProgress: !selectedRow?.end_time, + isDisabled: !selectedRow?.end_time, + creationTime: selectedRow.creation_time * 1000000, + }; + if (!selectedRow.end_time) { + inProgressList.push(rowData); + } else { + finishedList.push(rowData); + } + } + }); + + finishedList = _.orderBy(finishedList, ['creationTime'], ['desc']); + inProgressList = _.orderBy(inProgressList, ['creationTime'], ['desc']); + + tableRef.current?.updateData?.({ + newData: finishedList, + }); + disabledTableRef.current?.updateData?.({ + newData: inProgressList, + }); + return { + data: finishedList, + disabledData: inProgressList, + }; + }, [selectedRows]); + + function onDelete() { + const ids = data.map((item: any) => item.runHash); + deleteRuns(ids) + .call() + .then(() => onClose()); + } + + return opened ? ( + +
+ + You will lose all the logs and data related to them. This action + cannot be undone. + +
+ + {Object.values(data).length} + + + runs to delete. + +
+ {!_.isEmpty(data) && ( + + )} + {!_.isEmpty(disabledData) && ( +
+ + {Object.values(disabledData).length} + + + runs are still in progress. Unfinished runs cannot be deleted. + +
+ )} + {!_.isEmpty(disabledData) && ( + + )} +
+
+ ) : ( + <> + ); +} + +export default React.memo(DeleteModal); diff --git a/src/src/components/Table/ExpandIcon.tsx b/src/src/components/Table/ExpandIcon.tsx new file mode 100644 index 00000000..55667e94 --- /dev/null +++ b/src/src/components/Table/ExpandIcon.tsx @@ -0,0 +1,62 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; +import cn from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +/** + * default ExpandIcon for BaseTable + */ +class ExpandIcon extends React.PureComponent { + constructor(props) { + super(props); + + this._handleClick = this._handleClick.bind(this); + } + + render() { + const { expandable, expanded, indentSize, depth, onExpand, ...rest } = + this.props; + if (!expandable && indentSize === 0) return null; + + const cls = cn('BaseTable__expand-icon', { + 'BaseTable__expand-icon--expanded': expanded, + }); + return ( + +
+ {expandable && '\u25B8'} +
+
+ ); + } + + _handleClick(e) { + e.stopPropagation(); + e.preventDefault(); + const { onExpand, expanded } = this.props; + onExpand(!expanded); + } +} + +export default ExpandIcon; diff --git a/src/src/components/Table/GridTable.tsx b/src/src/components/Table/GridTable.tsx new file mode 100644 index 00000000..14338bbf --- /dev/null +++ b/src/src/components/Table/GridTable.tsx @@ -0,0 +1,213 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; +import cn from 'classnames'; +import { FixedSizeGrid, VariableSizeGrid } from 'react-window'; +import memoize from 'memoize-one'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import Header from './TableHeader'; +import { getEstimatedTotalRowsHeight } from './utils'; + +/** + * A wrapper of the Grid for internal only + */ +class GridTable extends React.PureComponent { + constructor(props) { + super(props); + + this._setHeaderRef = this._setHeaderRef.bind(this); + this._setBodyRef = this._setBodyRef.bind(this); + this._setInnerRef = this._setInnerRef.bind(this); + this._itemKey = this._itemKey.bind(this); + this._getBodyWidth = this._getBodyWidth.bind(this); + this._handleItemsRendered = this._handleItemsRendered.bind(this); + this._resetColumnWidthCache = memoize((bodyWidth) => { + if (!this.props.estimatedRowHeight) return; + this.bodyRef && this.bodyRef.resetAfterColumnIndex(0, false); + }); + this._getEstimatedTotalRowsHeight = memoize(getEstimatedTotalRowsHeight); + + this.renderRow = this.renderRow.bind(this); + } + + resetAfterRowIndex(rowIndex = 0, shouldForceUpdate) { + if (!this.props.estimatedRowHeight) return; + this.bodyRef && + this.bodyRef.resetAfterRowIndex(rowIndex, shouldForceUpdate); + } + + forceUpdateTable() { + this.headerRef && this.headerRef.forceUpdate(); + this.bodyRef && this.bodyRef.forceUpdate(); + } + + scrollToPosition(args) { + this.headerRef && this.headerRef.scrollTo(args.scrollLeft); + this.bodyRef && this.bodyRef.scrollTo(args); + } + + scrollToTop(scrollTop) { + this.bodyRef && this.bodyRef.scrollTo({ scrollTop }); + } + + scrollToLeft(scrollLeft) { + this.headerRef && this.headerRef.scrollTo(scrollLeft); + this.bodyRef && this.bodyRef.scrollToPosition({ scrollLeft }); + } + + scrollToRow(rowIndex = 0, align = 'auto') { + this.bodyRef && this.bodyRef.scrollToItem({ rowIndex, align }); + } + + getTotalRowsHeight() { + const { data, rowHeight, estimatedRowHeight } = this.props; + + if (estimatedRowHeight) { + return ( + (this.innerRef && this.innerRef.clientHeight) || + this._getEstimatedTotalRowsHeight(data, estimatedRowHeight) + ); + } + return data.length * rowHeight; + } + + renderRow(args) { + const { data, columns, rowRenderer } = this.props; + const rowData = data[args.rowIndex]; + return rowRenderer({ ...args, columns, rowData }); + } + + render() { + const { + containerStyle, + classPrefix, + className, + data, + frozenData, + width, + height, + rowHeight, + estimatedRowHeight, + getRowHeight, + headerWidth, + bodyWidth, + useIsScrolling, + onScroll, + hoveredRowKey, + overscanRowCount, + // omit from rest + style, + onScrollbarPresenceChange, + ...rest + } = this.props; + const headerHeight = this._getHeaderHeight(); + const frozenRowCount = frozenData.length; + const frozenRowsHeight = rowHeight * frozenRowCount; + const cls = cn(`${classPrefix}__table`, className); + const containerProps = containerStyle ? { style: containerStyle } : null; + const Grid = estimatedRowHeight ? VariableSizeGrid : FixedSizeGrid; + + this._resetColumnWidthCache(bodyWidth); + return ( + +
+ + {this.renderRow} + + {headerHeight + frozenRowsHeight > 0 && ( + // put header after body and reverse the display order via css + // to prevent header's shadow being covered by body +
0 ? hoveredRowKey : null} + /> + )} +
+
+ ); + } + + _setHeaderRef(ref) { + this.headerRef = ref; + } + + _setBodyRef(ref) { + this.bodyRef = ref; + } + + _setInnerRef(ref) { + this.innerRef = ref; + } + + _itemKey({ rowIndex }) { + const { data, rowKey } = this.props; + return data[rowIndex][rowKey]; + } + + _getHeaderHeight() { + const { headerHeight } = this.props; + if (Array.isArray(headerHeight)) { + return headerHeight.reduce((sum, height) => sum + height, 0); + } + return headerHeight; + } + + _getBodyWidth() { + return this.props.bodyWidth; + } + + _handleItemsRendered({ + overscanRowStartIndex, + overscanRowStopIndex, + visibleRowStartIndex, + visibleRowStopIndex, + }) { + this.props.onRowsRendered({ + overscanStartIndex: overscanRowStartIndex, + overscanStopIndex: overscanRowStopIndex, + startIndex: visibleRowStartIndex, + stopIndex: visibleRowStopIndex, + }); + } +} + +export default GridTable; diff --git a/src/src/components/Table/GroupedColumnHeader.tsx b/src/src/components/Table/GroupedColumnHeader.tsx new file mode 100644 index 00000000..d5567a9a --- /dev/null +++ b/src/src/components/Table/GroupedColumnHeader.tsx @@ -0,0 +1,47 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import { formatValue } from 'utils/formatValue'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; + +const TITLE_MAX_ROW_LENGTH = 5; +function GroupedColumnHeader({ + data, +}: { + data: Array; +}): React.FunctionComponentElement { + const Title: React.ReactNode = React.useMemo(() => { + const filteredData = data.filter((val) => val); + const isEllipsis: boolean = filteredData.length > TITLE_MAX_ROW_LENGTH; + return filteredData + .slice(0, isEllipsis ? TITLE_MAX_ROW_LENGTH : data.length) + .map((val: any, index) => { + const value = isSystemMetric(val) + ? formatSystemMetricName(val) + : formatValue(val); + return ( +
+ {value} + {index + 1 === TITLE_MAX_ROW_LENGTH ? '...' : ''} +
+ ); + }); + }, [data]); + + return ( +
+ {Title}
}> +
+ Mixed: + {data.length} values +
+ +
+ ); +} + +GroupedColumnHeader.displayName = 'GroupedColumnHeader'; + +export default React.memo(GroupedColumnHeader); diff --git a/src/src/components/Table/RunNameColumn.tsx b/src/src/components/Table/RunNameColumn.tsx new file mode 100644 index 00000000..aca473a0 --- /dev/null +++ b/src/src/components/Table/RunNameColumn.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { Link as RouteLink } from 'react-router-dom'; +import classNames from 'classnames'; + +import { Link, Tooltip } from '@material-ui/core'; + +import StatusLabel from 'components/StatusLabel'; + +import { PathEnum } from 'config/enums/routesEnum'; + +function RunNameColumn({ + active, + runHash, + run, + hidden = false, +}: { + active: boolean; + runHash: string; + run: string; + hidden?: boolean; +}) { + return ( + + ); +} + +RunNameColumn.displayName = 'RunNameColumn'; + +export default React.memo(RunNameColumn); diff --git a/src/src/components/Table/SortIndicator.tsx b/src/src/components/Table/SortIndicator.tsx new file mode 100644 index 00000000..35c1c4d8 --- /dev/null +++ b/src/src/components/Table/SortIndicator.tsx @@ -0,0 +1,37 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; +import cn from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import SortOrder from './SortOrder'; + +/** + * default SortIndicator for BaseTable + */ +const SortIndicator = ({ sortOrder, className, style }) => { + const cls = cn('BaseTable__sort-indicator', className, { + 'BaseTable__sort-indicator--descending': sortOrder === SortOrder.DESC, + }); + return ( + +
+ {sortOrder === SortOrder.DESC ? '\u2193' : '\u2191'} +
+
+ ); +}; + +export default SortIndicator; diff --git a/src/src/components/Table/SortOrder.ts b/src/src/components/Table/SortOrder.ts new file mode 100644 index 00000000..b1f39227 --- /dev/null +++ b/src/src/components/Table/SortOrder.ts @@ -0,0 +1,15 @@ +/** + * Sort order for BaseTable + */ +const SortOrder = { + /** + * Sort data in ascending order + */ + ASC: 'asc', + /** + * Sort data in descending order + */ + DESC: 'desc', +}; + +export default SortOrder; diff --git a/src/src/components/Table/Table.scss b/src/src/components/Table/Table.scss new file mode 100644 index 00000000..dd51e992 --- /dev/null +++ b/src/src/components/Table/Table.scss @@ -0,0 +1,176 @@ +@use 'src/styles/abstracts' as *; + +.Table__header { + display: flex; + padding: 0.2rem 1rem; + height: toRem(38px); + align-items: center; + &__select__resize { + padding-right: 1rem; + display: flex; + align-items: center; + border-right: $border-main; + margin-right: 1rem; + + i { + &:nth-child(2) { + margin: 0 0.875rem; + } + } + } + &__buttons { + flex: 1; + } + &__item { + cursor: pointer; + display: flex; + align-items: center; + border: 0.0625rem solid transparent; + transition: all 0.18s ease-out; + border-radius: $radius-main; + padding: 0 0.375rem !important; + margin-right: 0.375rem !important; + i { + margin-right: 0.75rem; + } + &.opened { + border: $border-main-active; + background-color: $primary-color-10; + } + &--diffBtn { + margin-right: $space-xs; + } + } +} + +.ActionModalWrapper { + max-width: 1800px; +} + +.ActionModal { + width: 100%; + &__container { + width: 60vw; + max-width: 100%; + .Modal__content { + width: 100%; + } + } + &__Table { + .BaseTable__header { + border-radius: toRem(4px) toRem(4px) 0 0; + border-bottom: unset; + .BaseTable__header-row { + border-bottom: unset; + } + } + .BaseTable__header-cell { + background: $cuddle-20; + border-right: unset; + } + .BaseTable__row { + border-bottom: unset; + + .BaseTable__row-cell { + border-right: unset; + } + &:nth-child(odd) { + .BaseTable__row-cell { + background: $white; + } + } + &:nth-child(even) { + .BaseTable__row-cell { + background: $cuddle-10; + } + } + &:hover { + .BaseTable__row-cell { + background: $primary-color-10; + } + } + } + } + &__disabledTableWrapper { + opacity: 0.5; + .BaseTable__body > div { + pointer-events: none; + } + } + &__experimentRow { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + .BaseTable__row:hover { + .ActionModal__tableRowWithAction { + &__deleteButton { + display: flex; + } + } + } + &__tableRowWithAction { + display: flex; + align-items: center; + width: 100%; + justify-content: space-between; + position: relative; + &.isDisabled { + justify-content: flex-start; + } + &__deleteButton { + display: none; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + } + &__name { + padding-right: 2.875rem; + &.in-progress { + &::after { + content: ''; + position: absolute; + right: 1.75rem; + width: 0.375rem; + height: 0.375rem; + top: 50%; + border-radius: $border-radius-circle; + background: $success-color-100; + transform: translate(-50%, -50%); + } + } + } + } + &__tableTitle { + margin-top: 1rem; + display: block; + margin-bottom: toRem(6px); + &__count { + margin-right: $space-xxxs; + } + } +} +.TableColumn__SortButton { + margin: 0 $space-xxxs; +} +.selectedRowActionsContainer { + &__selectedRowsCount { + padding: 0 1.25rem 0 0.25rem; + margin: 0.25rem 0; + display: flex; + align-items: center; + border-right: $border-main; + margin-right: 1rem; + } +} + +.RunNameColumn { + display: flex; + align-items: center; + &.isHidden { + .MuiTypography-root { + color: $primary-color-50; + } + } +} diff --git a/src/src/components/Table/Table.tsx b/src/src/components/Table/Table.tsx new file mode 100644 index 00000000..723601cc --- /dev/null +++ b/src/src/components/Table/Table.tsx @@ -0,0 +1,1162 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; +import { isEmpty, isEqual, isNil } from 'lodash-es'; +import { useResizeObserver } from 'hooks'; +import _ from 'lodash-es'; + +import { Button, Icon, Text } from 'components/kit'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import IllustrationBlock from 'components/IllustrationBlock/IllustrationBlock'; +import ResizeModeActions from 'components/ResizeModeActions/ResizeModeActions'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { + ROW_CELL_SIZE_CONFIG, + RowHeightSize, + TABLE_DEFAULT_CONFIG, +} from 'config/table/tableConfigs'; +import { IllustrationsEnum } from 'config/illustrationConfig/illustrationConfig'; + +import SortPopover from 'pages/Metrics/components/Table/SortPopover/SortPopover'; +import ManageColumnsPopover from 'pages/Metrics/components/Table/ManageColumnsPopover/ManageColumnsPopover'; +import HideRowsPopover from 'pages/Metrics/components/Table/HideRowsPopover/HideRowsPopover'; +import RowHeightPopover from 'pages/Metrics/components/Table/RowHeightPopover/RowHeightPopover'; +import CompareSelectedRunsPopover from 'pages/Metrics/components/Table/CompareSelectedRunsPopover'; +import MetricsValueKeyPopover from 'pages/Metrics/components/Table/MetricsValueKeyPopover'; + +import { ITableProps } from 'types/components/Table/Table'; + +import CustomTable from '../CustomTable/Table'; + +import ArchiveModal from './ArchiveModal'; +import DeleteModal from './DeleteModal'; +import AutoResizer from './AutoResizer'; +import BaseTable from './BaseTable'; + +import './Table.scss'; + +const Table = React.forwardRef(function Table( + { + onManageColumns, + onColumnsVisibilityChange, + onTableDiffShow, + sameValueColumns, + onSort, + onRowsChange, + onExport, + onRowHeightChange, + onRowHover = () => {}, + onRowClick = () => {}, + onTableResizeModeChange, + onMetricsValueKeyChange, + metricsValueKey, + custom, + data, + columns, + navBarItems, + rowHeight = RowHeightSize.md, + estimatedRowHeight, + headerHeight = RowHeightSize.md, + sortOptions, + hideHeaderActions = false, + fixed = true, + excludedFields, + setExcludedFields, + alwaysVisibleColumns, + rowHeightMode, + hiddenColumns, + updateColumns, + columnsWidths, + updateColumnsWidths, + sortFields, + hiddenRows, + isLoading, + showRowClickBehaviour = true, + showResizeContainerActionBar = true, + resizeMode, + onSortReset, + height = 'calc(100% - 40px)', + multiSelect = false, + selectedRows, + onRowSelect, + minHeight, + archiveRuns, + deleteRuns, + hideSystemMetrics, + className = '', + appName, + hiddenChartRows, + focusedState, + columnsOrder, + illustrationConfig, + disableRowClick = false, + onToggleColumnsColorScales, + columnsColorScales, + onRowsVisibilityChange, + visualizationElementType, + noColumnActions, + ...props + }: ITableProps, + ref, +): React.FunctionComponentElement { + const tableRef = React.useRef(); + const startIndex = React.useRef(0); + const endIndex = React.useRef(0); + const expandedGroups = React.useRef([]); + const hoveredRowKey = React.useRef(null); + const activeRowKey = React.useRef(null); + const tableContainerRef = React.useRef(); + const dataRef = React.useRef(data); + const columnsRef = React.useRef(columns ?? []); + const hiddenColumnsRef = React.useRef(hiddenColumns); + const scrollTopMutableRef = React.useRef({ top: 0 }); + + const [rowData, setRowData] = React.useState(data); + const [columnsData, setColumnsData] = React.useState(columns ?? []); + const [expanded, setExpanded] = React.useState({}); + const [isOpenDeleteSelectedPopup, setIsOpenDeleteSelectedPopup] = + React.useState(false); + const [isOpenUnarchiveSelectedPopup, setIsOpenUnarchiveSelectedPopup] = + React.useState(false); + const [isOpenArchiveSelectedPopup, setIsOpenArchiveSelectedPopup] = + React.useState(false); + const [tableBulkActionsVisibility, setTableBulkActionsVisibility] = + React.useState<{ + delete: boolean; + archive: boolean; + unarchive: boolean; + hideItems: boolean; + showItems: boolean; + }>({ + delete: false, + archive: false, + unarchive: false, + hideItems: false, + showItems: false, + }); + const [listWindow, setListWindow] = React.useState({ + top: 0, + left: 0, + height: 0, + width: 0, + availableSpace: 0, + }); + + let groups = !Array.isArray(rowData); + + React.useEffect(() => { + if (focusedState && !focusedState.active) { + activeRowKey.current = null; + } + }, [focusedState]); + + React.useEffect(() => { + updateFocusedRow(`rowKey-${activeRowKey.current}`); + }, [selectedRows]); + + React.useEffect(() => { + if (activeRowKey.current === null) { + updateHoveredRow(`rowKey-${hoveredRowKey.current}`); + } else { + updateFocusedRow(`rowKey-${activeRowKey.current}`); + } + }, [listWindow]); + + React.useImperativeHandle(ref, () => ({ + updateData: updateData, + setHoveredRow: setHoveredRow, + setActiveRow: setActiveRow, + scrollToRow: scrollToRow, + })); + + function calculateWindow({ + scrollTop, + offsetHeight, + itemHeight, + groupMargin, + }) { + const offset = 10; + + if (groups) { + let beforeScrollHeight = 0; + let scrollBottomHeight = 0; + let start = 0; + let end = 0; + let startIsSet = false; + let endIsSet = false; + for (let groupKey in dataRef.current) { + beforeScrollHeight += itemHeight + groupMargin; + scrollBottomHeight += itemHeight + groupMargin; + if (expandedGroups.current.includes(groupKey)) { + // eslint-disable-next-line no-loop-func + dataRef.current[groupKey].items.forEach((row) => { + if (scrollTop > beforeScrollHeight) { + beforeScrollHeight += itemHeight; + } else if (!startIsSet) { + start = row.index; + startIsSet = true; + } + + if (scrollBottomHeight < scrollTop + offsetHeight) { + scrollBottomHeight += itemHeight; + } else if (!endIsSet) { + end = row.index; + endIsSet = true; + } + }); + } else { + if (!endIsSet && !!dataRef.current[groupKey]?.items[0]?.index) { + end = dataRef.current[groupKey]?.items[0]?.index; + } + } + } + + const startIndex = start < offset ? 0 : start - offset; + const endIndex = end + offset; + + return { + startIndex, + endIndex, + }; + } + + const windowSize = Math.ceil(offsetHeight / itemHeight); + const start = Math.floor(scrollTop / itemHeight); + const startIndex = start < offset ? 0 : start - offset; + const endIndex = start + windowSize + offset; + + return { + startIndex, + endIndex, + }; + } + + function updateData({ newData, newColumns, hiddenColumns, dynamicData }) { + if (custom && dynamicData) { + if (!!newData) { + dataRef.current = newData; + } + if (!!hiddenColumns) { + hiddenColumnsRef.current = hiddenColumns; + } + if (!!newColumns) { + columnsRef.current = newColumns; + setColumnsData(newColumns); + } + virtualizedUpdate(); + } else { + if (!!newData) { + dataRef.current = newData; + setRowData(newData); + } + if (!!hiddenColumns) { + hiddenColumnsRef.current = hiddenColumns; + } + if (!!newColumns) { + columnsRef.current = newColumns; + setColumnsData(newColumns); + } + } + } + + function setHoveredRow(rowKey: string) { + window.requestAnimationFrame(() => { + if (custom) { + if (hoveredRowKey.current === rowKey) { + hoveredRowKey.current = null; + } else { + hoveredRowKey.current = rowKey; + } + if (activeRowKey.current === null) { + updateHoveredRow(`rowKey-${hoveredRowKey.current}`); + } + } else { + tableRef.current?.setHoveredRow(rowKey); + } + }); + } + + function setActiveRow(rowKey: string, toggle = false) { + window.requestAnimationFrame(() => { + if (custom) { + if (toggle && activeRowKey.current === rowKey) { + activeRowKey.current = null; + } else { + activeRowKey.current = rowKey; + } + updateFocusedRow(`rowKey-${activeRowKey.current}`); + } else { + tableRef.current?.setActiveRow(rowKey); + } + }); + } + + function scrollToRow(rowKey: string) { + window.requestAnimationFrame(() => { + if (custom) { + let top = 0; + if (groups) { + let groupCount = 0; + loop: for (let key in data) { + top += + ROW_CELL_SIZE_CONFIG[rowHeight]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargins; + for (let i = 0; i < data[key]?.items?.length; i++) { + if (data[key].items[i].key === rowKey) { + top += i * rowHeight; + if (!expanded[key]) { + expandedGroups.current.push(key); + setExpanded( + Object.fromEntries( + expandedGroups.current.map((key) => [key, true]), + ), + ); + } + break loop; + } + } + top += + rowHeight + + ((ROW_CELL_SIZE_CONFIG[rowHeight]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin) / + 2) * + groupCount; + if (expanded[key]) { + top += data[key].items.length * rowHeight; + } + groupCount++; + } + } else { + for (let i = 0; i < data?.length; i++) { + if (data[i].key === rowKey) { + top = i * rowHeight; + break; + } + } + } + + if ( + tableContainerRef.current && + (tableContainerRef.current.scrollTop > top || + tableContainerRef.current.scrollTop + + tableContainerRef.current.offsetHeight < + top) + ) { + setTimeout(() => { + window.requestAnimationFrame(() => { + tableContainerRef.current.scrollTo({ + top, + }); + }); + }, 100); + } + } else { + tableRef.current?.scrollToRowByKey(rowKey); + } + }); + } + + function virtualizedUpdate() { + if (groups) { + window.requestAnimationFrame(() => { + ['value', 'step', 'epoch', 'time'].forEach((colKey) => { + for (let groupKey in dataRef.current) { + const groupHeaderRowCell = document.querySelector( + `.Table__cell.${colKey}.index-${groupKey}`, + ); + if (!!groupHeaderRowCell) { + const groupRow = dataRef.current[groupKey]; + if (!!groupRow && !!groupRow.data) { + if (colKey === 'value') { + groupHeaderRowCell.children[0].children[0].children[0].textContent = + groupRow.data.aggregation.area.min; + groupHeaderRowCell.children[0].children[0].children[1].textContent = + groupRow.data.aggregation.line; + groupHeaderRowCell.children[0].children[0].children[2].textContent = + groupRow.data.aggregation.area.max; + if (!isNil(groupRow.data.aggregation.area.stdDevValue)) { + groupHeaderRowCell.children[0].children[0].children[3].textContent = + groupRow.data.aggregation.area.stdDevValue; + } + if (!isNil(groupRow.data.aggregation.area.stdErrValue)) { + groupHeaderRowCell.children[0].children[0].children[3].textContent = + groupRow.data.aggregation.area.stdErrValue; + } + } else { + groupHeaderRowCell.textContent = groupRow.data[colKey]; + } + if (expandedGroups.current.includes(groupKey)) { + groupRow.items.forEach((row) => { + if (row.index > endIndex.current) { + return; + } + if (row.index >= startIndex.current) { + const cell = document.querySelector( + `.Table__cell.${colKey}.index-${row.index}`, + ); + if (!!cell) { + cell.textContent = row[colKey]; + } + } + }); + } + } + } + } + }); + }); + } else { + window.requestAnimationFrame(() => { + ['value', 'step', 'epoch', 'time'].forEach((colKey) => { + for (let i = startIndex.current; i < endIndex.current; i++) { + const cell = document.querySelector( + `.Table__cell.${colKey}.index-${i}`, + ); + if (!!cell) { + const row = dataRef.current[i]; + if (!!row) { + cell.textContent = row[colKey]; + } + } + } + }); + }); + } + } + + function onGroupExpandToggle(groupKey) { + if (Array.isArray(groupKey)) { + expandedGroups.current = groupKey; + } else if (expandedGroups.current.includes(groupKey)) { + expandedGroups.current = expandedGroups.current.filter( + (item) => item !== groupKey, + ); + } else { + expandedGroups.current = expandedGroups.current.concat([groupKey]); + } + + const windowEdges = calculateWindow({ + scrollTop: tableContainerRef.current.scrollTop, + offsetHeight: tableContainerRef.current.offsetHeight, + scrollHeight: tableContainerRef.current.scrollHeight, + itemHeight: rowHeight, + groupMargin: + ROW_CELL_SIZE_CONFIG[rowHeight]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin, + }); + + startIndex.current = windowEdges.startIndex; + endIndex.current = windowEdges.endIndex; + + virtualizedUpdate(); + } + + function rowHoverHandler(row) { + if (activeRowKey.current === null) { + if (typeof onRowHover === 'function') { + onRowHover(row.key); + } + hoveredRowKey.current = row.key; + updateHoveredRow(`rowKey-${row.key}`); + } + } + + function rowClickHandler(row) { + if (showRowClickBehaviour) { + if (activeRowKey.current === row.key) { + activeRowKey.current = null; + } else { + activeRowKey.current = row.key; + } + + updateFocusedRow(`rowKey-${activeRowKey.current}`); + } + + if (typeof onRowClick === 'function') { + onRowClick( + activeRowKey.current === null ? undefined : activeRowKey.current, + ); + } + } + + function updateHoveredRow(activeRowClass) { + const prevActiveRow = document.querySelectorAll('.Table__cell.focused'); + if (!!prevActiveRow && prevActiveRow.length > 0) { + prevActiveRow.forEach((cell) => cell.classList.remove('focused')); + } + if (activeRowClass !== 'rowKey-null') { + window.requestAnimationFrame(() => { + const prevHoveredRow = document.querySelectorAll( + '.Table__cell.hovered', + ); + if (!!prevHoveredRow && prevHoveredRow.length > 0) { + prevHoveredRow.forEach((cell) => cell.classList.remove('hovered')); + } + + const activeRow = document.querySelectorAll( + `.Table__cell.${activeRowClass}`, + ); + + if (!!activeRow && activeRow.length > 0) { + activeRow.forEach((cell) => cell.classList.add('hovered')); + } + }); + } + } + + function updateFocusedRow(activeRowClass) { + const prevHoveredRow = document.querySelectorAll('.Table__cell.hovered'); + if (!!prevHoveredRow && prevHoveredRow.length > 0) { + prevHoveredRow.forEach((cell) => cell.classList.remove('hovered')); + } + if (activeRowClass !== 'rowKey-null') { + window.requestAnimationFrame(() => { + const prevActiveRow = document.querySelectorAll('.Table__cell.focused'); + if (!!prevActiveRow && prevActiveRow.length > 0) { + prevActiveRow.forEach((cell) => cell.classList.remove('focused')); + } + + const activeRow = document.querySelectorAll( + `.Table__cell.${activeRowClass}`, + ); + + if (!!activeRow && activeRow.length > 0) { + activeRow.forEach((cell) => cell.classList.add('focused')); + } + }); + } + } + + function setListWindowMeasurements() { + const leftPane = + tableContainerRef.current?.querySelector('.Table__pane--left'); + const rightPane = tableContainerRef.current?.querySelector( + '.Table__pane--right', + ); + let availableSpace = tableContainerRef.current?.offsetWidth ?? 0; + + if (leftPane || rightPane) { + availableSpace = + tableContainerRef.current.offsetWidth - + (leftPane?.offsetWidth ?? 0) - + (rightPane?.offsetWidth ?? 0) - + 32; // the selection section (checkboxes) + } + + setListWindow({ + top: tableContainerRef.current?.scrollTop, + left: tableContainerRef.current?.scrollLeft, + height: tableContainerRef.current?.offsetHeight, + width: tableContainerRef.current?.offsetWidth, + availableSpace, + }); + } + + function onToggleDeletePopup() { + setIsOpenDeleteSelectedPopup(!isOpenDeleteSelectedPopup); + } + + function onToggleArchivePopup() { + setIsOpenArchiveSelectedPopup(!isOpenArchiveSelectedPopup); + } + + function onToggleUnarchivePopup() { + setIsOpenUnarchiveSelectedPopup(!isOpenUnarchiveSelectedPopup); + } + + function onHideSelectedItems() { + onBatchRowsVisibilityChange('hide'); + } + + function onShowSelectedItems() { + onBatchRowsVisibilityChange('show'); + } + + function onBatchRowsVisibilityChange(changeMode: 'hide' | 'show') { + let data: any[] = []; + const selectedRowsValues = Object.values(selectedRows); + selectedRowsValues.forEach((selectedRow: any) => { + if (changeMode === 'hide') { + if (!selectedRow.isHidden) { + data.push(selectedRow.key); + } + } else { + if (selectedRow.isHidden) { + data.push(selectedRow.key); + } + } + }); + + onRowsVisibilityChange(data); + onRowSelect({ actionType: 'removeAll', data: selectedRowsValues }); + } + + React.useEffect(() => { + if (custom && !!tableContainerRef.current) { + const windowEdges = calculateWindow({ + scrollTop: tableContainerRef.current.scrollTop, + offsetHeight: tableContainerRef.current.offsetHeight, + scrollHeight: tableContainerRef.current.scrollHeight, + itemHeight: rowHeight, + groupMargin: + ROW_CELL_SIZE_CONFIG[rowHeight]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin, + }); + + startIndex.current = windowEdges.startIndex; + endIndex.current = windowEdges.endIndex; + + virtualizedUpdate(); + + tableContainerRef.current.onscroll = ({ target }) => { + const windowEdges = calculateWindow({ + scrollTop: target.scrollTop, + offsetHeight: target.offsetHeight, + scrollHeight: target.scrollHeight, + itemHeight: rowHeight, + groupMargin: + ROW_CELL_SIZE_CONFIG[rowHeight]?.groupMargin ?? + ROW_CELL_SIZE_CONFIG[RowHeightSize.md].groupMargin, + }); + + startIndex.current = windowEdges.startIndex; + endIndex.current = windowEdges.endIndex; + virtualizedUpdate(); + + const isDownScrolling = + scrollTopMutableRef.current.top < target.scrollTop; + scrollTopMutableRef.current.top = target.scrollTop; + + if ( + props.allowInfiniteLoading && + props.infiniteLoadHandler && + isDownScrolling + ) { + if ( + target.scrollTop + target.offsetHeight > + target.scrollHeight - 2 * rowHeight + ) { + props.infiniteLoadHandler(); + } + } + setListWindowMeasurements(); + }; + } + + return () => { + if (custom && tableContainerRef.current) { + // eslint-disable-next-line react-hooks/exhaustive-deps + tableContainerRef.current.onscroll = null; + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [custom, rowData]); + + React.useEffect(() => { + if (custom) { + setListWindowMeasurements(); + } + }, [custom, columnsWidths, rowData]); + + React.useEffect(() => { + if (custom) { + requestAnimationFrame(() => { + if (!activeRowKey.current) { + updateHoveredRow( + `rowKey-${ + activeRowKey.current + ? activeRowKey.current + : hoveredRowKey.current + }`, + ); + } + }); + } + }, [custom, listWindow]); + + const observerReturnCallback = React.useCallback(() => { + setListWindowMeasurements(); + }, []); + + React.useEffect(() => { + const tableBulkActionsVisibility: { + delete: boolean; + archive: boolean; + unarchive: boolean; + hideItems: boolean; + showItems: boolean; + } = { + delete: false, + archive: false, + unarchive: false, + hideItems: false, + showItems: false, + }; + const values = Object.values(selectedRows || {}); + values.forEach((value) => { + if ( + !tableBulkActionsVisibility.delete || + !tableBulkActionsVisibility.archive || + !tableBulkActionsVisibility.unarchive || + !tableBulkActionsVisibility.hideItems || + !tableBulkActionsVisibility.showItems + ) { + if (value.archived) { + tableBulkActionsVisibility.archive = true; + } else { + tableBulkActionsVisibility.unarchive = true; + } + if (value.end_time) { + tableBulkActionsVisibility.delete = true; + } + if (onRowsVisibilityChange) { + if (value.isHidden) { + tableBulkActionsVisibility.showItems = true; + } else { + tableBulkActionsVisibility.hideItems = true; + } + } + } + }); + + setTableBulkActionsVisibility(tableBulkActionsVisibility); + }, [selectedRows, onRowsVisibilityChange]); + + const sortPopoverChanged: boolean = React.useMemo(() => { + return ( + TABLE_DEFAULT_CONFIG[appName as Exclude]?.sortFields + ?.length !== sortFields?.length + ); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [sortFields]); + + useResizeObserver( + observerReturnCallback, + tableContainerRef, + sortPopoverChanged, + ); + + const isDiffButtonDisabled: boolean = React.useMemo(() => { + if (sameValueColumns) { + let filteredColumns: string[] = sameValueColumns?.filter( + (value) => + !TABLE_DEFAULT_CONFIG[appName].nonHidableColumns.has(value) && + !hiddenColumns?.includes(value), + ); + return !filteredColumns.length; + } + }, [appName, sameValueColumns, hiddenColumns]); + + const selectedRunsQuery: string = React.useMemo(() => { + if (!_.isEmpty(selectedRows)) { + return `run.hash in [${_.uniq( + Object.values(selectedRows)?.map((row: any) => `"${row.runHash}"`), + ).join(',')}]`; + } + }, [selectedRows]); + + // The right check is !props.isInfiniteLoading && (isLoading || isNil(rowData)) + // but after setting isInfiniteLoading to true, the rowData becomes null, unnecessary renders happening + // @TODO sanitize this point + return ( + + {!isEmpty(rowData) ? ( +
+ {!hideHeaderActions && isEmpty(selectedRows) ? ( +
+ {showResizeContainerActionBar && ( + + )} + +
+ {onManageColumns && ( + item.key !== '#' && item.key !== 'actions', + )} + columnsOrder={columnsOrder} + hiddenColumns={hiddenColumns} + hideSystemMetrics={hideSystemMetrics} + onManageColumns={onManageColumns} + onColumnsVisibilityChange={onColumnsVisibilityChange} + appName={appName} + /> + )} + {onRowsChange && ( + + )} + {onSort && ( + ( + + )} + component={ + + } + /> + )} + {onRowHeightChange && ( + + )} + {onMetricsValueKeyChange && ( + + )} +
+ {onTableDiffShow && ( + + )} + {onExport && ( +
+ +
+ )} +
+ ) : !hideHeaderActions && !isEmpty(selectedRows) && multiSelect ? ( +
+
+ + {Object.keys(selectedRows).length} Selected + +
+ {tableBulkActionsVisibility.delete && ( +
+ +
+ )} + {tableBulkActionsVisibility.unarchive && ( +
+ +
+ )} + {tableBulkActionsVisibility.archive && ( +
+ +
+ )} + {tableBulkActionsVisibility.hideItems && ( +
+ +
+ )} + {tableBulkActionsVisibility.showItems && ( +
+ +
+ )} +
+ +
+
+ ) : ( + '' + )} +
+ + {({ width, height }) => + custom ? ( +
+ + !col.isHidden)} + onGroupExpandToggle={onGroupExpandToggle} + onRowHover={rowHoverHandler} + onRowClick={ + showRowClickBehaviour ? rowClickHandler : undefined + } + listWindow={listWindow} + multiSelect={multiSelect} + selectedRows={selectedRows || {}} + onRowSelect={onRowSelect} + columnsColorScales={columnsColorScales} + onToggleColumnsColorScales={onToggleColumnsColorScales} + noColumnActions={noColumnActions} + {...props} + /> + +
+ ) : ( + + rowData[rowIndex]?.rowProps} + sortBy={{}} + useIsScrolling={false} + overscanRowCount={1} + onEndReachedThreshold={500} + getScrollbarSize={() => null} + ignoreFunctionInColumnCompare={false} + onScroll={() => null} + onRowsRendered={() => null} + onScrollbarPresenceChange={() => null} + onRowExpand={() => null} + onExpandedRowsChange={() => null} + onColumnSort={() => null} + onColumnResize={() => null} + onColumnResizeEnd={() => null} + onRowHover={onRowHover} + onRowClick={onRowClick} + disableRowClick={disableRowClick} + /> + + ) + } +
+
+ + + +
+ ) : ( + + )} +
+ ); +}); + +function propsComparator( + prevProps: ITableProps, + nextProps: ITableProps, +): boolean { + // Add custom here checks here + + if (prevProps.isLoading !== nextProps.isLoading) { + return false; + } + + if (prevProps.rowHeight !== nextProps.rowHeight) { + return false; + } + + if (prevProps.metricsValueKey !== nextProps.metricsValueKey) { + return false; + } + + if (prevProps.sortFields !== nextProps.sortFields) { + return false; + } + + if (prevProps.resizeMode !== nextProps.resizeMode) { + return false; + } + + if (prevProps.columnsWidths !== nextProps.columnsWidths) { + return false; + } + + if (prevProps.selectedRows !== nextProps.selectedRows) { + return false; + } + + if (prevProps.hiddenColumns !== nextProps.hiddenColumns) { + return false; + } + + if (prevProps.hiddenChartRows !== nextProps.hiddenChartRows) { + return false; + } + + if (prevProps.columnsOrder !== nextProps.columnsOrder) { + return false; + } + + if (prevProps.focusedState?.active !== nextProps.focusedState?.active) { + return false; + } + + if (prevProps.columnsColorScales !== nextProps.columnsColorScales) { + return false; + } + + if (!isEqual(prevProps.illustrationConfig, nextProps.illustrationConfig)) { + return false; + } + + return true; +} + +export default React.memo(Table, propsComparator); diff --git a/src/src/components/Table/TableCell.tsx b/src/src/components/Table/TableCell.tsx new file mode 100644 index 00000000..eb8e98b7 --- /dev/null +++ b/src/src/components/Table/TableCell.tsx @@ -0,0 +1,28 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { toString } from './utils'; + +/** + * Cell component for BaseTable + */ +const TableCell = ({ + className, + cellData, + column, + columnIndex, + rowData, + rowIndex, +}) => ( + +
+ {React.isValidElement(cellData) ? cellData : toString(cellData)} +
+
+); + +export default TableCell; diff --git a/src/src/components/Table/TableHeader.tsx b/src/src/components/Table/TableHeader.tsx new file mode 100644 index 00000000..0e2c5f25 --- /dev/null +++ b/src/src/components/Table/TableHeader.tsx @@ -0,0 +1,74 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +class TableHeader extends React.PureComponent { + constructor(props) { + super(props); + + this.renderHeaderRow = this.renderHeaderRow.bind(this); + this.renderFrozenRow = this.renderFrozenRow.bind(this); + this._setRef = this._setRef.bind(this); + } + + scrollTo(offset) { + if (this.headerRef) this.headerRef.scrollLeft = offset; + } + + renderHeaderRow(height, index) { + const { columns, headerRenderer } = this.props; + if (height <= 0) return null; + + const style = { width: '100%', height }; + return headerRenderer({ style, columns, headerIndex: index }); + } + + renderFrozenRow(rowData, index) { + const { columns, rowHeight, rowRenderer } = this.props; + const style = { width: '100%', height: rowHeight }; + // for frozen row the `rowIndex` is negative + const rowIndex = -index - 1; + return rowRenderer({ style, columns, rowData, rowIndex }); + } + + render() { + const { className, width, height, rowWidth, headerHeight, frozenData } = + this.props; + if (height <= 0) return null; + + const style = { + width, + height: height, + position: 'relative', + overflow: 'hidden', + }; + + const innerStyle = { + width: rowWidth, + height, + }; + + const rowHeights = Array.isArray(headerHeight) + ? headerHeight + : [headerHeight]; + return ( + +
+
+ {rowHeights.map(this.renderHeaderRow)} + {frozenData.map(this.renderFrozenRow)} +
+
+
+ ); + } + + _setRef(ref) { + this.headerRef = ref; + } +} + +export default TableHeader; diff --git a/src/src/components/Table/TableHeaderCell.tsx b/src/src/components/Table/TableHeaderCell.tsx new file mode 100644 index 00000000..aa3b9dbc --- /dev/null +++ b/src/src/components/Table/TableHeaderCell.tsx @@ -0,0 +1,17 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +/** + * HeaderCell component for BaseTable + */ +const TableHeaderCell = ({ className, column, columnIndex }) => ( + +
{column.title}
+
+); + +export default TableHeaderCell; diff --git a/src/src/components/Table/TableHeaderRow.tsx b/src/src/components/Table/TableHeaderRow.tsx new file mode 100644 index 00000000..f1770f45 --- /dev/null +++ b/src/src/components/Table/TableHeaderRow.tsx @@ -0,0 +1,47 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { renderElement } from './utils'; + +/** + * HeaderRow component for BaseTable + */ +const TableHeaderRow = ({ + className, + style, + columns, + headerIndex, + cellRenderer, + headerRenderer, + expandColumnKey, + expandIcon: ExpandIcon, + ...rest +}) => { + let cells = columns.map((column, columnIndex) => + cellRenderer({ + columns, + column, + columnIndex, + headerIndex, + expandIcon: column.key === expandColumnKey && , + }), + ); + + if (headerRenderer) { + cells = renderElement(headerRenderer, { cells, columns, headerIndex }); + } + + return ( + +
+ {cells} +
+
+ ); +}; + +export default TableHeaderRow; diff --git a/src/src/components/Table/TableRow.tsx b/src/src/components/Table/TableRow.tsx new file mode 100644 index 00000000..1b0363e8 --- /dev/null +++ b/src/src/components/Table/TableRow.tsx @@ -0,0 +1,206 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { renderElement } from './utils'; + +/** + * Row component for BaseTable + */ +class TableRow extends React.PureComponent { + constructor(props) { + super(props); + + this.state = { + measured: false, + }; + + this._setRef = this._setRef.bind(this); + this._handleExpand = this._handleExpand.bind(this); + } + + componentDidMount() { + this.props.estimatedRowHeight && + this.props.rowIndex >= 0 && + this._measureHeight(true); + } + + componentDidUpdate(prevProps, prevState) { + if ( + this.props.estimatedRowHeight && + this.props.rowIndex >= 0 && + // should not re-measure if it's updated after measured and reset + !this.props.getIsResetting() && + this.state.measured && + prevState.measured + ) { + this.setState({ measured: false }, () => this._measureHeight()); + } + } + + render() { + /* eslint-disable no-unused-vars */ + const { + isScrolling, + className, + style, + columns, + rowIndex, + rowData, + expandColumnKey, + depth, + rowEventHandlers, + estimatedRowHeight, + rowRenderer, + cellRenderer, + expandIconRenderer, + // omit the following from rest + rowKey, + getIsResetting, + onRowHover, + onRowExpand, + onRowHeightChange, + onRowClick, + ...rest + } = this.props; + /* eslint-enable no-unused-vars */ + + const expandIcon = expandIconRenderer({ + rowData, + rowIndex, + depth, + onExpand: this._handleExpand, + }); + let cells = columns.map((column, columnIndex) => + cellRenderer({ + isScrolling, + columns, + column, + columnIndex, + rowData, + rowIndex, + expandIcon: column.key === expandColumnKey && expandIcon, + }), + ); + + if (rowRenderer) { + cells = renderElement(rowRenderer, { + isScrolling, + cells, + columns, + rowData, + rowIndex, + depth, + }); + } + + const eventHandlers = this._getEventHandlers(rowEventHandlers); + + if (estimatedRowHeight && rowIndex >= 0) { + const { height, ...otherStyles } = style; + return ( +
+ {cells} +
+ ); + } + + return ( + +
+ {cells} +
+
+ ); + } + + _setRef(ref) { + this.ref = ref; + } + + _handleExpand(expanded) { + const { onRowExpand, rowData, rowIndex, rowKey } = this.props; + onRowExpand && onRowExpand({ expanded, rowData, rowIndex, rowKey }); + } + + _measureHeight(initialMeasure) { + if (!this.ref) return; + + const { style, rowKey, onRowHeightChange, rowIndex, columns } = this.props; + const height = this.ref.getBoundingClientRect().height; + this.setState({ measured: true }, () => { + if (initialMeasure || height !== style.height) + onRowHeightChange( + rowKey, + height, + rowIndex, + columns[0] && !columns[0].__placeholder__ && columns[0].frozen, + ); + }); + } + + _getEventHandlers(handlers = {}) { + const { rowData, rowIndex, rowKey, onRowHover, onRowClick } = this.props; + const eventHandlers = {}; + Object.keys(handlers).forEach((eventKey) => { + const callback = handlers[eventKey]; + if (typeof callback === 'function') { + eventHandlers[eventKey] = (event) => { + callback({ rowData, rowIndex, rowKey, event }); + }; + } + }); + + if (onRowHover) { + const mouseEnterHandler = eventHandlers['onMouseEnter']; + eventHandlers['onMouseEnter'] = (event) => { + onRowHover({ + hovered: true, + rowData, + rowIndex, + rowKey, + event, + }); + mouseEnterHandler && mouseEnterHandler(event); + }; + + const mouseLeaveHandler = eventHandlers['onMouseLeave']; + eventHandlers['onMouseLeave'] = (event) => { + onRowHover({ + hovered: false, + rowData, + rowIndex, + rowKey, + event, + }); + mouseLeaveHandler && mouseLeaveHandler(event); + }; + } + + if (onRowClick) { + const clickHandler = eventHandlers['onClick']; + eventHandlers['onClick'] = (event) => { + onRowClick({ + rowData, + rowIndex, + rowKey, + event, + }); + clickHandler && clickHandler(event); + }; + } + + return eventHandlers; + } +} + +export default TableRow; diff --git a/src/src/components/Table/TableSortIcons.tsx b/src/src/components/Table/TableSortIcons.tsx new file mode 100644 index 00000000..3d5223e5 --- /dev/null +++ b/src/src/components/Table/TableSortIcons.tsx @@ -0,0 +1,33 @@ +import React from 'react'; + +import { Icon, Button } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +type Props = { + sort: string | null; + onSort: () => void; +}; + +export default function TableSortIcons( + props: Props, +): React.FunctionComponentElement { + return ( + + + + ); +} diff --git a/src/src/components/Table/utils.ts b/src/src/components/Table/utils.ts new file mode 100644 index 00000000..8f6346ef --- /dev/null +++ b/src/src/components/Table/utils.ts @@ -0,0 +1,239 @@ +// @ts-nocheck +/* eslint-disable react/prop-types */ + +import React from 'react'; + +export function renderElement(renderer, props) { + if (React.isValidElement(renderer)) { + if (!props) return renderer; + return React.cloneElement(renderer, props); + } else if (typeof renderer === 'function') { + if (renderer.prototype && renderer.prototype.isReactComponent) { + return React.createElement(renderer, props); + } else if (renderer.defaultProps) { + return renderer({ ...renderer.defaultProps, ...props }); + } + return renderer(props); + } else { + return null; + } +} + +export function normalizeColumns(elements) { + const columns = []; + React.Children.forEach(elements, (element) => { + if (React.isValidElement(element) && element.key) { + const column = { ...element.props, key: element.key }; + columns.push(column); + } + }); + return columns; +} + +export function isObjectEqual(objA, objB, ignoreFunction = true) { + if (objA === objB) return true; + if (objA === null && objB === null) return true; + if (objA === null || objB === null) return false; + if (typeof objA !== 'object' || typeof objB !== 'object') return false; + + const keysA = Object.keys(objA); + const keysB = Object.keys(objB); + if (keysA.length !== keysB.length) return false; + + for (let i = 0; i < keysA.length; i++) { + const key = keysA[i]; + + if (key === '_owner' && objA.$$typeof) { + // React-specific: avoid traversing React elements' _owner. + // _owner contains circular references + // and is not needed when comparing the actual elements (and not their owners) + continue; + } + + const valueA = objA[key]; + const valueB = objB[key]; + const valueAType = typeof valueA; + + if (valueAType !== typeof valueB) return false; + if (valueAType === 'function' && ignoreFunction) continue; + if (valueAType === 'object') { + if (!isObjectEqual(valueA, valueB, ignoreFunction)) return false; + else continue; + } + if (valueA !== valueB) return false; + } + return true; +} + +export function callOrReturn(funcOrValue, ...args) { + return typeof funcOrValue === 'function' ? funcOrValue(...args) : funcOrValue; +} + +export function hasChildren(data) { + return Array.isArray(data.children) && data.children.length > 0; +} + +export function unflatten( + array, + rootId = null, + dataKey = 'id', + parentKey = 'parentId', +) { + const tree = []; + const childrenMap = {}; + + const length = array.length; + for (let i = 0; i < length; i++) { + const item = { ...array[i] }; + const id = item[dataKey]; + const parentId = item[parentKey]; + + if (Array.isArray(item.children)) { + childrenMap[id] = item.children.concat(childrenMap[id] || []); + } else if (!childrenMap[id]) { + childrenMap[id] = []; + } + item.children = childrenMap[id]; + + if (parentId !== undefined && parentId !== rootId) { + if (!childrenMap[parentId]) childrenMap[parentId] = []; + childrenMap[parentId].push(item); + } else { + tree.push(item); + } + } + + return tree; +} + +export function flattenOnKeys(tree, keys, depthMap = {}, dataKey = 'id') { + if (!keys || !keys.length) return tree; + + const array = []; + const keysSet = new Set(); + keys.forEach((x) => keysSet.add(x)); + + let stack = [].concat(tree); + stack.forEach((x) => (depthMap[x[dataKey]] = 0)); + while (stack.length > 0) { + const item = stack.shift(); + + array.push(item); + if ( + keysSet.has(item[dataKey]) && + Array.isArray(item.children) && + item.children.length > 0 + ) { + stack = [].concat(item.children, stack); + item.children.forEach( + (x) => (depthMap[x[dataKey]] = depthMap[item[dataKey]] + 1), + ); + } + } + + return array; +} + +// Babel7 changed the behavior of @babel/plugin-transform-spread in https://github.com/babel/babel/pull/6763 +// [...array] is transpiled to array.concat() while it was [].concat(array) before +// this change breaks immutable array(seamless-immutable), [...array] should always return mutable array +export function cloneArray(array) { + if (!Array.isArray(array)) return []; + return [].concat(array); +} + +export function noop() { + return null; +} + +export function toString(value) { + if (typeof value === 'string') return value; + if (value === null || value === undefined) return ''; + return value.toString ? value.toString() : ''; +} + +// copied from https://www.30secondsofcode.org/js/s/debounce +export const debounce = (fn, ms = 0) => { + let timeoutId; + return function (...args) { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => fn.apply(this, args), ms); + }; +}; + +// copied from https://www.30secondsofcode.org/js/s/throttle +export const throttle = (fn, wait) => { + let inThrottle, lastFn, lastTime; + return function (...args) { + if (!inThrottle) { + fn.apply(this, args); + lastTime = Date.now(); + inThrottle = true; + } else { + clearTimeout(lastFn); + lastFn = setTimeout(() => { + if (Date.now() - lastTime >= wait) { + fn.apply(this, args); + lastTime = Date.now(); + } + }, Math.max(wait - (Date.now() - lastTime), 0)); + } + }; +}; + +// copied from https://github.com/react-bootstrap/dom-helpers +let scrollbarSize; +export function getScrollbarSize(recalculate) { + if ((!scrollbarSize && scrollbarSize !== 0) || recalculate) { + if ( + typeof window !== 'undefined' && + window.document && + window.document.createElement + ) { + const scrollDiv = document.createElement('div'); + + scrollDiv.style.position = 'absolute'; + scrollDiv.style.top = '-9999px'; + scrollDiv.style.width = '50px'; + scrollDiv.style.height = '50px'; + scrollDiv.style.overflow = 'scroll'; + + document.body.appendChild(scrollDiv); + scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + } + } + + return scrollbarSize; +} + +export function addClassName(el, className) { + if (el.classList) { + el.classList.add(className); + } else { + if (!el.className.match(new RegExp(`(?:^|\\s)${className}(?!\\S)`))) { + el.className += ` ${className}`; + } + } +} + +export function removeClassName(el, className) { + if (el.classList) { + el.classList.remove(className); + } else { + el.className = el.className.replace( + new RegExp(`(?:^|\\s)${className}(?!\\S)`, 'g'), + '', + ); + } +} + +export function getEstimatedTotalRowsHeight(data, estimatedRowHeight) { + return typeof estimatedRowHeight === 'function' + ? data.reduce( + (height, rowData, rowIndex) => + height + estimatedRowHeight({ rowData, rowIndex }), + 0, + ) + : data.length * estimatedRowHeight; +} diff --git a/src/src/components/TableLoader/TableLoader.scss b/src/src/components/TableLoader/TableLoader.scss new file mode 100644 index 00000000..0e288096 --- /dev/null +++ b/src/src/components/TableLoader/TableLoader.scss @@ -0,0 +1,14 @@ +.TableLoader__container { + height: 100%; + width: 100%; + display: flex; + flex-direction: column; + padding: 0 1.5rem; +} +.TableLoader__raw { + display: flex; + height: 2.5rem; + .MuiSkeleton-root { + margin-right: 2rem; + } +} diff --git a/src/src/components/TableLoader/TableLoader.tsx b/src/src/components/TableLoader/TableLoader.tsx new file mode 100644 index 00000000..ae66198f --- /dev/null +++ b/src/src/components/TableLoader/TableLoader.tsx @@ -0,0 +1,60 @@ +import React from 'react'; + +import { Skeleton } from '@material-ui/lab'; + +import './TableLoader.scss'; + +function TableLoader(): React.FunctionComponentElement { + return ( +
+
+ + + + +
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+ ); +} + +export default React.memo(TableLoader); diff --git a/src/src/components/TagForm/TagForm.scss b/src/src/components/TagForm/TagForm.scss new file mode 100644 index 00000000..34075147 --- /dev/null +++ b/src/src/components/TagForm/TagForm.scss @@ -0,0 +1,85 @@ +@import 'src/styles/abstracts/_variables.scss'; + +.TagForm { + &__tagFormContainer { + padding: 20px; + border-bottom: 1px solid #f2f5fa; + &__TextField { + width: 100%; + margin-top: $space-xxxs; + margin-bottom: 20px; + } + + &__colorContainer { + margin-bottom: 20px; + &__colorBox { + margin-top: $space-xxxs; + padding: 5px; + border: $border-grey-lighter; + border-radius: 6px; + width: 100%; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + &__colorButton { + border-radius: $border-radius-circle; + margin: 5px; + width: 50px; + height: 50px; + min-width: auto; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + .MuiButton-label { + width: 34px; + height: 34px; + border-radius: $border-radius-circle; + display: flex; + justify-content: center; + align-items: center; + position: relative; + } + &__content { + width: 34px; + height: 34px; + border-radius: $border-radius-circle; + opacity: 0.2; + } + &__circle { + position: absolute; + top: 50%; + left: 50%; + width: 16px; + height: 16px; + border-radius: $border-radius-circle; + transform: translate(-50%, -50%); + } + } + } + } + &__previewContainer { + &__tagPreviewBox { + margin-top: $space-xxxs; + border: $border-grey-lighter; + border-radius: 6px; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + height: 56px; + position: relative; + padding: 0 0.5rem; + } + } + } + &__tagFormFooterContainer { + height: 64px; + display: flex; + justify-content: center; + align-items: center; + &__cancelButton { + margin-right: $space-sm; + } + } +} diff --git a/src/src/components/TagForm/TagForm.tsx b/src/src/components/TagForm/TagForm.tsx new file mode 100644 index 00000000..3a123dc0 --- /dev/null +++ b/src/src/components/TagForm/TagForm.tsx @@ -0,0 +1,238 @@ +import React, { memo, useMemo } from 'react'; +import * as yup from 'yup'; +import { isEmpty, noop } from 'lodash-es'; +import { useFormik } from 'formik'; + +import { makeStyles } from '@material-ui/core'; +import { Button, TextField } from '@material-ui/core'; + +import { Badge, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import COLORS from 'config/colors/colors'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import tagsAppModel from 'services/models/tags/tagsAppModel'; +import { trackEvent } from 'services/analytics'; + +import { ITagFormProps } from 'types/components/TagForm/TagForm'; + +import './TagForm.scss'; + +const useStyles = makeStyles({ + tagColor: { + border: ({ colorName, color }: { color: string; colorName: string }) => + `1px solid ${colorName === color ? color : 'transparent'}`, + '&:hover, &:focus': { + border: ({ colorName }: { colorName: string }) => + `1px solid ${colorName} !important;`, + backgroundColor: 'inherit', + }, + }, +}); + +type TagColorWrapperProp = { + colorName: string; + onColorButtonClick: (colorName: string) => void; + color: string; +}; + +function TagColorWrapper({ + colorName, + onColorButtonClick, + color, +}: TagColorWrapperProp) { + const { tagColor } = useStyles({ color, colorName }); + return ( + + ); +} + +function TagForm({ + tagData, + editMode, + tagId, + onCloseModal, +}: ITagFormProps): React.FunctionComponentElement { + const formik = useFormik({ + initialValues: editMode + ? { + name: tagData?.name || '', + color: tagData?.color || COLORS[0][0], + comment: tagData?.description || '', + } + : { name: '', color: COLORS[0][0], comment: '' }, + onSubmit: noop, + validationSchema: yup.object({ + name: yup + .string() + .required('Required field') + .max(50, 'Must be 50 characters or fewer'), + comment: yup.string().max(100, 'Must be 100 characters or fewer'), + }), + }); + const { + values, + errors, + touched, + setFieldValue, + setValues, + setFieldTouched, + submitForm, + validateForm, + } = formik; + const { name, color, comment } = values; + + function onChange(e: React.ChangeEvent, fieldName: string) { + setFieldValue(fieldName, e?.target?.value, true).then(() => { + setFieldTouched(fieldName, true); + }); + } + + const colors = useMemo( + () => + COLORS[0].map((colorName, index) => ( + + )), + // eslint-disable-next-line react-hooks/exhaustive-deps + [color], + ); + + function onCreateButtonClick() { + trackEvent(ANALYTICS_EVENT_KEYS.tags.create); + + submitForm().then(() => + validateForm(values).then((errors) => { + if (isEmpty(errors)) { + tagsAppModel + .createTag({ name, color, description: comment }) + .then((res: any) => { + if (res.id) { + onCloseModal(); + tagsAppModel.getTagsData().call(); + } + }); + } + }), + ); + } + + function onSaveButtonClick() { + submitForm().then(() => + validateForm(values).then((errors) => { + if (isEmpty(errors)) { + tagsAppModel + .updateTag({ name, color, description: comment }, tagId || '') + .then(() => { + tagsAppModel.getTagsData().call(); + tagsAppModel.getTagById(tagId || '').call(); + onCloseModal(); + }); + } + }), + ); + } + + function onResetButtonClick() { + setValues( + { + name: tagData?.name || '', + color: tagData?.color || '', + comment: tagData?.description || '', + }, + true, + ); + } + + function onColorButtonClick(color: string) { + setFieldValue('color', color); + } + + return ( + +
+
+ + Name + + onChange(e, 'name')} + value={name} + size='small' + error={!!(touched.name && errors.name)} + helperText={touched.name && errors.name} + /> + + Comment + + onChange(e, 'comment')} + className='TagForm__tagFormContainer__TextField TextField__TextArea__OutLined__Small' + multiline + value={comment} + error={!!(touched.comment && errors.comment)} + helperText={touched.comment && errors.comment} + /> +
+ + Colors + +
+ {colors} +
+
+
+ + Preview + +
+ +
+
+
+
+ + +
+
+
+ ); +} + +export default memo(TagForm); diff --git a/src/src/components/Theme/Theme.tsx b/src/src/components/Theme/Theme.tsx new file mode 100644 index 00000000..be17dcd7 --- /dev/null +++ b/src/src/components/Theme/Theme.tsx @@ -0,0 +1,93 @@ +import React from 'react'; + +import { + unstable_createMuiStrictModeTheme as createMuiTheme, + ThemeOptions, + ThemeProvider, + StylesProvider, +} from '@material-ui/core'; + +import { IThemeProps } from 'types/components/Theme/Theme'; +// import useFontSize from 'hooks/fontSize/useFontSize'; + +export const ThemeContext = React.createContext({}); +const { Provider } = ThemeContext; + +const light: ThemeOptions = { + typography: { + fontFamily: 'Inter, sans-serif', + }, + overrides: { + MuiDivider: { + root: { + backgroundColor: '#E8F1FC', + }, + }, + MuiButton: { + root: { + height: 32, + boxShadow: 'unset', + }, + contained: { + boxShadow: 'unset', + }, + }, + }, + props: { + MuiButtonBase: { + disableRipple: true, + }, + }, + palette: { + type: 'light', + primary: { + main: '#1473E6', + }, + secondary: { + main: '#1c2852', + }, + text: { + primary: '#414B6D', + }, + }, + spacing: (factor: number) => `${factor}em`, +}; + +const darkTheme: ThemeOptions = { + palette: { + type: 'dark', + primary: { + main: '#64b5f6', + }, + text: { + // secondary: '#000', + }, + }, +}; + +function Theme( + props: IThemeProps, +): React.FunctionComponentElement { + const [dark, setDark] = React.useState(false); + // const fontSize = useFontSize(); + // + // React.useEffect(() => { + // document.getElementsByTagName('html')[0].style.fontSize = fontSize + 'px'; + // }, [fontSize]); + + const handleTheme = React.useCallback((): void => { + setDark(!dark); + }, [dark]); + + const theme = createMuiTheme(dark ? darkTheme : light); + return ( + + {/* */} + + {props.children} + + + ); +} + +export default Theme; diff --git a/src/src/components/TooltipContentPopover/TooltipContentPopover.scss b/src/src/components/TooltipContentPopover/TooltipContentPopover.scss new file mode 100644 index 00000000..32eb6999 --- /dev/null +++ b/src/src/components/TooltipContentPopover/TooltipContentPopover.scss @@ -0,0 +1,40 @@ +@use 'src/styles/abstracts' as *; + +.TooltipContentPopover { + width: 25rem; + padding: $space-xs; + display: flex; + flex-direction: column; + max-height: 20rem; + &__subtitle { + text-transform: uppercase; + margin: $space-xs 0; + } + &__Divider { + margin: $space-unit 0 $space-xs; + } + &__section { + margin: 0 $space-xs; + &:last-child { + padding-bottom: $space-unit; + } + } + &__option { + display: flex; + width: 100%; + overflow: hidden; + &__label { + margin-left: $space-xs; + max-width: 100%; + overflow: hidden; + word-break: break-all; + } + } + &__SelectedTagsContainer { + overflow: auto; + display: flex; + flex-wrap: wrap; + gap: $space-xxxs; + width: 100%; + } +} diff --git a/src/src/components/TooltipContentPopover/TooltipContentPopover.tsx b/src/src/components/TooltipContentPopover/TooltipContentPopover.tsx new file mode 100644 index 00000000..4aa783a8 --- /dev/null +++ b/src/src/components/TooltipContentPopover/TooltipContentPopover.tsx @@ -0,0 +1,208 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { Checkbox, Divider, TextField } from '@material-ui/core'; +import { Autocomplete } from '@material-ui/lab'; +import { + CheckBox as CheckBoxIcon, + CheckBoxOutlineBlank, +} from '@material-ui/icons'; + +import { Badge, SelectDropdown, Text, ToggleButton } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { ISelectDropdownOption } from 'components/kit/SelectDropdown'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { ITooltipContentPopoverProps } from 'types/components/TooltipContentPopover/TooltipContentPopover'; +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel.d'; + +import './TooltipContentPopover.scss'; + +function TooltipContentPopover({ + onChangeTooltip, + selectedFields = [], + tooltipAppearance = TooltipAppearanceEnum.Auto, + isTooltipDisplayed = true, + selectOptions, +}: ITooltipContentPopoverProps): React.FunctionComponentElement { + let [inputValue, setInputValue] = React.useState(''); + + function onSelectedFieldsChange( + e: any, + values: IGroupingSelectOption[], + ): void { + if (e?.code !== 'Backspace') { + handleSelect(values); + } else { + if (inputValue.length === 0) { + handleSelect(values); + } + } + } + + function handleSelect(values: IGroupingSelectOption[]) { + onChangeTooltip({ + selectedFields: values.map((item: IGroupingSelectOption) => + typeof item === 'string' ? item : item.value, + ), + }); + } + + const onDisplayTooltipChange = React.useCallback((): void => { + onChangeTooltip({ display: !isTooltipDisplayed }); + }, [onChangeTooltip, isTooltipDisplayed]); + + const onTooltipAppearanceChange = React.useCallback( + (value): void => { + onChangeTooltip({ appearance: value.value }); + }, + [onChangeTooltip], + ); + + const values: IGroupingSelectOption[] = React.useMemo(() => { + let data: { value: string; group: string; label: string }[] = []; + selectOptions.forEach((option) => { + if (selectedFields.indexOf(option.value) !== -1) { + data.push(option); + } + }); + + // Sort selected values by the order of their application + return data.sort( + (a, b) => + selectedFields.indexOf(a.value) - selectedFields.indexOf(b.value), + ); + }, [selectOptions, selectedFields]); + + const tooltipAppearanceOptions: ISelectDropdownOption[] = + React.useMemo(() => { + return Object.values(TooltipAppearanceEnum).map((option) => { + return { label: _.capitalize(option), value: option }; + }); + }, []); + + const options = React.useMemo(() => { + if (inputValue.trim() !== '') { + const filtered = selectOptions.filter((item) => { + return item.label.indexOf(inputValue) !== -1; + }); + + return filtered + .slice() + .sort( + (a, b) => a.label.indexOf(inputValue) - b.label.indexOf(inputValue), + ); + } + return selectOptions; + }, [selectOptions, inputValue]); + + return ( + +
+
+ + Select Fields To Display In The Tooltip + + option.group} + getOptionLabel={(option) => option.label} + getOptionSelected={(option, value) => option.value === value.value} + renderInput={(params) => ( + { + setInputValue(e.target.value); + }, + }} + className='TextField__OutLined__Small' + variant='outlined' + placeholder='Select Fields' + /> + )} + renderOption={(option, { selected }) => ( +
+ } + checkedIcon={} + style={{ marginRight: 4 }} + checked={selected} + /> + + {option.label} + +
+ )} + renderTags={(value, getTagProps) => ( +
+ {value.map((selected, i) => ( + + ))} +
+ )} + /> +
+ +
+ + Tooltip Visibility On Hover + + +
+ +
+ + Tooltip Appearance + + +
+
+
+ ); +} + +export default React.memo(TooltipContentPopover); diff --git a/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.d.ts b/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.d.ts new file mode 100644 index 00000000..3d70bb2d --- /dev/null +++ b/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.d.ts @@ -0,0 +1,6 @@ +import { ITrendlineOptions } from 'types/services/models/scatter/scatterAppModel'; + +export interface ITrendlineOptionsPopoverProps { + trendlineOptions: ITrendlineOptions; + onChangeTrendlineOptions: (options: Partial) => void; +} diff --git a/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.scss b/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.scss new file mode 100644 index 00000000..56568fda --- /dev/null +++ b/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.scss @@ -0,0 +1,47 @@ +@use 'src/styles/abstracts' as *; + +.TrendlineOptionsPopover { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + width: 400px; + padding: $space-xs 0; + &__section { + width: 100%; + display: flex; + flex-direction: column; + padding: 0 $space-xs; + } + &__bandwidth { + margin-top: $space-xs; + margin-bottom: $space-xxxs; + padding: 0 $space-xs; + &--disabled { + opacity: 0.2; + pointer-events: none; + } + + &__value { + display: flex; + align-items: center; + + &__subtitle { + text-transform: uppercase; + } + + &__number { + margin-left: $space-xs; + } + } + + &__Slider { + display: flex; + align-items: center; + margin: $space-xs 0; + .Slider { + margin: 0 $space-md; + } + } + } +} diff --git a/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.tsx b/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.tsx new file mode 100644 index 00000000..49af7a81 --- /dev/null +++ b/src/src/components/TrendlineOptionsPopover/TrendlineOptionsPopover.tsx @@ -0,0 +1,100 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { MenuItem } from '@material-ui/core'; + +import { Text, Slider } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { TrendlineTypeEnum } from 'utils/d3'; + +import { ITrendlineOptionsPopoverProps } from './TrendlineOptionsPopover.d'; + +import './TrendlineOptionsPopover.scss'; + +function TrendlineOptionsPopover({ + trendlineOptions, + onChangeTrendlineOptions, +}: ITrendlineOptionsPopoverProps): React.FunctionComponentElement { + function onTypeSelect(e: React.ChangeEvent): void { + const type = e.target?.getAttribute('data-name'); + if (trendlineOptions.type !== type) { + onChangeTrendlineOptions({ + type, + }); + } + } + + function onBandwidthChange( + event: React.ChangeEvent<{}>, + value: number | number[], + ) { + if (trendlineOptions.bandwidth !== value) { + onChangeTrendlineOptions({ + bandwidth: value as number, + }); + } + } + + return ( + +
+
+ + Simple Linear Regression + + + LOESS + +
+
+ + bandwidth: + + + {trendlineOptions.bandwidth} + +
+
+ 0.0 + `${val}`} + value={trendlineOptions.bandwidth} + onChange={onBandwidthChange} + aria-labelledby='track-false-slider' + track={false} + step={0.01} + max={1} + min={0} + /> + 1.0 +
+
+
+
+
+ ); +} + +export default React.memo(TrendlineOptionsPopover); diff --git a/src/src/components/TrendlineOptionsPopover/index.ts b/src/src/components/TrendlineOptionsPopover/index.ts new file mode 100644 index 00000000..ae995b06 --- /dev/null +++ b/src/src/components/TrendlineOptionsPopover/index.ts @@ -0,0 +1,3 @@ +import TrendlineOptionsPopover from './TrendlineOptionsPopover'; + +export default TrendlineOptionsPopover; diff --git a/src/src/components/VisualizationLegends/VisualizationLegends.d.ts b/src/src/components/VisualizationLegends/VisualizationLegends.d.ts new file mode 100644 index 00000000..b9a64beb --- /dev/null +++ b/src/src/components/VisualizationLegends/VisualizationLegends.d.ts @@ -0,0 +1,19 @@ +import { LegendsModeEnum } from 'utils/d3'; + +export interface IVisualizationLegendsProps { + data?: VisualizationLegendsDataType; + mode?: LegendsModeEnum; + readOnly?: boolean; +} + +export interface LegendColumnDataType { + value: string; + order?: number; + color?: string; + dasharray?: string; + chartIndex?: number; +} + +export interface LegendsDataType { + [key: string]: Record; +} diff --git a/src/src/components/VisualizationLegends/VisualizationLegends.scss b/src/src/components/VisualizationLegends/VisualizationLegends.scss new file mode 100644 index 00000000..7d656e2f --- /dev/null +++ b/src/src/components/VisualizationLegends/VisualizationLegends.scss @@ -0,0 +1,25 @@ +@use 'src/styles/abstracts' as *; + +.VisualizationLegends { + padding: $space-xs; + background-color: white; + height: 100%; + width: 100%; + &.pinned { + position: relative; + } + &.unpinned { + position: absolute; + right: 0; + opacity: 0.8; + box-shadow: 0 0 0 1px $grey-lighter; + &:hover { + opacity: 1 + } + } + &__container { + height: 100%; + width: 100%; + overflow: auto; + } +} diff --git a/src/src/components/VisualizationLegends/VisualizationLegends.tsx b/src/src/components/VisualizationLegends/VisualizationLegends.tsx new file mode 100644 index 00000000..006f25f5 --- /dev/null +++ b/src/src/components/VisualizationLegends/VisualizationLegends.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { drawLegends, LegendsModeEnum } from 'utils/d3'; + +import { IVisualizationLegendsProps } from '.'; + +import './VisualizationLegends.scss'; + +function VisualizationLegends(props: IVisualizationLegendsProps) { + const { data = {}, mode = LegendsModeEnum.PINNED, readOnly = false } = props; + const dataRef = React.useRef({}); + const containerRef = React.useRef(null); + + React.useEffect(() => { + if (containerRef.current && !_.isEqual(dataRef.current, data)) { + dataRef.current = data; + drawLegends({ + data, + containerNode: containerRef.current, + readOnly, + }); + } + }, [data, readOnly]); + + return ( + +
+
+
+ + ); +} + +VisualizationLegends.displayName = 'VisualizationLegends'; + +export default React.memo(VisualizationLegends); diff --git a/src/src/components/VisualizationLegends/index.ts b/src/src/components/VisualizationLegends/index.ts new file mode 100644 index 00000000..e758dec7 --- /dev/null +++ b/src/src/components/VisualizationLegends/index.ts @@ -0,0 +1,5 @@ +import VisualizationLegends from './VisualizationLegends'; + +export * from './VisualizationLegends.d'; + +export default VisualizationLegends; diff --git a/src/src/components/VisualizationTooltip/VisualizationTooltip.d.ts b/src/src/components/VisualizationTooltip/VisualizationTooltip.d.ts new file mode 100644 index 00000000..050e2e64 --- /dev/null +++ b/src/src/components/VisualizationTooltip/VisualizationTooltip.d.ts @@ -0,0 +1,21 @@ +import React from 'react'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +export interface IVisualizationTooltipProps { + id?: string; + children?: React.ReactNode; + elementRect: ElementRect; + open: boolean; + forceOpen?: boolean; + className?: string; + containerNode?: HTMLElement | null; + tooltipAppearance?: TooltipAppearanceEnum; +} + +export type ElementRect = { + top: number; + bottom: number; + left: number; + right: number; +} | null; diff --git a/src/src/components/VisualizationTooltip/VisualizationTooltip.scss b/src/src/components/VisualizationTooltip/VisualizationTooltip.scss new file mode 100644 index 00000000..35a1245f --- /dev/null +++ b/src/src/components/VisualizationTooltip/VisualizationTooltip.scss @@ -0,0 +1,35 @@ +@use 'src/styles/abstracts' as *; + +.VisualizationTooltip { + pointer-events: none; + z-index: 5 !important; + height: toRem(200px); // To not block table scroll + &.pinnedPopover { + width: 100%; + height: 100%; + } + > *:first-of-type { + height: toRem(200px); // To not block table scroll + } + &__content { + transform: none !important; + width: toRem(230px); + max-height: toRem(250px); + background: rgba(255, 255, 255, 0.78); + box-shadow: 0 1px 1px rgb(34 58 90 / 20%), 0 2px 2px rgb(34 58 90 / 20%), + 0 4px 4px rgb(34 58 90 / 20%), 0 6px 8px rgb(34 58 90 / 20%); + border: $border-main; + backdrop-filter: blur(3px); + overflow: unset; + &__pinned { + width: auto; + max-height: toRem(130px); + } + &__active { + background: $white; + } + &__hide { + visibility: hidden; + } + } +} diff --git a/src/src/components/VisualizationTooltip/VisualizationTooltip.tsx b/src/src/components/VisualizationTooltip/VisualizationTooltip.tsx new file mode 100644 index 00000000..35034ae9 --- /dev/null +++ b/src/src/components/VisualizationTooltip/VisualizationTooltip.tsx @@ -0,0 +1,161 @@ +import React from 'react'; +import classNames from 'classnames'; +import _ from 'lodash-es'; + +import { Popover, PopoverPosition } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import getPositionBasedOnOverflow from 'utils/getPositionBasedOnOverflow'; + +import { ElementRect, IVisualizationTooltipProps } from './'; + +import './VisualizationTooltip.scss'; + +function VisualizationTooltip(props: IVisualizationTooltipProps) { + let { + id = 'tooltip', + forceOpen = false, + open = false, + className = '', + containerNode = document.body, + tooltipAppearance = TooltipAppearanceEnum.Auto, + elementRect, + children, + } = props; + open = forceOpen || open; + + const [openPopover, setOpenPopover] = React.useState( + !!elementRect && open, + ); + const [popoverNode, setPopoverNode] = React.useState(); + const [popoverPos, setPopoverPos] = React.useState({ + top: 10000, + left: 10000, + }); + + const isPopoverPinned = React.useMemo( + () => + tooltipAppearance === TooltipAppearanceEnum.Top || + tooltipAppearance === TooltipAppearanceEnum.Bottom, + [tooltipAppearance], + ); + + const onPopoverPositionChange = React.useCallback( + (elementRect: ElementRect) => { + if (elementRect && popoverNode && containerNode) { + // Popover viewport need to be overflowed by chart container + const popoverRect = popoverNode.getBoundingClientRect(); + const containerRect = containerNode.getBoundingClientRect(); + + if (containerRect.width && containerRect.height) { + const posRect = { + top: elementRect.top - containerNode.scrollTop, + left: elementRect.left - containerNode.scrollLeft, + right: elementRect.right - containerNode.scrollLeft, + bottom: elementRect.bottom - containerNode.scrollTop, + }; + + const pos = getPositionBasedOnOverflow( + posRect, + popoverRect, + containerRect, + isPopoverPinned, + tooltipAppearance, + ); + setPopoverPos(pos); + } + } + }, + [containerNode, popoverNode, isPopoverPinned, tooltipAppearance], + ); + + React.useEffect(() => { + setOpenPopover(!!elementRect && open); + }, [elementRect, open]); + + React.useEffect(() => { + if (!!elementRect && openPopover) { + onPopoverPositionChange(elementRect); + } + }, [elementRect, openPopover, forceOpen, onPopoverPositionChange]); + + React.useEffect(() => { + if (containerNode) { + const onScrollEnd = _.debounce( + () => setOpenPopover(!!elementRect && open), + 300, + ); + const onScroll = _.debounce( + () => { + setOpenPopover(false); + }, + 200, + { + leading: true, + trailing: false, + }, + ); + + containerNode.addEventListener('scroll', onScroll); + containerNode.addEventListener('scroll', onScrollEnd); + return () => { + containerNode?.removeEventListener('scroll', onScroll); + containerNode?.removeEventListener('scroll', onScrollEnd); + }; + } + }, [elementRect, open, containerNode]); + + React.useEffect(() => { + const onMouseMove = ({ target }: any) => { + if ( + !forceOpen && + !containerNode?.contains(target) && + !popoverNode?.contains(target) + ) { + setOpenPopover(false); + } + }; + document.addEventListener('mousemove', onMouseMove); + return () => { + document.removeEventListener('mousemove', onMouseMove); + }; + }, [containerNode, popoverNode, forceOpen]); + + return ( + + + + ); +} + +export default React.memo(VisualizationTooltip); diff --git a/src/src/components/VisualizationTooltip/index.ts b/src/src/components/VisualizationTooltip/index.ts new file mode 100644 index 00000000..9fe9910f --- /dev/null +++ b/src/src/components/VisualizationTooltip/index.ts @@ -0,0 +1,5 @@ +import VisualizationTooltip from './VisualizationTooltip'; + +export * from './VisualizationTooltip.d'; + +export default VisualizationTooltip; diff --git a/src/src/components/ZoomInPopover/ZoomInPopover.scss b/src/src/components/ZoomInPopover/ZoomInPopover.scss new file mode 100644 index 00000000..f7a29ff3 --- /dev/null +++ b/src/src/components/ZoomInPopover/ZoomInPopover.scss @@ -0,0 +1,4 @@ +.ZoomInPopover { + width: 16.5rem; + padding: 0.5rem; +} diff --git a/src/src/components/ZoomInPopover/ZoomInPopover.tsx b/src/src/components/ZoomInPopover/ZoomInPopover.tsx new file mode 100644 index 00000000..15e31b9b --- /dev/null +++ b/src/src/components/ZoomInPopover/ZoomInPopover.tsx @@ -0,0 +1,45 @@ +import React from 'react'; + +import { MenuItem } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IZoomInPopoverProps } from 'types/components/ZoomInPopover/ZoomInPopover'; + +import { ZoomEnum } from 'utils/d3'; + +import './ZoomInPopover.scss'; + +function ZoomInPopover({ + mode, + onChange, +}: IZoomInPopoverProps): React.FunctionComponentElement { + function handleChange(e: React.ChangeEvent): void { + const value = e.target?.getAttribute('data-name'); + if (value && mode !== parseInt(value) && typeof onChange === 'function') { + onChange({ mode: parseInt(value), active: true }); + } + } + return ( + +
+ + Multiple Zooming + + + Single Zooming + +
+
+ ); +} + +export default React.memo(ZoomInPopover); diff --git a/src/src/components/ZoomOutPopover/ZoomOutPopover.scss b/src/src/components/ZoomOutPopover/ZoomOutPopover.scss new file mode 100644 index 00000000..3b582ce9 --- /dev/null +++ b/src/src/components/ZoomOutPopover/ZoomOutPopover.scss @@ -0,0 +1,4 @@ +.ZoomOutPopover { + width: 16.5rem; + padding: 0.5rem; +} diff --git a/src/src/components/ZoomOutPopover/ZoomOutPopover.tsx b/src/src/components/ZoomOutPopover/ZoomOutPopover.tsx new file mode 100644 index 00000000..de8c6201 --- /dev/null +++ b/src/src/components/ZoomOutPopover/ZoomOutPopover.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { MenuItem } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IZoomOutPopoverProps } from 'types/components/ZoomOutPopover/ZoomOutPopover'; + +import './ZoomOutPopover.scss'; + +function ZoomOutPopover({ + zoomHistory = [], + onChange, +}: IZoomOutPopoverProps): React.FunctionComponentElement { + const groupedHistory = _.groupBy(zoomHistory, (item) => item.id); + + function handleZoomOut(e: React.ChangeEvent): void { + const value = e.target?.getAttribute('data-name'); + if (value && typeof onChange === 'function') { + const index = _.findLastIndex(zoomHistory, (item) => item.id === value); + let changedHistory = [...zoomHistory]; + if (index || index === 0) { + changedHistory.splice(index, 1); + } + onChange({ history: changedHistory, active: false }); + } + } + + function handleResetZooming() { + if (typeof onChange === 'function') { + onChange?.({ history: [], active: false }); + } + } + return ( + +
+ {Object.keys(groupedHistory)?.map((id) => ( + + {`Zoom Out Chart ${id}`} + + ))} + Reset Zooming +
+
+ ); +} + +export default React.memo(ZoomOutPopover); diff --git a/src/src/components/kit/ActionCard/ActionCard.d.ts b/src/src/components/kit/ActionCard/ActionCard.d.ts new file mode 100644 index 00000000..c81595f1 --- /dev/null +++ b/src/src/components/kit/ActionCard/ActionCard.d.ts @@ -0,0 +1,12 @@ +import { TooltipProps } from '@material-ui/core/Tooltip'; + +import { IButtonProps } from 'components/kit'; + +export interface IActionCardProps { + title: string; + description: string; + btnTooltip: TooltipProps['title']; + btnText: string; + onAction: () => void; + btnProps: IButtonProps; +} diff --git a/src/src/components/kit/ActionCard/ActionCard.scss b/src/src/components/kit/ActionCard/ActionCard.scss new file mode 100644 index 00000000..21b00ea4 --- /dev/null +++ b/src/src/components/kit/ActionCard/ActionCard.scss @@ -0,0 +1,20 @@ +@use 'src/styles/abstracts' as *; + +.ActionCard { + width: 100%; + padding: $space-lg; + border: $border-grey; + border-radius: $border-radius-lg; + display: flex; + align-items: center; + justify-content: space-between; + background-color: $white; + &__infoBox { + display: flex; + flex-direction: column; + justify-content: space-between; + &__message { + margin-top: $space-xxxs; + } + } +} diff --git a/src/src/components/kit/ActionCard/ActionCard.tsx b/src/src/components/kit/ActionCard/ActionCard.tsx new file mode 100644 index 00000000..9c8b89e8 --- /dev/null +++ b/src/src/components/kit/ActionCard/ActionCard.tsx @@ -0,0 +1,48 @@ +import React from 'react'; + +import Tooltip from '@material-ui/core/Tooltip'; + +import { Button, Text } from 'components/kit'; + +import { IActionCardProps } from './ActionCard.d'; + +import './ActionCard.scss'; + +function ActionCard({ + title, + description, + btnTooltip, + btnText, + onAction, + btnProps, +}: IActionCardProps): React.FunctionComponentElement { + return ( +
+
+ + {title} + + + {description} + +
+ + +
+ +
+
+
+ ); +} + +ActionCard.displayName = 'ActionCard'; + +export default React.memo(ActionCard); diff --git a/src/src/components/kit/ActionCard/index.tsx b/src/src/components/kit/ActionCard/index.tsx new file mode 100644 index 00000000..16bcf76f --- /dev/null +++ b/src/src/components/kit/ActionCard/index.tsx @@ -0,0 +1,4 @@ +import ActionCard from './ActionCard'; +export * from './ActionCard.d'; + +export default ActionCard; diff --git a/src/src/components/kit/AlertBanner/AlertBanner.d.ts b/src/src/components/kit/AlertBanner/AlertBanner.d.ts new file mode 100644 index 00000000..8c16cb11 --- /dev/null +++ b/src/src/components/kit/AlertBanner/AlertBanner.d.ts @@ -0,0 +1,15 @@ +import { IconName } from 'components/kit/Icon/Icon'; + +type AlertBannerType = 'warning' | 'info' | 'error' | 'success'; + +export interface IAlertBannerProps { + children?: React.ReactNode; + type: AlertBannerType; + visibilityDuration?: number; + isVisiblePermanently?: boolean; +} + +export interface ITypeMetadata { + cssClassName: string; + iconName: IconName; +} diff --git a/src/src/components/kit/AlertBanner/AlertBanner.scss b/src/src/components/kit/AlertBanner/AlertBanner.scss new file mode 100644 index 00000000..93c5312d --- /dev/null +++ b/src/src/components/kit/AlertBanner/AlertBanner.scss @@ -0,0 +1,71 @@ +@use 'src/styles/abstracts' as *; + +.AlertBanner { + &_iconCnt { + width: 24px; + height: 24px; + margin: 8px; + font-size: 24px; + } + + &_warning { + @include backgroundColorOpacity($warning-color-25, 0.5); + + &_iconCnt { + color: $warning-color; + } + } + + &_info { + @include backgroundColorOpacity($primary-color-25, 0.5); + + &_iconCnt { + color: $primary-color; + } + } + + &_error { + @include backgroundColorOpacity($error-color-25, 0.5); + + &_iconCnt { + color: $error-color; + width: 20px; + height: 20px; + margin: 10px; + font-size: 20px; + } + } + + &_success { + @include backgroundColorOpacity($success-color-25, 0.5); + + &_iconCnt { + color: $success-color; + } + } + + position: fixed; + width: 100%; + display: flex; + font-size: 11px; + line-height: 40px; + align-items: center; + justify-content: center; + color: #414b6d; + z-index: 1; + + & > div { + display: flex; + width: 100%; + justify-content: center; + text-align: center; + } + + .MuiButton-root { + margin-left: 32px; + + .icon-close { + font-size: 10px; + } + } +} diff --git a/src/src/components/kit/AlertBanner/AlertBanner.tsx b/src/src/components/kit/AlertBanner/AlertBanner.tsx new file mode 100644 index 00000000..51388fd4 --- /dev/null +++ b/src/src/components/kit/AlertBanner/AlertBanner.tsx @@ -0,0 +1,67 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import { isNil } from 'lodash-es'; + +import { Icon, Button } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IAlertBannerProps } from './AlertBanner.d'; +import { typesMetadata } from './config'; + +import './AlertBanner.scss'; + +function AlertBanner({ + children, + type, + visibilityDuration = 6000, + isVisiblePermanently = false, +}: IAlertBannerProps): React.FunctionComponentElement { + const [isVisible, setIsVisible] = useState(true); + + const memoizedTypeMetadata = useMemo(() => { + return typesMetadata[type]; + }, [type]); + + const onClose = () => { + setIsVisible(false); + }; + + useEffect(() => { + let timeoutPath: any = null; + + if (!isVisiblePermanently) { + timeoutPath = setTimeout(onClose, visibilityDuration); + } + + return () => { + if (!isNil(timeoutPath)) { + clearTimeout(timeoutPath); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + <> + {isVisible && ( + +
+ +

{children}

+ +
+
+ )} + + ); +} + +AlertBanner.displayName = 'AlertBanner'; + +export default React.memo(AlertBanner); diff --git a/src/src/components/kit/AlertBanner/config.ts b/src/src/components/kit/AlertBanner/config.ts new file mode 100644 index 00000000..8e9208ff --- /dev/null +++ b/src/src/components/kit/AlertBanner/config.ts @@ -0,0 +1,30 @@ +import { ITypeMetadata } from './AlertBanner.d'; + +const warning: ITypeMetadata = { + cssClassName: 'warning', + iconName: 'warning-contained', +}; + +const info: ITypeMetadata = { + cssClassName: 'info', + iconName: 'circle-info', +}; + +const error: ITypeMetadata = { + cssClassName: 'error', + iconName: 'close-circle', +}; + +const success: ITypeMetadata = { + cssClassName: 'success', + iconName: 'success-icon', +}; + +const typesMetadata = { + warning, + info, + error, + success, +}; + +export { typesMetadata }; diff --git a/src/src/components/kit/AlertBanner/index.ts b/src/src/components/kit/AlertBanner/index.ts new file mode 100644 index 00000000..895e5836 --- /dev/null +++ b/src/src/components/kit/AlertBanner/index.ts @@ -0,0 +1,5 @@ +import AlertBanner from './AlertBanner'; + +export * from './AlertBanner.d'; + +export default AlertBanner; diff --git a/src/src/components/kit/AudioBox/AudioBox.d.ts b/src/src/components/kit/AudioBox/AudioBox.d.ts new file mode 100644 index 00000000..c214eaa0 --- /dev/null +++ b/src/src/components/kit/AudioBox/AudioBox.d.ts @@ -0,0 +1,5 @@ +export interface IAudioBoxProps { + data: any; + additionalProperties: any; + style: any; +} diff --git a/src/src/components/kit/AudioBox/AudioBox.scss b/src/src/components/kit/AudioBox/AudioBox.scss new file mode 100644 index 00000000..c3c02ac9 --- /dev/null +++ b/src/src/components/kit/AudioBox/AudioBox.scss @@ -0,0 +1,205 @@ +@use 'src/styles/abstracts' as *; + +.AudioBox { + max-width: toRem(268px); + &__controllers { + position: relative; + display: flex; + align-items: center; + padding: $space-xs; + background-color: $pico-5; + border-radius: $border-radius-main; + width: toRem(268px); + height: toRem(40px); + &__download { + min-width: 1.5rem; + } + &__player { + min-width: 1.5rem; + height: 1.5rem; + border-radius: $radius-main; + position: relative; + display: flex; + align-items: center; + justify-content: center; + transition: background-color 0.18s ease-out; + &:hover { + background-color: rgba(28, 40, 82, 0.04); + } + .Icon__container { + position: absolute; + z-index: 0; + font-size: $text-sm; + } + .MuiPaper-root { + height: 1.5rem; + width: 1.5rem; + display: flex; + align-items: center; + justify-self: center; + background-color: transparent; + box-shadow: unset; + .MuiGrid-root { + padding: 0; + display: flex; + svg { + font-size: $text-xxl; + color: transparent; + z-index: 1; + position: relative; + &:hover { + color: transparent; + } + } + } + } + } + &__timer { + display: flex; + span { + width: 2rem; + text-align: right; + @include monospaceFontFamily(); + &:last-child { + text-align: left; + } + } + &-long { + min-width: toRem(74px); + span { + min-width: 2.5rem; + text-align: right; + display: inline-block; + &:last-child { + text-align: left; + } + } + } + } + .Slider { + &:hover { + .MuiSlider-thumb { + opacity: 1; + visibility: visible; + } + .Mui-disabled { + .MuiSlider-thumb { + opacity: 0; + visibility: hidden; + } + } + } + + .MuiSlider { + &-root { + height: 0.375rem; + display: flex; + align-items: center; + } + &-rail, + &-track { + height: 0.125rem; + } + + &-thumb { + width: 0.5rem; + height: 0.5rem; + box-shadow: unset; + background-color: $primary-color; + margin-top: 0; + transition: opacity 0.18s ease-out; + opacity: 0; + visibility: hidden; + &:hover { + box-shadow: unset; + } + &::after { + // display: none; + width: toRem(18px); + height: toRem(22px); + top: toRem(-6px); + left: toRem(-5px); + } + } + } + } + + &__progressSlider { + margin: 0 $space-xxxs 0 $space-xxs; + height: toRem(40px); + .MuiSlider-root { + height: 100% !important; + } + } + &__volume { + margin: 0 $space-xxs 0 $space-xs; + position: relative; + button { + justify-content: flex-start; + } + &:hover { + .AudioBox__controllers__volume__Slider { + opacity: 1; + visibility: visible; + } + } + &__Slider { + background-color: $pico-5; + opacity: 0; + visibility: hidden; + transition: all 0.18s ease-out; + bottom: -1rem; + left: 0; + position: absolute; + width: toRem(56px); + box-shadow: 0 0.125rem 0.25rem rgba(28, 40, 82, 0.15); + border-radius: $border-radius-xss; + height: 1rem; + display: flex; + justify-content: center; + z-index: 2; + .Slider { + width: 2rem; + .MuiSlider { + &-root { + height: 0.375rem; + color: $pico-80; + } + &-rail, + &-track { + height: 0.125rem; + } + &-track { + background-color: $pico-80; + } + &-thumb { + height: toRem(6px); + width: toRem(6px); + background-color: $pico-80; + border-color: $pico-80; + margin-left: toRem(-4px); + margin-top: 0; + &:hover { + box-shadow: unset; + } + &::after { + width: toRem(16px); + height: toRem(16px); + top: toRem(-6px); + left: toRem(-6px); + } + } + } + } + } + } + } + &__caption { + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: $space-xxxxs; + max-width: toRem(268px); + } +} diff --git a/src/src/components/kit/AudioBox/AudioBox.tsx b/src/src/components/kit/AudioBox/AudioBox.tsx new file mode 100644 index 00000000..e1fc92c8 --- /dev/null +++ b/src/src/components/kit/AudioBox/AudioBox.tsx @@ -0,0 +1,235 @@ +import React from 'react'; +import AudioPlayer from 'material-ui-audio-player'; + +import { Button, Icon, Spinner, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { BATCH_COLLECT_DELAY } from 'config/mediaConfigs/mediaConfigs'; + +import AudioBoxProgress from 'modules/BaseExplorer/components/AudioBox/AudioBoxProgress'; +import AudioBoxVolume from 'modules/BaseExplorer/components/AudioBox/AudioBoxVolume'; + +import blobsURIModel from 'services/models/media/blobsURIModel'; + +import contextToString from 'utils/contextToString'; +import { downloadLink } from 'utils/helper'; + +import { IAudioBoxProps } from '.'; + +import './AudioBox.scss'; + +function AudioBox({ + data, + additionalProperties, + style = {}, +}: IAudioBoxProps): React.FunctionComponentElement { + const { blob_uri } = data; + const [isPlaying, setIsPlaying] = React.useState(false); + const [audio, setAudio] = React.useState(null); + const [processing, setProcessing] = React.useState(false); + let [src, setSrc] = React.useState(''); + let [blobData, setBlobData] = React.useState( + blobsURIModel.getState()[blob_uri] ?? null, + ); + let [muted, setMuted] = React.useState(true); + + const readyToPlay = React.useRef(false); + + React.useEffect(() => { + let timeoutID: number; + let subscription: any; + if (processing) { + if (blobData === null) { + if (blobsURIModel.getState()[blob_uri]) { + setBlobData(blobsURIModel.getState()[blob_uri]); + } else { + subscription = blobsURIModel.subscribe(blob_uri, (data) => { + setBlobData(data[blob_uri]); + subscription.unsubscribe(); + }); + timeoutID = window.setTimeout(() => { + if (blobsURIModel.getState()[blob_uri]) { + setBlobData(blobsURIModel.getState()[blob_uri]); + subscription.unsubscribe(); + } else { + // addUriToList(blob_uri); + } + }, BATCH_COLLECT_DELAY); + } + } + } + return () => { + if (timeoutID) { + clearTimeout(timeoutID); + } + if (subscription) { + subscription.unsubscribe(); + } + if (audio) { + audio.pause(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [processing]); + + React.useEffect(() => { + if (blobData) { + const audioRef = new Audio(); + audioRef.autoplay = true; + audioRef.muted = true; + audioRef.src = `data:audio/${data.format};base64,${blobData}`; + setSrc(`data:audio/${data.format};base64,${blobData}`); + setAudio(audioRef); + setMuted(false); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [blobData]); + + React.useEffect(() => { + if (isPlaying) { + audio?.play().then(() => { + setMuted(false); + }); + } else { + audio?.pause(); + } + }, [isPlaying, audio]); + + React.useEffect(() => { + // Pause and clean up on unmount + if (audio) { + audio.addEventListener('ended', onAudioEnded); + audio.addEventListener('canplay', handleReadyToPlay); + } + return () => { + if (audio) { + audio.pause(); + audio.removeEventListener('ended', onAudioEnded); + audio.removeEventListener('canplay', handleReadyToPlay); + } + }; + }, [audio]); + + React.useEffect(() => { + if (audio && !muted) { + audio.muted = false; + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [muted]); + + function handleReadyToPlay(): void { + setProcessing(false); + } + + function onAudioEnded(): void { + setIsPlaying(false); + } + + function onPlayChange(): void { + if (audio) { + readyToPlay.current = true; + setIsPlaying(!isPlaying); + } else { + setProcessing(true); + additionalProperties + .getAudiosBlobsData([blob_uri]) + .call() + .then(() => { + readyToPlay.current = true; + setIsPlaying(!isPlaying); + }); + } + } + + function onDownload(): void { + if (audio) { + handleDownload(); + } else { + setProcessing(true); + additionalProperties + .getAudiosBlobsData([blob_uri]) + .call() + .then(handleDownload); + } + } + + function handleDownload(): void { + const { index, format, context, step, caption, audio_name } = data; + const contextName = + contextToString(context) === '' ? '' : `_${contextToString(context)}`; + const name = `${audio_name}${contextName}_${caption}_${step}_${index}`; + + downloadLink(`data:audio/${format};base64,${blobData}`, name); + } + + return ( + +
+
+ {audio ? ( + + ) : ( +
+ + {processing ? ( + + ) : ( + + )} +
+ )} + + + +
+ + {data?.caption || ''} + +
+
+ ); +} + +AudioBox.displayName = 'AudioBox'; + +export default React.memo(AudioBox); diff --git a/src/src/components/kit/AudioBox/index.ts b/src/src/components/kit/AudioBox/index.ts new file mode 100644 index 00000000..11a85e22 --- /dev/null +++ b/src/src/components/kit/AudioBox/index.ts @@ -0,0 +1,5 @@ +import AudioBox from './AudioBox'; + +export * from './AudioBox.d'; + +export default AudioBox; diff --git a/src/src/components/kit/AutoSuggestions/AutoSuggestions.d.ts b/src/src/components/kit/AutoSuggestions/AutoSuggestions.d.ts new file mode 100644 index 00000000..9a57f03e --- /dev/null +++ b/src/src/components/kit/AutoSuggestions/AutoSuggestions.d.ts @@ -0,0 +1,10 @@ +import React from 'react'; + +export interface IAutoSuggestionsProps { + suggestionsList: string[]; + suggestionsPosition: { left: number; top: number }; + suggestionsRef: React.RefObject; + inputRef: React.MutableRefObject; + onSuggestionClick: (suggestion: string) => void; + setSuggestionsList: (list: string[]) => void; +} diff --git a/src/src/components/kit/AutoSuggestions/AutoSuggestions.scss b/src/src/components/kit/AutoSuggestions/AutoSuggestions.scss new file mode 100644 index 00000000..703f668f --- /dev/null +++ b/src/src/components/kit/AutoSuggestions/AutoSuggestions.scss @@ -0,0 +1,35 @@ +@use 'src/styles/abstracts' as *; + +.AutoSuggestions { + position: absolute; + width: 21.875rem; + max-width: calc(100vw - 29rem); + border: 0.0625rem solid #dceafb; + border-radius: 0.0625rem; + background-color: #fff; + z-index: 9999; + overflow: hidden; + &__item { + padding: 0 $space-xxs; + display: block; + color: $pico-60; + min-height: 1.5rem; + cursor: pointer; + outline: unset !important; + &:hover, + &:focus-visible, + &:focus { + background-color: #dceafb; + outline: unset; + } + &:last-child { + border-bottom: unset; + } + } +} + +//for safari browsers +.AutoSuggestions__item:focus { + background-color: #dceafb; + outline: unset; +} diff --git a/src/src/components/kit/AutoSuggestions/AutoSuggestions.tsx b/src/src/components/kit/AutoSuggestions/AutoSuggestions.tsx new file mode 100644 index 00000000..810bf4fd --- /dev/null +++ b/src/src/components/kit/AutoSuggestions/AutoSuggestions.tsx @@ -0,0 +1,80 @@ +import React from 'react'; +import styled from 'styled-components'; +import useDropdownMenu from 'react-accessible-dropdown-menu-hook'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IAutoSuggestionsProps } from './AutoSuggestions.d'; + +import './AutoSuggestions.scss'; + +const SuggestionsContainer: any = styled.div` + left: ${(props: any) => props.suggestionsPosition.left}px; + top: ${(props: any) => props.suggestionsPosition.top}px; + border: ${(props: any) => props.isEmpty && 'unset'}; +`; +function AutoSuggestions({ + inputRef, + suggestionsRef, + suggestionsList, + suggestionsPosition, + onSuggestionClick, + setSuggestionsList, +}: IAutoSuggestionsProps): React.FunctionComponentElement | null { + const { buttonProps, itemProps } = useDropdownMenu(suggestionsList.length); + React.useEffect(() => { + if (suggestionsRef) { + suggestionsRef.current.itemProps = { ...itemProps }; + suggestionsRef.current.buttonProps = { ...buttonProps }; + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + function onSuggestionsKeyDown( + e: React.KeyboardEvent, + ): void { + if (e.key === 'Escape') { + inputRef.current.focus(); + } else { + if (buttonProps.onKeyDown) { + buttonProps?.onKeyDown(e); + } + } + } + + function onSuggestionsBlur(e: React.FocusEvent): void { + if (!e.relatedTarget) { + setSuggestionsList([]); + } + } + + return ( + + + {suggestionsList?.map((suggestion: string, index: number) => ( + onSuggestionClick(suggestion)} + {...itemProps[index]} + > + {suggestion} + + ))} + + + ); +} + +AutoSuggestions.displayName = 'AutoSuggestions'; + +export default AutoSuggestions; diff --git a/src/src/components/kit/AutoSuggestions/index.ts b/src/src/components/kit/AutoSuggestions/index.ts new file mode 100644 index 00000000..baf640a8 --- /dev/null +++ b/src/src/components/kit/AutoSuggestions/index.ts @@ -0,0 +1,4 @@ +import AutoSuggestions from './AutoSuggestions'; +export * from './AutoSuggestions.d'; + +export default AutoSuggestions; diff --git a/src/src/components/kit/Badge/Badge.d.ts b/src/src/components/kit/Badge/Badge.d.ts new file mode 100644 index 00000000..8f2321d5 --- /dev/null +++ b/src/src/components/kit/Badge/Badge.d.ts @@ -0,0 +1,21 @@ +import React from 'react'; + +import { IconName } from '../Icon/Icon.d'; + +export interface IBadgeProps + extends Partial> { + id?: string; + label: string; + value?: string; + color?: string; + startIcon?: IconName; + size?: 'xSmall' | 'small' | 'medium' | 'large' | 'xLarge'; + onDelete?: (label: string) => void; + onClick?: (e: React.MouseEvent) => void; + maxWidth?: string; + style?: React.CSSProperties; + className?: string; + selectBadge?: boolean; + disabled?: boolean; + monospace?: boolean; +} diff --git a/src/src/components/kit/Badge/Badge.scss b/src/src/components/kit/Badge/Badge.scss new file mode 100644 index 00000000..91125089 --- /dev/null +++ b/src/src/components/kit/Badge/Badge.scss @@ -0,0 +1,148 @@ +@use 'src/styles/abstracts' as *; + +.Badge { + display: inline-flex; + flex-wrap: nowrap; + align-items: center; + justify-content: center; + height: 1.75rem; + border-radius: 0.375rem; + font-weight: $font-500; + white-space: nowrap; + vertical-align: middle; + text-decoration: none; + + &__label { + flex-wrap: nowrap; + white-space: nowrap; + line-height: 1rem; + overflow: hidden; + max-width: 100%; + text-overflow: ellipsis; + } + i { + display: flex; + align-items: center; + justify-content: center; + width: unset; + height: unset; + margin: 0; + } + + &__deleteIcon, + &__startIcon { + width: 1.125rem; + height: 1.125rem; + margin-left: unset; + display: flex; + align-items: center; + justify-content: center; + border-radius: $border-radius-xs; + transition: all 0.18s ease-out; + } + &__deleteIcon { + cursor: pointer; + } + &__select { + margin-top: $space-xxxs; + margin-right: $space-xxxs; + } + &__disabled { + pointer-events: none; + opacity: 0.5; + } + &__default { + color: #414b6d; + background-color: $cuddle-10; + border: $border-grey; + &:hover { + background-color: $cuddle-10; + } + .Badge__startIcon { + i { + color: $text-color; + } + } + .Badge__deleteIcon { + i { + color: $text-color; + } + &:hover { + background-color: $cuddle-30; + } + } + } + + &__small, + &__xSmall { + font-size: $text-sm; + i { + font-size: 0.4375rem; + margin-bottom: 1px; + } + .Badge__label { + padding: 0 $space-xs; + } + .Badge__deleteIcon, + .Badge__startIcon { + width: 0.875rem; + height: 0.875rem; + } + .Badge__deleteIcon { + margin-right: 0.25rem; + } + .Badge__startIcon { + margin-left: 0.25rem; + } + } + &__small { + height: 1.5rem; + } + + &__xSmall { + height: 1.125rem; + } + &__medium { + height: 1.5rem; + font-size: $text-md; + .Badge__label { + padding: 0 $space-sm; + } + i { + font-size: $text-xxs; + } + .Badge__deleteIcon { + margin-right: $space-xs; + } + .Badge__startIcon { + margin-left: $space-xs; + } + } + + &__large, + &__xLarge { + font-size: $text-md; + height: 1.75rem; + .Badge__label { + padding: 0 $space-sm; + } + .Badge__deleteIcon { + margin-right: $space-xs; + i { + font-size: $text-xxs; + } + } + .Badge__startIcon { + margin-left: $space-xs; + i { + font-size: $text-xxs; + } + } + } + &__xLarge { + height: 2rem; + .Badge__label { + padding: 0 $space-unit; + } + } +} diff --git a/src/src/components/kit/Badge/Badge.tsx b/src/src/components/kit/Badge/Badge.tsx new file mode 100644 index 00000000..2e870311 --- /dev/null +++ b/src/src/components/kit/Badge/Badge.tsx @@ -0,0 +1,108 @@ +import React from 'react'; +import styled from 'styled-components'; +import classNames from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { Icon } from '../index'; + +import { IBadgeProps } from './Badge.d'; + +import './Badge.scss'; + +const getBadgeColor: (color: string) => string = (color: string): string => + `background-color: ${color}1a; + color: ${color}; + border: 0.0625rem solid ${color};`; + +const BadgeContainer: any = styled.div` + font-family: ${(props: any) => + props.monospace ? '"Inconsolata", monospace' : 'Inter, sans-serif'}; + ${({ color }) => color && getBadgeColor(color)}; + font-variation-settings: ${(props: any) => props.monospace && "'wdth' 82"}; + ${(props: any) => ({ ...props.styleProps })} +`; + +const BadgeIcon = styled.span` + ${(props) => + props.color && + `&:hover { + background-color: ${props.color}2a} + }`} +`; + +/** + * @property {string} id - id of Badge + * @property {string} label - label of Badge + * @property {string} color - Badge color + * @property {string} size - size of Badge + * @property {maxWidth} string - maximum width of Badge + * @property {React.CSSProperties} style - applies inline styles + * @property {string} className - component className + * @property {boolean} selectBadge - defines if Badge renders in Select component + * @property {function} onDelete - delete callBack function + * @property {function} onClick - handling on Badge click function + */ +function Badge({ + id, + label, + value, + color = '', + size = 'medium', + style, + className = '', + startIcon, + maxWidth = '100%', + monospace = false, + disabled = false, + selectBadge, + onDelete, + onClick, +}: IBadgeProps): React.FunctionComponentElement { + return ( + + + {startIcon && ( + + + + )} + {label} + {onDelete && ( + { + e.stopPropagation(); + onDelete(value ?? label); + }} + className='Badge__deleteIcon' + > + + + )} + + + ); +} + +Badge.displayName = 'Badge'; + +export default Badge; diff --git a/src/src/components/kit/Badge/index.ts b/src/src/components/kit/Badge/index.ts new file mode 100644 index 00000000..24d7727f --- /dev/null +++ b/src/src/components/kit/Badge/index.ts @@ -0,0 +1,4 @@ +import Badge from './Badge'; +export * from './Badge.d'; + +export default Badge; diff --git a/src/src/components/kit/Button/Button.d.ts b/src/src/components/kit/Button/Button.d.ts new file mode 100644 index 00000000..40d92bdd --- /dev/null +++ b/src/src/components/kit/Button/Button.d.ts @@ -0,0 +1,6 @@ +import { ButtonProps } from '@material-ui/core/Button'; + +export interface IButtonProps extends ButtonProps { + withOnlyIcon?: boolean; + size?: ButtonProps['size'] | 'xSmall' | 'xxSmall'; +} diff --git a/src/src/components/kit/Button/Button.scss b/src/src/components/kit/Button/Button.scss new file mode 100644 index 00000000..77713670 --- /dev/null +++ b/src/src/components/kit/Button/Button.scss @@ -0,0 +1,34 @@ +// -------- contained overrides -------- +.MuiButton-contained { + &.Mui-disabled { + box-shadow: none; + background-color: #1266cc; + color: white; + opacity: 0.5; + } + &:hover { + box-shadow: none; + } +} + +// -------- outlined overrides -------- +.MuiButton-outlined { + &.Mui-disabled { + box-shadow: none; + color: #89b9f2; + border-color: #89b9f2; + opacity: 0.5; + } +} + +// text +.MuiButton-label { + text-transform: capitalize; +} + +// -------- text overrides -------- +.MuiButton-text { + &.Mui-disabled { + color: #89b9f2; + } +} diff --git a/src/src/components/kit/Button/Button.tsx b/src/src/components/kit/Button/Button.tsx new file mode 100644 index 00000000..a679baa9 --- /dev/null +++ b/src/src/components/kit/Button/Button.tsx @@ -0,0 +1,92 @@ +import React from 'react'; + +import MUButton from '@material-ui/core/Button'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IButtonProps } from '.'; + +import './Button.scss'; + +const sizes = { + xxSmall: '1.25rem', + xSmall: '1.5rem', + small: '1.75rem', + medium: '2rem', + large: '2.25rem', +}; + +const fontSizes = { + xxSmall: '0.625rem', + xSmall: '0.75rem', + small: '0.875rem', + medium: '0.875rem', + large: '0.875rem', +}; + +const withOnlyIconSizes = { + xxSmall: '1.25rem', + xSmall: '1.5rem', + small: '1.75rem', + medium: '2rem', + large: '2.25rem', +}; + +const minWidthSizes = { + xxSmall: 'auto', + xSmall: 'auto', + small: '4.375rem', + medium: '4.375rem', + large: '4.375rem', +}; + +const paddingSizes = { + xxSmall: '0.125rem 0.5rem', + xSmall: '0.25rem 0.625rem', + small: '0.5rem 1.25rem', + medium: '0.5rem 1.25rem', + large: '0.5rem 1.25rem', +}; + +const borderRadiusSizes = { + xxSmall: '0.25rem', + xSmall: '0.25rem', + small: '0.25rem', + medium: '0.375rem', + large: '0.5rem', +}; + +function Button({ + size, + withOnlyIcon, + color, + children, + ...rest +}: IButtonProps): React.FunctionComponentElement { + const styleOverrides = { + borderRadius: borderRadiusSizes[size || 'medium'], + padding: withOnlyIcon ? '0.25rem' : paddingSizes[size || 'medium'], + fontSize: fontSizes[size || 'medium'], + height: withOnlyIcon + ? withOnlyIconSizes[size || 'medium'] + : sizes[size || 'medium'], + minWidth: withOnlyIcon ? '1.25rem' : minWidthSizes[size || 'medium'], + ...(withOnlyIcon && { width: withOnlyIconSizes[size || 'medium'] }), + }; + + return ( + + + {children} + + + ); +} + +Button.displayName = 'Button'; + +export default React.memo(Button); diff --git a/src/src/components/kit/Button/index.ts b/src/src/components/kit/Button/index.ts new file mode 100644 index 00000000..e9f8f218 --- /dev/null +++ b/src/src/components/kit/Button/index.ts @@ -0,0 +1,4 @@ +import Button from './Button'; +export * from './Button.d'; + +export default Button; diff --git a/src/src/components/kit/Card/Card.d.ts b/src/src/components/kit/Card/Card.d.ts new file mode 100644 index 00000000..45851878 --- /dev/null +++ b/src/src/components/kit/Card/Card.d.ts @@ -0,0 +1,19 @@ +import React from 'react'; + +import { IIllustrationConfig } from 'types/components/Table/Table'; + +export interface ICardProps { + title: string; + subtitle?: string; + children?: React.ReactNode; + className?: string; + dataListProps?: { + tableColumns: any; + tableData: any; + searchableKeys?: string[]; + illustrationConfig?: IIllustrationConfig; + isLoading?: boolean; + withSearchBar?: boolean; + calcTableHeight?: boolean; + }; +} diff --git a/src/src/components/kit/Card/Card.scss b/src/src/components/kit/Card/Card.scss new file mode 100644 index 00000000..b70ac8d4 --- /dev/null +++ b/src/src/components/kit/Card/Card.scss @@ -0,0 +1,23 @@ +@use 'src/styles/abstracts' as *; + +.Card { + display: flex; + flex-direction: column; + padding: $space-lg; + border: $border-grey; + border-radius: $border-radius-lg; + background: $white; + width: 100%; + &__header { + margin-bottom: $space-md; + display: flex; + flex-direction: column; + &__subTitle { + margin-top: $space-xxxs; + margin-bottom: $space-xxxs; + } + } + &__tableWrapper { + height: toRem(356px); + } +} diff --git a/src/src/components/kit/Card/Card.tsx b/src/src/components/kit/Card/Card.tsx new file mode 100644 index 00000000..41ef7fd8 --- /dev/null +++ b/src/src/components/kit/Card/Card.tsx @@ -0,0 +1,65 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Text } from 'components/kit'; +import DataList from 'components/kit/DataList'; + +import { ICardProps } from './Card.d'; + +import './Card.scss'; + +/** + * @property {string} title - title + * @property {string} subTitle - subtitle (optional) + * @property {string} className - additional class name (optional) + * @property {boolean} isLoading - is loading + * @property {{ + * tableColumns: any, + * tableData: any, + * searchableKeys?: string[], + * illustrationConfig?: IIllustrationConfig, + * isLoading: boolean, + * }} dataListProps - table props + * @property {React.HTMLElement} children - children element + */ + +function Card({ + title, + subtitle, + className, + dataListProps, + children, +}: ICardProps): React.FunctionComponentElement { + const tableRef = React.useRef(null); + + return ( +
+
+ + {title} + + {subtitle && ( + + {subtitle} + + )} +
+ {children || ( +
+ {dataListProps?.tableData && ( + + )} +
+ )} +
+ ); +} + +Card.displayName = 'Card'; + +export default React.memo(Card); diff --git a/src/src/components/kit/Card/index.tsx b/src/src/components/kit/Card/index.tsx new file mode 100644 index 00000000..48356677 --- /dev/null +++ b/src/src/components/kit/Card/index.tsx @@ -0,0 +1,5 @@ +import Card from './Card'; + +export * from './Card'; + +export default Card; diff --git a/src/src/components/kit/DataList/DataList.d.ts b/src/src/components/kit/DataList/DataList.d.ts new file mode 100644 index 00000000..ec9ebbbd --- /dev/null +++ b/src/src/components/kit/DataList/DataList.d.ts @@ -0,0 +1,18 @@ +import React from 'react'; + +import { IIllustrationConfig } from 'types/components/Table/Table'; + +export interface IDataListProps { + tableRef: React.RefObject; + tableData: any; + isLoading?: boolean; + withSearchBar?: boolean; + tableColumns: any; + searchableKeys?: string[]; + illustrationConfig?: IIllustrationConfig; + rowHeight?: number; + height?: string; + tableClassName?: string; + toolbarItems?: React.FunctionComponentElement[]; + disableMatchBar?: boolean; +} diff --git a/src/src/components/kit/DataList/DataList.scss b/src/src/components/kit/DataList/DataList.scss new file mode 100644 index 00000000..6934fe77 --- /dev/null +++ b/src/src/components/kit/DataList/DataList.scss @@ -0,0 +1,93 @@ +@use 'src/styles/abstracts' as *; + +.DataList { + display: flex; + flex-direction: column; + width: 100%; + max-height: 100%; + &__toolbarItems { + height: 2rem; + margin-left: $space-md; + display: flex; + align-items: center; + } + &__textsTable { + border: $border-grey; + border-radius: $border-radius-md; + overflow: hidden; + width: 100%; + .BaseTable__body { + & > div { + width: 100% !important; + .BaseTable__row { + width: 100% !important; + } + } + } + } + &__mark { + background-color: $mark-color; + color: $pico; + } + .VisualizationLoader { + height: 100% !important; + } + .BaseTable { + &__table-main { + outline: none; + } + &__header { + &-row { + background: #ebf0f8; + border-bottom: none; + } + &-cell { + border-bottom: $border-grey; + padding: 0 toRem(16px); + &:last-child { + border-right: none; + } + &-text { + font-size: $text-md; + } + } + } + &__row { + border-bottom: none; + cursor: initial; + &--hovered { + background: #e8f1fc; + } + + &-cell { + position: relative; + min-height: 24px; + max-height: 300px; + padding: 0 $space-unit; + border-right: unset; + border-bottom: $border-grey; + display: flex; + p { + word-break: break-all; + white-space: normal; + } + + &:last-child { + display: flex; + border-right: none; + white-space: normal; + &:has(> pre) { + overflow: auto !important; + } + } + } + + &:last-child { + box-shadow: $cuddle-50 0px 1px 0px 0px; + .BaseTable__row-cell { + border-bottom: none; + } + } + } + } +} diff --git a/src/src/components/kit/DataList/DataList.tsx b/src/src/components/kit/DataList/DataList.tsx new file mode 100644 index 00000000..f3d58e38 --- /dev/null +++ b/src/src/components/kit/DataList/DataList.tsx @@ -0,0 +1,129 @@ +import React from 'react'; +import classNames from 'classnames'; + +import Table from 'components/Table/Table'; +import useTextSearch from 'components/kit/DataList/SearchBar/useTextSearch'; +import BusyLoaderWrapper from 'components/BusyLoaderWrapper/BusyLoaderWrapper'; + +import SearchBar from './SearchBar'; +import { IDataListProps } from './DataList.d'; + +import './DataList.scss'; + +/** + * @property {any} tableColumns - columns + * @property {any} tableData - rows + * @property {string[]} searchableKeys - additional class name (optional) + * @property {IIllustrationConfig} illustrationConfig - illustration config + * @property {boolean} isLoading - data is loading + * @property {boolean} withoutSearchBar - show search bar + * @property {React.RefElement} tableRef - ref + */ + +function DataList({ + tableRef, + tableData, + isLoading, + tableColumns, + withSearchBar = true, + searchableKeys, + illustrationConfig, + rowHeight = 28, + height = '100vh', + tableClassName = '', + toolbarItems = [], + disableMatchBar = false, +}: IDataListProps): React.FunctionComponentElement { + const textSearch = useTextSearch({ + rawData: tableData, + updateData, + searchableKeys, + }); + + function getHighlightedData(data: any[], regex: RegExp | null) { + const searchableKeysList = searchableKeys ?? Object.keys(data[0] ?? {}); + const index = searchableKeysList.indexOf('key'); + if (index > -1) { + searchableKeysList.splice(index, 1); + } + return data.map((item) => { + const highlightedItem: any = {}; + searchableKeysList.forEach((searchableKey: string) => { + const reg = new RegExp(regex?.source ?? '', regex?.flags); + highlightedItem[searchableKey] = + regex === null + ? `${item[searchableKey]}` + : `${item[searchableKey]}` + ?.split(regex) + ?.filter((part: string) => part !== '') + ?.map((part: string, i: number) => { + return reg.test(part) ? ( + + {part} + + ) : ( + part + ); + }); + }); + return { + ...item, + ...highlightedItem, + }; + }); + } + + function updateData(data: any[], regex: RegExp | null) { + tableRef.current?.updateData({ newData: getHighlightedData(data, regex) }); + } + return ( +
+ {withSearchBar && ( +
+ +
+ )} + + {textSearch.data && ( + + )} + + + ); +} + +DataList.displayName = 'DataList'; + +export default React.memo(DataList); diff --git a/src/src/components/kit/DataList/SearchBar/SearchBar.scss b/src/src/components/kit/DataList/SearchBar/SearchBar.scss new file mode 100644 index 00000000..9a63d11d --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/SearchBar.scss @@ -0,0 +1,40 @@ +@use 'src/styles/abstracts' as *; + +.SearchBar { + display: flex; + width: toRem(415px); + margin-bottom: toRem(14px); + align-items: center; + max-width: 100%; + + .MatchIcons { + display: flex; + align-items: baseline; + } + + label { + font-size: $text-md; + } + + .MatchButton { + margin-right: $space-xxs; + &:last-child { + margin-right: unset; + } + + &:not(.active) { + .Mui-disabled { + color: $pico-30; + } + } + &.active { + .Icon__container { + color: $primary-color; + } + } + .Icon__container { + font-size: $text-lg; + color: $pico-80; + } + } +} diff --git a/src/src/components/kit/DataList/SearchBar/SearchBar.tsx b/src/src/components/kit/DataList/SearchBar/SearchBar.tsx new file mode 100644 index 00000000..72b0f1aa --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/SearchBar.tsx @@ -0,0 +1,135 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import Icon from 'components/kit/Icon'; +import Button from 'components/kit/Button'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { + ISearchBarProps, + MatchTypes, +} from 'components/kit/DataList/SearchBar/types.d'; + +import SearchInput from './SearchInput'; + +import './SearchBar.scss'; + +function SearchBar({ + matchType, + searchValue, + isValidInput, + onInputClear, + onInputChange, + onMatchTypeChange, + isDisabled, + disableMatchBar = false, + toolbarItems, +}: ISearchBarProps) { + return ( + +
+ + {disableMatchBar ? null : ( +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+ )} + + {!!toolbarItems?.length && ( +
{toolbarItems}
+ )} +
+
+ ); +} + +SearchBar.displayName = 'SearchBar'; + +export default React.memo(SearchBar); diff --git a/src/src/components/kit/DataList/SearchBar/SearchInput/EndAdornment.tsx b/src/src/components/kit/DataList/SearchBar/SearchInput/EndAdornment.tsx new file mode 100644 index 00000000..1ecc9a7b --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/SearchInput/EndAdornment.tsx @@ -0,0 +1,38 @@ +import React from 'react'; + +import Icon from 'components/kit/Icon'; +import Button from 'components/kit/Button'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ISearchInputEndAdornment } from '../types'; + +function EndAdornment({ + showSearchIcon = true, + onClickClearButton, + isDisabled, +}: ISearchInputEndAdornment) { + return ( + + + {showSearchIcon ? ( + + ) : ( + <> + + + + )} + + + ); +} + +export default React.memo(EndAdornment); diff --git a/src/src/components/kit/DataList/SearchBar/SearchInput/SearchInput.scss b/src/src/components/kit/DataList/SearchBar/SearchInput/SearchInput.scss new file mode 100644 index 00000000..772352af --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/SearchInput/SearchInput.scss @@ -0,0 +1,52 @@ +@use 'src/styles/abstracts' as *; + +.SearchInput { + margin-right: toRem(10px); + &.activeCloseButton { + .MuiInputBase-root { + padding-right: $space-xxs; + } + } + .MuiOutlinedInput-adornedEnd { + padding-right: toRem(10px); + } + label { + font-size: $text-md; + } + + .MuiFormLabel-root { + top: $space-xxxxs; + } + + input { + font-size: $text-md; + &::placeholder { + font-size: $text-md; + } + } + width: 100%; + .MuiInputLabel-outlined { + z-index: 1; + transform: translate(14px, 6px) scale(1); + pointer-events: none; + &.MuiInputLabel-shrink { + transform: translate(14px, -6px) scale(0.75); + } + } + + .EndAdornment { + display: flex; + align-items: center; + .divider-vertical { + width: toRem(1px); + height: toRem(20px); + margin: 0 toRem(6px) 0 toRem(8px); + background: $cuddle-70; + border-radius: toRem(1px); + } + + .Mui-disabled { + color: $pico-30; + } + } +} diff --git a/src/src/components/kit/DataList/SearchBar/SearchInput/index.tsx b/src/src/components/kit/DataList/SearchBar/SearchInput/index.tsx new file mode 100644 index 00000000..703a6bd7 --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/SearchInput/index.tsx @@ -0,0 +1,58 @@ +import React, { ChangeEvent } from 'react'; +import classNames from 'classnames'; + +import { FormControl, InputLabel, OutlinedInput } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ISearchInputProps } from '../types'; + +import EndAdornment from './EndAdornment'; + +import './SearchInput.scss'; + +function SearchInput({ + value, + onInputClear, + onInputChange, + isValidInput, + isDisabled, +}: ISearchInputProps) { + return ( + + + + Search + + ) => + onInputChange(event.target.value) + } + endAdornment={ + + } + style={{ + height: 28, + }} + /> + + + ); +} + +export default React.memo(SearchInput); diff --git a/src/src/components/kit/DataList/SearchBar/index.ts b/src/src/components/kit/DataList/SearchBar/index.ts new file mode 100644 index 00000000..7a508f97 --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/index.ts @@ -0,0 +1,3 @@ +import SearchBar from './SearchBar'; + +export default SearchBar; diff --git a/src/src/components/kit/DataList/SearchBar/types.d.ts b/src/src/components/kit/DataList/SearchBar/types.d.ts new file mode 100644 index 00000000..5eea84e2 --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/types.d.ts @@ -0,0 +1,44 @@ +export interface ISearchBarProps { + matchType: MatchTypes | null; + searchValue: string; + isValidInput: boolean; + onInputChange: (value: string) => void; + onInputClear: () => void; + onMatchTypeChange: (value: MatchTypes | null) => void; + isDisabled: boolean; + toolbarItems?: React.FunctionComponentElement[]; + disableMatchBar?: boolean; +} + +export interface ISearchInputProps { + value: string; + isValidInput: boolean; + isDisabled: boolean; + onInputChange: (value: string) => void; + onInputClear: () => void; +} + +export interface ISearchInputEndAdornment { + showSearchIcon?: boolean; + isDisabled: boolean; + onClickClearButton: () => void; +} + +export interface UseTextSearchProps { + rawData: { text: string }[]; + updateData: (data: { text: string }[], regex: RegExp | null) => void; + searchableKeys?: string[]; +} + +export enum MatchTypes { + Case = 'case', + Word = 'word', + RegExp = 'regExp', +} + +export type FilterOptions = { + matchType: MatchTypes | null; + searchValue: string; + isValidSearch: boolean; + appliedRegExp: RegExp | null; +}; diff --git a/src/src/components/kit/DataList/SearchBar/useTextSearch.ts b/src/src/components/kit/DataList/SearchBar/useTextSearch.ts new file mode 100644 index 00000000..386dfd1a --- /dev/null +++ b/src/src/components/kit/DataList/SearchBar/useTextSearch.ts @@ -0,0 +1,165 @@ +import React from 'react'; + +import { FilterOptions, MatchTypes, UseTextSearchProps } from './types.d'; + +const defaultFilterOption: FilterOptions = { + matchType: null, + searchValue: '', + isValidSearch: true, + appliedRegExp: null, +}; + +function useTextSearch({ + rawData, + updateData, + searchableKeys, +}: UseTextSearchProps) { + const [data, setData] = React.useState<{ text: string }[]>(rawData); + const [filterOptions, setFilterOptions] = + React.useState(defaultFilterOption); + + React.useEffect(() => { + if (filterOptions.appliedRegExp) { + const filteredData = filterByCase( + filterOptions.searchValue, + filterOptions.appliedRegExp, + filterOptions.matchType, + ); + + setData(filteredData); + updateData(filteredData, filterOptions.appliedRegExp); + } else { + setData(rawData); + updateData(rawData, null); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [rawData]); + + function search(search: string, matchType: MatchTypes | null) { + if (!search) { + setData(rawData); + updateData(rawData, null); + setFilterOptions((fO) => ({ + ...fO, + appliedRegExp: null, + })); + return; + } + let appliedRegExp: RegExp | null; + // @TODO fix \ and [ symbols issue + try { + switch (matchType) { + case MatchTypes.Word: + search = `\\b${search}\\b`; + appliedRegExp = new RegExp(`(${search})`, 'gi'); + break; + case MatchTypes.Case: + appliedRegExp = new RegExp(`(${search})`, 'g'); + break; + case MatchTypes.RegExp: + try { + let match = search.match(new RegExp('^/(.*?)/([gimy]*)$')); + if (match) { + appliedRegExp = new RegExp(`(${match[1]})`, match[2]); + } else { + appliedRegExp = new RegExp(`(${search})`, 'g'); + } + } catch (e) { + appliedRegExp = null; + } + break; + default: + appliedRegExp = new RegExp(`(${search})`.toLowerCase(), 'gi'); + } + } catch { + appliedRegExp = new RegExp('()'.toLowerCase(), 'gi'); + } + + const filteredData = filterByCase(search, appliedRegExp, matchType); + + setFilterOptions((fO) => ({ + ...fO, + appliedRegExp, + })); + setData(filteredData); + updateData(filteredData, appliedRegExp); + } + + function filterByCase( + search: string, + appliedRegExp: RegExp | null, + matchType: MatchTypes | null, + ) { + const searchableKeysList = searchableKeys ?? Object.keys(rawData[0] || {}); + const index = searchableKeysList.indexOf('key'); + if (index > -1) { + searchableKeysList.splice(index, 1); + } + return rawData?.filter((item: any) => { + return !!searchableKeysList.find((searchableKey: string) => { + const text = `${item[searchableKey]}`; + switch (matchType) { + case MatchTypes.Word: + if (text.search(appliedRegExp!) > -1) { + return item; + } + break; + case MatchTypes.Case: + if (text.indexOf(search) > -1) { + return item; + } + break; + case MatchTypes.RegExp: + try { + if (appliedRegExp!.test(text)) { + return item; + } + } catch (e) { + setFilterOptions((fO) => ({ + ...fO, + isValidSearch: false, + appliedRegExp: null, + })); + } + + break; + default: + if (text.toLowerCase().indexOf(search.toLowerCase()) > -1) { + return item; + } + } + return false; + }); + }); + } + + function clearSearchInputData() { + changeSearchInput(''); + } + + function changeSearchInput(value: string) { + search(value, filterOptions.matchType); + setFilterOptions((fO) => ({ + ...fO, + searchValue: value, + })); + } + + function changeMatchType(matchType: MatchTypes | null) { + search(filterOptions.searchValue, matchType); + setFilterOptions((fO) => ({ + ...fO, + matchType, + })); + } + + return { + data, + filterOptions, + changeMatchType, + clearSearchInputData, + changeSearchInput, + }; +} + +export default useTextSearch; diff --git a/src/src/components/kit/DataList/index.tsx b/src/src/components/kit/DataList/index.tsx new file mode 100644 index 00000000..d04a8278 --- /dev/null +++ b/src/src/components/kit/DataList/index.tsx @@ -0,0 +1,5 @@ +import DataList from './DataList'; + +export * from './DataList.d'; + +export default DataList; diff --git a/src/src/components/kit/DictVisualizer/DictVisualizer.d.ts b/src/src/components/kit/DictVisualizer/DictVisualizer.d.ts new file mode 100644 index 00000000..175eceee --- /dev/null +++ b/src/src/components/kit/DictVisualizer/DictVisualizer.d.ts @@ -0,0 +1,29 @@ +import { CSSProperties } from 'react'; + +export interface IDictVisualizerProps { + src: object | Record; + style?: CSSProperties; + autoScale?: boolean; +} + +export type DictVisualizerRowType = { + id: string; + root?: boolean; + closing?: boolean; + level: number; + key: string | number | null; + value: unknown; + closedValue?: unknown; + sub: string | null; + color: string; + copyContent?: string; +}; + +export interface IDictVisualizerRowProps { + row: DictVisualizerRowType; + collapseToggler: (rowID: string) => void; + style?: CSSProperties; + index: number; + isCollapsed: boolean; + rowsCount: number; +} diff --git a/src/src/components/kit/DictVisualizer/DictVisualizer.scss b/src/src/components/kit/DictVisualizer/DictVisualizer.scss new file mode 100644 index 00000000..b1186817 --- /dev/null +++ b/src/src/components/kit/DictVisualizer/DictVisualizer.scss @@ -0,0 +1,60 @@ +@use 'src/styles/abstracts' as *; + +.DictVisualizer { + @include monospaceFontFamily(); + width: 100%; + height: 100%; +} +.DictVisualizer__row { + display: flex; + align-items: center; + + &:hover { + .DictVisualizer__row__copy { + visibility: visible; + } + } +} + +.DictVisualizer__row__indent { + display: inline-block; + height: 100%; + margin-left: 9px; // based on icon size + margin-right: $space-md; + border-left: $border-dark; +} + +.DictVisualizer__row__collapseToggler { + display: flex; + align-items: center; + margin-right: $space-xxxs; + cursor: pointer; +} + +.DictVisualizer__row__content { + display: flex; + align-items: baseline; +} + +.DictVisualizer__row__content__key { + margin-right: $space-xs; +} + +.DictVisualizer__row__content__sub { + margin-right: $space-xxs; + font-style: italic; + white-space: nowrap; +} + +.DictVisualizer__row__content__value { + white-space: nowrap; +} + +.DictVisualizer__row__content__value--closing { + margin-left: 7px; // based on icon size +} + +.DictVisualizer__row__copy { + margin-left: $space-xxxs; + visibility: hidden; +} diff --git a/src/src/components/kit/DictVisualizer/DictVisualizer.tsx b/src/src/components/kit/DictVisualizer/DictVisualizer.tsx new file mode 100644 index 00000000..b44e6717 --- /dev/null +++ b/src/src/components/kit/DictVisualizer/DictVisualizer.tsx @@ -0,0 +1,329 @@ +import * as React from 'react'; +import { FixedSizeList as List, ListChildComponentProps } from 'react-window'; +import AutoSizer from 'react-virtualized-auto-sizer'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import CopyToClipBoard from 'components/CopyToClipBoard/CopyToClipBoard'; + +import { formatValue } from 'utils/formatValue'; +import { toType, typeToColor } from 'utils/valueToType/valueToType'; + +import Text from '../Text'; +import Icon from '../Icon'; +import Button from '../Button'; + +import { + IDictVisualizerProps, + DictVisualizerRowType, + IDictVisualizerRowProps, +} from './DictVisualizer.d'; + +import './DictVisualizer.scss'; + +const ROW_SIZE = 22; + +function DictVisualizer(props: IDictVisualizerProps) { + const [collapsedItems, setCollapsedItems] = React.useState< + Record + >({}); + + const initialRows = React.useRef([]); + + const [rows, setRows] = React.useState([]); + + function collapseToggler(id: string) { + setCollapsedItems((cI) => ({ + ...cI, + [id]: !cI[id], + })); + } + + React.useEffect(() => { + initialRows.current = flattenDict(props.src as Record); + setRows(initialRows.current); + }, [props.src]); + + React.useEffect(() => { + if ( + initialRows.current.length > 0 && + Object.keys(collapsedItems).length > 0 + ) { + let newRows: DictVisualizerRowType[] = []; + let currentRootIsClosed: string | null = null; + for (let i = 0; i < initialRows.current.length; i++) { + const row = initialRows.current[i]; + if (!currentRootIsClosed) { + newRows.push(row); + } + if (collapsedItems[row.id]) { + currentRootIsClosed = + currentRootIsClosed === row.id + ? null + : currentRootIsClosed !== null + ? currentRootIsClosed + : row.id; + } + } + + setRows(newRows); + } + }, [collapsedItems, initialRows]); + + return ( + +
+ + {({ width, height }) => ( + + {({ index, style }: ListChildComponentProps) => { + const row = rows[index]; + return ( + + ); + }} + + )} + +
+
+ ); +} + +function DictVisualizerRow(props: IDictVisualizerRowProps) { + const { row, style, index, collapseToggler, isCollapsed, rowsCount } = props; + + return ( +
+ {index !== 0 && + index !== rowsCount - 1 && + Array(row.level + 1) + .fill('_') + .map((_, i) => ( +
+ ))} + {row.root && ( + + )} +
+ {row.key !== null && ( + + {row.key}: + + )} + {row.sub !== null && ( + + {row.sub} + + )} + collapseToggler(row.id) : undefined} + > + {(isCollapsed ? row.closedValue : row.value) as string} + +
+ {row.copyContent && ( + + )} +
+ ); +} + +// Convert the dict to a list of key-value pairs +function flattenDict( + dict: Record | unknown[], + level: number = 0, + parentKey: string = 'root', +) { + let rows: DictVisualizerRowType[] = []; + + // Add top level brackets + if (level === 0) { + if (Array.isArray(dict)) { + let nestedItemsLength = dict.length; + rows.push({ + id: parentKey, + root: nestedItemsLength > 0, + level, + key: null, + value: `[${nestedItemsLength === 0 ? ']' : ''}`, + closedValue: '[...]', + sub: `${nestedItemsLength} item${nestedItemsLength === 1 ? '' : 's'}`, + color: typeToColor('array'), + copyContent: formatValue(dict), + }); + } else { + let nestedItemsLength = Object.keys(dict).length; + rows.push({ + id: parentKey, + root: nestedItemsLength > 0, + level, + key: null, + value: `{${nestedItemsLength === 0 ? '}' : ''}`, + closedValue: '{...}', + sub: `${nestedItemsLength} item${nestedItemsLength === 1 ? '' : 's'}`, + color: typeToColor('object'), + copyContent: formatValue(dict), + }); + } + } + for (let key in dict) { + let item: unknown = Array.isArray(dict) ? dict[+key] : dict[key]; + let type = toType(item); + let color = typeToColor(type); + let id = `${parentKey}__${key}`; + const value = formatValue(item); + if (Array.isArray(item)) { + // Add array subtree + rows.push({ + id, + root: item.length > 0, + level, + key: formatValue(key), + value: `[${item.length === 0 ? ']' : ''}`, + closedValue: '[...]', + sub: `${item.length} item${item.length === 1 ? '' : 's'}`, + color: typeToColor('array'), + copyContent: value, + }); + if (item.length > 0) { + rows.push(...flattenDict(item as unknown[], level + 1, id)); + rows.push({ + id, + level, + closing: true, + key: null, + value: ']', + sub: null, + color: typeToColor('array'), + }); + } + } else if (typeof item === 'object' && item !== null) { + // Add dict subtree + let nestedItemsLength = Object.keys(item).length; + rows.push({ + id, + root: nestedItemsLength > 0, + level, + key: formatValue(key), + value: `{${nestedItemsLength === 0 ? '}' : ''}`, + closedValue: '{...}', + sub: `${nestedItemsLength} item${nestedItemsLength === 1 ? '' : 's'}`, + color: typeToColor('object'), + copyContent: value, + }); + if (nestedItemsLength > 0) { + rows.push( + ...flattenDict(item as Record, level + 1, id), + ); + rows.push({ + id, + level, + closing: true, + key: null, + value: '}', + sub: null, + color: typeToColor('object'), + }); + } + } else { + // Add row for primitive values + rows.push({ + id, + level, + key: Array.isArray(dict) ? +key : formatValue(key), + value, + sub: type === '' ? null : type, + color, + copyContent: value, + }); + } + } + + // Add top level closing brackets + if (level === 0) { + if (Array.isArray(dict)) { + rows.push({ + id: parentKey, + level, + closing: true, + key: null, + value: ']', + sub: null, + color: typeToColor('array'), + }); + } else { + rows.push({ + id: parentKey, + level, + closing: true, + key: null, + value: '}', + sub: null, + color: typeToColor('object'), + }); + } + } + + return rows; +} + +DictVisualizer.displayName = 'DictVisualizer'; + +export default React.memo(DictVisualizer); diff --git a/src/src/components/kit/DictVisualizer/index.ts b/src/src/components/kit/DictVisualizer/index.ts new file mode 100644 index 00000000..7093df67 --- /dev/null +++ b/src/src/components/kit/DictVisualizer/index.ts @@ -0,0 +1,5 @@ +import DictVisualizer from './DictVisualizer'; + +export * from './DictVisualizer.d'; + +export default DictVisualizer; diff --git a/src/src/components/kit/Dropdown/Dropdown.d.ts b/src/src/components/kit/Dropdown/Dropdown.d.ts new file mode 100644 index 00000000..c0890e79 --- /dev/null +++ b/src/src/components/kit/Dropdown/Dropdown.d.ts @@ -0,0 +1,23 @@ +import { IIconProps } from 'components/kit/Icon'; + +export interface IDropdownProps { + placeholder?: string; + value?: string | null; + options: + | OptionsOrGroups<{ value: string; label: string }> + | { value: string; label: string }[]; + size?: 'small' | 'medium' | 'large'; + open?: boolean; + withPortal?: true; + className?: string; + selectClassName?: string; + label?: string; + maxMenuListHeight?: string; + isColored?: boolean; + isDisabled?: boolean; + isClearable?: boolean; + onMenuOpen: () => void; + onMenuClose: () => void; + onChange: (value: { value: string; label: string } | null) => void; + icon?: IIconProps; +} diff --git a/src/src/components/kit/Dropdown/Dropdown.scss b/src/src/components/kit/Dropdown/Dropdown.scss new file mode 100644 index 00000000..9e37f9d9 --- /dev/null +++ b/src/src/components/kit/Dropdown/Dropdown.scss @@ -0,0 +1,50 @@ +@use 'src/styles/abstracts' as *; + +.Dropdown { + position: relative; + &__label { + position: absolute; + z-index: 1; + transition: 0.3s all; + pointer-events: none; + &.swapped { + background: #ffffff; + transition: 0.3s all; + padding: 0 0.25rem; + top: -0.5125rem !important; + } + } + &__indicatorContainer { + padding: 0px 5px; + display: flex; + align-items: center; + height: 100%; + } +} + +.IndicatorsContainer { + padding-right: 0.9375rem; + height: 100%; + display: flex; + align-items: center; + &__clearIcon { + margin-right: 1.25rem; + } +} + +.DropdownCustomOption { + padding: 0.5rem 1rem 0.5rem 0.5rem; + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; + border-radius: $border-radius-sm; + &:hover { + background: #f2f5fa; + } + & > span { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} diff --git a/src/src/components/kit/Dropdown/Dropdown.tsx b/src/src/components/kit/Dropdown/Dropdown.tsx new file mode 100644 index 00000000..793b3e58 --- /dev/null +++ b/src/src/components/kit/Dropdown/Dropdown.tsx @@ -0,0 +1,275 @@ +import React, { useEffect, useState } from 'react'; +import classNames from 'classnames'; +import Select, { + ClearIndicatorProps, + components, + ControlProps, +} from 'react-select'; + +import { Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import DropdownCustomOption from './DropdownCustomOption'; +import { + baseSizes, + indicatorsContainerSizes, + labelTopPosition, +} from './config'; + +import { IDropdownProps } from '.'; + +import './Dropdown.scss'; + +/** + * @property {number} size - input size + * @property {{value: string; label: string}[]} options - options list + * @property {boolean} open - is dropdown open + * @property {string} placeholder - dropdown placeholder + * @property {{value: string; label: string}} value - dropdown value + * @property {string} className - dropdown className + * @property {string} selectClassName - select dropdown className, + * @property {boolean} withPortal - open dropdown menu in portal + * @property {function} onMenuOpen - callBack on menu opening + * @property {function} onMenuClose - callBack on menu closing + * @property {function} onChange - callBack on dropdown value change + * @property {boolean} isColored - color dropdown if it is used + * @property {string} label - swap label to top if dropdown has value and replace placeholder + * @property {IIconProps} icon - icon for dropdown input + * @property {React.HTMLAttributes} rest - rest properties that can be set + */ +function Dropdown({ + size = 'medium', + options, + open = false, + placeholder = 'Select...', + value = null, + className = '', + selectClassName = '', + withPortal, + onMenuOpen, + onMenuClose, + onChange, + isClearable = false, + isColored = false, + maxMenuListHeight = '12.5rem', + label, + icon, + isDisabled = false, + ...rest +}: IDropdownProps): React.FunctionComponentElement { + const [labelSwapped, setLabelSwapped] = useState(!!value); + const customStyles = { + iconStyles: () => + ({ + display: 'inline-flex', + alignItems: 'center', + justifyContent: 'center', + margin: '0 0.5rem', + color: icon?.color || '#1473E6', + width: '1.5rem', + height: '1.5rem', + fontSize: icon?.fontSize, + pointerEvents: 'none', + } as React.CSSProperties), + control: (base: any) => ({ + ...base, + height: baseSizes[size], + minHeight: baseSizes[size], + borderRadius: '0.375rem', + boxShadow: 'none', + borderColor: + isColored && value ? '#1473E6' : open ? '#90AFDA' : '#BDCEE8', + '&:hover': { + borderColor: + isColored && value ? '#1473E6' : open ? '#90AFDA' : '#BDCEE8', + }, + }), + indicatorSeparator: () => ({ + display: 'none', + }), + indicatorsContainer: (provided: any) => ({ + ...provided, + height: indicatorsContainerSizes[size], + padding: '0.375rem 0', + }), + placeholder: (holder: any) => ({ + ...holder, + fontSize: '0.875rem', + color: '#606986', + marginBottom: '0.0625rem', + }), + input: (provided: any) => ({ + ...provided, + margin: '0', + }), + valueContainer: (provided: any) => ({ + ...provided, + height: indicatorsContainerSizes[size], + padding: icon ? '0 0.375rem 0 0rem' : '0 0.375rem 0 1rem', + fontSize: '0.875rem', + color: isColored && value ? '#1473E6' : '#414B6D', + }), + menuPortal: (provided: any) => ({ + ...provided, + zIndex: 1000000, + position: 'fixed', + }), + singleValue: (provided: any) => ({ + ...provided, + marginLeft: 0, + color: isColored && value ? '#1473E6' : '#414B6D', + marginBottom: '0.0625rem', + }), + dropdownIndicator: () => ({ + marginRight: '0.625rem', + height: '100%', + display: 'flex', + alignItems: 'center', + }), + clearIndicator: () => ({ + padding: '0 0.625rem', + borderLeft: '1px solid #D1DDEF', + cursor: 'pointer', + height: '100%', + display: 'flex', + alignItems: 'center', + }), + menu: (provided: any) => ({ + ...provided, + borderRadius: '0.375rem', + padding: '0.5rem', + }), + menuList: (provided: any) => ({ + ...provided, + maxHeight: maxMenuListHeight, + }), + option: (provided: any) => ({ + ...provided, + height: baseSizes[size], + }), + }; + + function ClearIndicator(props: ClearIndicatorProps) { + const { + children = , + getStyles, + innerProps: { ref, ...restInnerProps }, + } = props; + return ( +
+
{children}
+
+ ); + } + + function DropdownIndicator(props: any) { + const { + children = ( + + ), + getStyles, + innerProps: { ref, ...restInnerProps }, + } = props; + return ( +
+
{children}
+
+ ); + } + + function Control({ children, ...props }: ControlProps) { + return ( + + {icon ? ( + + + + ) : null} + {children} + + ); + } + + function handleMenuOpen() { + onMenuOpen(); + !labelSwapped && setLabelSwapped(true); + } + + function handleMenuClose() { + onMenuClose(); + !value && setLabelSwapped(false); + } + + useEffect(() => { + if (value && !labelSwapped) { + setLabelSwapped(true); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [value]); + + return ( + +
+ {label && ( + + {label} + + )} + + +
+
+ + + +`; diff --git a/src/src/components/kit/Input/config.ts b/src/src/components/kit/Input/config.ts new file mode 100644 index 00000000..4241d9bd --- /dev/null +++ b/src/src/components/kit/Input/config.ts @@ -0,0 +1,43 @@ +const labelAppearances = { + default: { + cssClassName: 'default', + }, + swap: { + cssClassName: 'swap', + }, + 'top-labeled': { + cssClassName: 'topLabeled', + }, +}; + +const inputSizes = { + small: { + cssClassName: 'small', + }, + medium: { + cssClassName: 'medium', + }, + large: { + cssClassName: 'large', + }, +}; + +const inputTypeConversionFns: { + [key: string]: ({ + value, + isRequiredNumberValue, + isNumberValueFloat, + }: { + value: any; + isRequiredNumberValue?: boolean; + isNumberValueFloat?: boolean; + }) => string | number | undefined; +} = { + number: ({ value, isRequiredNumberValue, isNumberValueFloat }) => { + const result = isNumberValueFloat ? parseFloat(value) : parseInt(value); + return !isNaN(result) ? result : isRequiredNumberValue ? 0 : undefined; + }, + text: ({ value }) => `${value}`, +}; + +export { labelAppearances, inputSizes, inputTypeConversionFns }; diff --git a/src/src/components/kit/Input/index.tsx b/src/src/components/kit/Input/index.tsx new file mode 100644 index 00000000..b6fafe63 --- /dev/null +++ b/src/src/components/kit/Input/index.tsx @@ -0,0 +1,5 @@ +import Input from './Input'; + +export * from './Input.d'; + +export default Input; diff --git a/src/src/components/kit/JsonViewPopover/JsonViewPopover.tsx b/src/src/components/kit/JsonViewPopover/JsonViewPopover.tsx new file mode 100644 index 00000000..23370557 --- /dev/null +++ b/src/src/components/kit/JsonViewPopover/JsonViewPopover.tsx @@ -0,0 +1,34 @@ +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import DictVisualizer from 'components/kit/DictVisualizer'; + +import { IJsonViewPopoverProps } from './types.d'; + +import './styles.scss'; + +/** + * @property {object} json - json object + * @return React.FunctionComponentElement + */ + +function JsonViewPopover({ + json, + dictVisualizerSize, +}: IJsonViewPopoverProps): React.FunctionComponentElement { + return ( + +
+ +
+
+ ); +} + +JsonViewPopover.displayName = 'JsonViewPopover'; + +export default React.memo(JsonViewPopover); diff --git a/src/src/components/kit/JsonViewPopover/index.ts b/src/src/components/kit/JsonViewPopover/index.ts new file mode 100644 index 00000000..cf909412 --- /dev/null +++ b/src/src/components/kit/JsonViewPopover/index.ts @@ -0,0 +1,6 @@ +import JsonViewPopover from './JsonViewPopover'; + +export * from './types.d'; +export * from './JsonViewPopover'; + +export default JsonViewPopover; diff --git a/src/src/components/kit/JsonViewPopover/styles.scss b/src/src/components/kit/JsonViewPopover/styles.scss new file mode 100644 index 00000000..09e584b8 --- /dev/null +++ b/src/src/components/kit/JsonViewPopover/styles.scss @@ -0,0 +1,8 @@ +@use 'src/styles/abstracts' as *; + +.JsonViewPopover { + display: flex; + justify-content: center; + align-items: center; + padding: $space-unit; +} diff --git a/src/src/components/kit/JsonViewPopover/types.d.ts b/src/src/components/kit/JsonViewPopover/types.d.ts new file mode 100644 index 00000000..02cd7030 --- /dev/null +++ b/src/src/components/kit/JsonViewPopover/types.d.ts @@ -0,0 +1,7 @@ +export interface IJsonViewPopoverProps { + json: object; + dictVisualizerSize?: { + width: number; + height: number; + }; +} diff --git a/src/src/components/kit/ListItem/Index.ts b/src/src/components/kit/ListItem/Index.ts new file mode 100644 index 00000000..3320afcb --- /dev/null +++ b/src/src/components/kit/ListItem/Index.ts @@ -0,0 +1,5 @@ +import ListItem from './ListItem'; + +export * from './ListItem'; + +export default ListItem; diff --git a/src/src/components/kit/ListItem/ListItem.d.ts b/src/src/components/kit/ListItem/ListItem.d.ts new file mode 100644 index 00000000..6d8fa4a2 --- /dev/null +++ b/src/src/components/kit/ListItem/ListItem.d.ts @@ -0,0 +1,11 @@ +import React from 'react'; + +export interface IListItemProps + extends Partial> { + className?: string; + children?: React.ReactNode; + size?: IListITemSize; + onClick?: (event: React.MouseEvent) => void; +} + +export type IListITemSize = 'small' | 'medium' | 'large'; diff --git a/src/src/components/kit/ListItem/ListItem.tsx b/src/src/components/kit/ListItem/ListItem.tsx new file mode 100644 index 00000000..af40f8d6 --- /dev/null +++ b/src/src/components/kit/ListItem/ListItem.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import styled from 'styled-components'; + +import { IListItemProps, IListITemSize } from './ListItem.d'; + +const heights: { small: string; medium: string; large: string } = { + small: '24px', + medium: '28px', + large: '32px', +}; + +const Container = styled.div` + display: flex; + align-items: center; + height: ${({ size }) => heights[size as IListITemSize]}; + padding: 0 0.75rem; + border-radius: 0.25rem; + transition: all 0.18s ease-out; + cursor: pointer; + &:hover { + background-color: #f4f4f6; + color: #1473e6; + .Text { + color: #1473e6; + } + } + .Text { + max-width: 100%; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } +`; + +function ListItem({ + className = '', + size = 'medium', + children, + onClick, + ...rest +}: IListItemProps) { + return ( + null} + className={`ListItem ${className}`} + size={size} + {...rest} + > + {children} + + ); +} + +export default React.memo(ListItem); diff --git a/src/src/components/kit/Menu/Menu.scss b/src/src/components/kit/Menu/Menu.scss new file mode 100644 index 00000000..d91beb07 --- /dev/null +++ b/src/src/components/kit/Menu/Menu.scss @@ -0,0 +1,106 @@ +@use 'src/styles/abstracts' as *; + +$border_radius: toRem(6px); + +$title_top_padding: toRem(10px); +$title_left_padding: toRem(15px); +$padding_8: toRem(8px); + +.Aim_Menu_Wr { + display: flex; + flex-direction: column; + border: toRem(1px) solid $grayish; + box-sizing: border-box; + border-radius: $border_radius 0 0 $border_radius; + height: 100%; + .Title { + background-color: $primary-color-5; + padding: $title_top_padding $title_left_padding; + border-bottom: toRem(1px) solid $grayish; + border-top-left-radius: $border_radius + } + .Menu { + display: flex; + flex-direction: column; + padding: toRem(8px); + overflow-y: auto; + height: 100%; + .MenuItem { + display: flex; + flex-direction: column; + margin-bottom: toRem(2px); + border-radius: $border-radius; + &:focus-visible { + outline:unset; + } + // layers1 layer2 is created due to design inconsistencies + // @TODO improve this while working on creating tree view from this component + .MenuItemHead { + cursor: pointer; + border-radius: toRem(6px); + display: flex; + word-break: break-word; + + div { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: toRem(9px) toRem(14px); + } + &.layer1 { + &.active { + background-color: $primary-color-10; + &:before { + content: ''; + width: 4px; + border-radius: $border_radius 0 0 $border-radius; + background: $primary-color; + } + } + } + &.layer2 { + // additional styles here + } + &.open { + background-color: $primary-color-10; + + &:before { + content: ''; + width: 4px; + border-radius: $border_radius 0 0 0; // difference width active is top-left border radius + background: $primary-color; + } + } + &.no_child { + margin-right: toRem(8px); + } + &:hover { + background: $cuddle-30; + } + } + .MenuItemBody { + width: 100%; + background-color: $primary-color-5; + border-radius: 0 toRem(4px) toRem(4px) 0; + display: none; + &.open { + display: flex; + } + + > div { + padding: $padding_8 0 $padding_8 $padding_8; + width: 100%; + } + + // left blue layer + &:before { + content: ''; + width: toRem(4px); + border-bottom-left-radius: $border_radius; + background: $primary-color; + } + } + } + } +} diff --git a/src/src/components/kit/Menu/Menu.tsx b/src/src/components/kit/Menu/Menu.tsx new file mode 100644 index 00000000..c29d4c56 --- /dev/null +++ b/src/src/components/kit/Menu/Menu.tsx @@ -0,0 +1,69 @@ +import React from 'react'; + +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import MenuItem from './MenuItem'; +import { IMenuProps, IMenuItem } from './types'; + +import './Menu.scss'; + +/** + * Menu component + * usage + * + */ +function Menu({ + data, + title, + onChangeActiveItem, + defaultActiveItemKey = '', +}: IMenuProps): React.FunctionComponentElement { + const [activeItemKey, setActiveItemKey] = + React.useState(defaultActiveItemKey); + + const onClickItem = React.useCallback( + (key: string, name: string) => { + setActiveItemKey(key); + if (onChangeActiveItem) { + onChangeActiveItem(key, name); + } + }, + [onChangeActiveItem, setActiveItemKey], + ); + + React.useEffect(() => { + if (defaultActiveItemKey !== activeItemKey) { + setActiveItemKey(defaultActiveItemKey); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [defaultActiveItemKey]); + + return ( + +
+ {title && ( +
+ + {title} + +
+ )} +
+ {data.map((item: IMenuItem) => ( + + ))} +
+
+
+ ); +} + +Menu.displayName = 'Menu'; + +export default React.memo(Menu); diff --git a/src/src/components/kit/Menu/MenuItem.tsx b/src/src/components/kit/Menu/MenuItem.tsx new file mode 100644 index 00000000..571c62f3 --- /dev/null +++ b/src/src/components/kit/Menu/MenuItem.tsx @@ -0,0 +1,139 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IMenuItemProps, IMenuItem } from './types'; + +/** + * Generate key with id and parentId + * @param parentId + * @param id + */ +function generateKeyWithParent(parentId: string | number, id: string | number) { + return (parentId ? parentId + '.' : '') + id; +} + +/** + * MenuItem + * active key computed based on tree model (test1.test2.test3) + * @param name + * @param id + * @param children + * @param onClickOpen + * @param parentId + * @param activeItemKey + */ +function MenuItem({ + name, + id, + children, + onClickOpen, + parentId = '', + activeItemKey, +}: IMenuItemProps) { + const { isActive, isOpen } = React.useMemo(() => { + /* + * the fastest algorithm to have tree view is to identify the item with it's parent's ids + * if we have this type of tree + * layer1 -> layer2 -> layer3 + * if the layer3 is active, the active key will be layer1.layer2.layer3 + * if the layer2 is active, the active key will be layer1.layer2 + */ + const key = generateKeyWithParent(parentId, id); + const active = key === activeItemKey || id === activeItemKey; + const open = activeItemKey.toString().includes(`${key}.`); + + return { + isActive: active, + isOpen: open, + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [activeItemKey, id, parentId, name]); + + const onClickItem = React.useCallback( + (event) => { + event.stopPropagation(); + event.stopPropagation(); + let key = generateKeyWithParent(parentId, id); + let callbackName = name; + // if the item has children, activate first child + if (children?.length) { + key += `.${children[0].id}`; + callbackName = children[0].name; + } + + // ensure that clicked item is not active yet + if (key !== activeItemKey) { + onClickOpen(key, callbackName); + } + }, + [onClickOpen, parentId, id, name, children, activeItemKey], + ); + + return ( + +
+
+
+ + {name} + + {children?.length && ( + + )} +
+
+ {children?.length && ( +
+
+ {children?.map((item: IMenuItem) => ( + + ))} +
+
+ )} +
+
+ ); +} + +export default React.memo(MenuItem); diff --git a/src/src/components/kit/Menu/index.ts b/src/src/components/kit/Menu/index.ts new file mode 100644 index 00000000..be5ef3de --- /dev/null +++ b/src/src/components/kit/Menu/index.ts @@ -0,0 +1,8 @@ +import Menu from './Menu'; +import Item from './MenuItem'; + +export * from './Menu'; +export * from './types.d'; + +export const MenuItem = Item; +export default Menu; diff --git a/src/src/components/kit/Menu/types.d.ts b/src/src/components/kit/Menu/types.d.ts new file mode 100644 index 00000000..a56fed8f --- /dev/null +++ b/src/src/components/kit/Menu/types.d.ts @@ -0,0 +1,20 @@ +export type IMenuItem = { + id: string | number; + children?: IMenuItem[]; + name: string; +}; + +export interface IMenuItemProps extends IMenuItem { + onClickOpen: (key: string, name: string) => void; + activeItemKey: string | number; + parentId?: string | number; +} + +export type MenuData = IMenuItem[]; + +export type IMenuProps = { + onChangeActiveItem?: (key: string, name: string) => void; + defaultActiveItemKey?: string; + data: MenuData; + title?: string; +}; diff --git a/src/src/components/kit/Modal/Modal.d.ts b/src/src/components/kit/Modal/Modal.d.ts new file mode 100644 index 00000000..c0a86eea --- /dev/null +++ b/src/src/components/kit/Modal/Modal.d.ts @@ -0,0 +1,28 @@ +import React from 'react'; + +import { DialogProps } from '@material-ui/core'; + +import { IconName } from 'components/kit/Icon/Icon.d'; + +import { Override } from 'types/utils/common'; + +export type IModalProps = Override< + DialogProps, + { + open: boolean; + onClose: () => void; + onOk: () => void; + title?: string | React.ReactNode; + titleIconName?: IconName; + titleIconColor?: string; + cancelButtonText?: string | React.ReactNode; + okButtonText?: string | React.ReactNode; + modalType?: 'warning' | 'error' | 'info' | 'success'; + okButtonColor?: string; + withoutTitleIcon?: boolean; + children: React.ReactNode; + maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false; + isOkButtonDisabled?: boolean; + className?: string; + } +>; diff --git a/src/src/components/kit/Modal/Modal.scss b/src/src/components/kit/Modal/Modal.scss new file mode 100644 index 00000000..bd3df873 --- /dev/null +++ b/src/src/components/kit/Modal/Modal.scss @@ -0,0 +1,96 @@ +@use 'src/styles/abstracts' as *; + +@mixin getTypeColors($color, $cover-color) { + .Modal__header__titleIcon { + background-color: $cover-color; + + .Icon__container { + color: $color; + } + } + + .Modal__footer__okButton { + background-color: $color; + } +} + +.Modal { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + padding: 1rem 0.5rem 0 0.5rem; + position: relative; + max-height: calc(100vh - 4rem); + &__header { + padding: 0.5rem 1rem; + display: flex; + align-items: center; + width: 100%; + &__titleIcon { + width: 2rem; + height: 2rem; + display: flex; + justify-content: center; + align-items: center; + border-radius: $border-radius-circle; + margin-right: 1rem; + &.warning { + color: $warning-color; + background: $warning-color-10; + } + &.error { + color: $error-color; + background: $error-color-10; + } + &.success { + color: $success-color; + background: $success-color-10; + } + &.info { + color: $primary-color; + background: $primary-color-10; + } + } + } + &__content { + padding: 0 1rem 1.5rem 1rem; + overflow: auto; + } + &__footer { + border-top: $border-main; + padding: 1rem; + display: flex; + justify-content: flex-end; + width: 100%; + &__okButton { + margin-left: 0.5rem; + } + &__okCancel { + color: $pico; + } + } + + &.warning { + @include getTypeColors($warning-color, $warning-color-10); + } + + &.error { + @include getTypeColors($error-color, $error-color-10); + } + + &.info { + @include getTypeColors($primary-color, $primary-color-10); + } + + &.success { + @include getTypeColors($success-color, $success-color-10); + } + + &__closeButton { + position: absolute; + top: $space-xxs; + right: $space-xxs; + color: $pico-80; + } +} diff --git a/src/src/components/kit/Modal/Modal.tsx b/src/src/components/kit/Modal/Modal.tsx new file mode 100644 index 00000000..ee339b44 --- /dev/null +++ b/src/src/components/kit/Modal/Modal.tsx @@ -0,0 +1,107 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { Dialog } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; + +import { IModalProps } from './Modal.d'; + +import './Modal.scss'; + +const ModalType: any = { + warning: { + iconName: 'warning-contained', + }, + error: { iconName: 'close-circle' }, + info: { iconName: 'circle-info' }, + success: { iconName: 'success-icon' }, +}; + +function Modal({ + open, + onClose, + onOk, + title, + titleIconName, + cancelButtonText = 'Cancel', + modalType = 'info', + okButtonText = 'Ok', + okButtonColor, + withoutTitleIcon, + children, + maxWidth = 'sm', + isOkButtonDisabled = false, + className = '', + ...rest +}: IModalProps): React.FunctionComponentElement { + return ( + +
+
+ {!withoutTitleIcon && ( +
+ +
+ )} + {title && ( +
+ {typeof title === 'string' ? ( + + {title} + + ) : ( + title + )} +
+ )} +
+
{children}
+
+ + +
+ +
+
+ ); +} + +Modal.displayName = 'Modal'; + +export default React.memo(Modal); diff --git a/src/src/components/kit/Modal/index.tsx b/src/src/components/kit/Modal/index.tsx new file mode 100644 index 00000000..c907a47b --- /dev/null +++ b/src/src/components/kit/Modal/index.tsx @@ -0,0 +1,5 @@ +import Modal from './Modal'; + +export * from './Modal.d'; + +export default Modal; diff --git a/src/src/components/kit/SelectDropdown/SelectDropdown.d.ts b/src/src/components/kit/SelectDropdown/SelectDropdown.d.ts new file mode 100644 index 00000000..41b0d2d2 --- /dev/null +++ b/src/src/components/kit/SelectDropdown/SelectDropdown.d.ts @@ -0,0 +1,18 @@ +import AutocompleteProps from '@material-ui/lab/Autocomplete/Autocomplete'; +import { UseAutocompleteProps } from '@material-ui/lab'; + +export interface ISelectDropdownOption { + value: string; + label: string; + group?: string; +} + +export type ISelectDropdownProps = Omit< + AutocompleteProps, + 'ListboxProps' +> & + UseAutocompleteProps & { + selectOptions: T[]; + handleSelect: (option: T) => void; + selected?: T['value']; + }; diff --git a/src/src/components/kit/SelectDropdown/SelectDropdown.scss b/src/src/components/kit/SelectDropdown/SelectDropdown.scss new file mode 100644 index 00000000..32999a9e --- /dev/null +++ b/src/src/components/kit/SelectDropdown/SelectDropdown.scss @@ -0,0 +1,31 @@ +@use 'src/styles/abstracts' as *; + +.SelectDropdown { + position: relative; + &__popper { + .MuiAutocomplete-groupLabel { + color: $text-color-50; + font-size: $text-sm; + font-weight: 500; + border-top: $border-separator; + } + + .MuiAutocomplete-option[aria-selected="true"] { + .SelectDropdown__option__label { + color: $primary-color; + } + } + } + &__groupItem { + padding: $space-xxs $space-sm; + width: 100%; + user-select: none; + &__divider { + margin: $space-xs 0; + } + } + &__Input { + display: flex; + padding: $space-sm $space-unit; + } +} \ No newline at end of file diff --git a/src/src/components/kit/SelectDropdown/SelectDropdown.tsx b/src/src/components/kit/SelectDropdown/SelectDropdown.tsx new file mode 100644 index 00000000..c6033a24 --- /dev/null +++ b/src/src/components/kit/SelectDropdown/SelectDropdown.tsx @@ -0,0 +1,141 @@ +import React from 'react'; + +import { TextField } from '@material-ui/core'; +import { Autocomplete, AutocompleteRenderInputParams } from '@material-ui/lab'; + +import { Text } from 'components/kit'; + +import { + ISelectDropdownOption as ISelectOption, + ISelectDropdownProps, +} from './SelectDropdown.d'; + +import './SelectDropdown.scss'; + +/** + * @property {ISelectDropdownOption[]} selectOptions - options for select dropdown + * @property {Function} handleSelect - handle selected option + * @property {string | undefined} selected - controlled select dropdown (optional) + * @property {AutocompleteProps} rest - rest props for Autocomplete component + * @property {React.HTMLElement} children - children element + */ + +function SelectDropdown({ + selectOptions = [], + handleSelect, + selected, + ...rest +}: ISelectDropdownProps): React.FunctionComponentElement { + const [selectedOption, setSelectedOption] = React.useState(); + const [searchValue, setSearchValue] = React.useState(); + + // ****** memoized functions + const renderInput = React.useCallback( + (params: AutocompleteRenderInputParams): React.ReactNode => { + return ( + ) => { + setSearchValue(e.target.value); + }, + onBlur: (event) => { + const { onBlur } = params.inputProps as { onBlur: Function }; + onBlur?.(event); + setSearchValue(selectedOption?.label); + }, + }} + className='TextField__OutLined__Small' + variant='outlined' + placeholder='Select Alignment' + /> + ); + }, + [selectedOption, searchValue], + ); + + const renderOption = React.useCallback( + (option: ISelectOption): React.ReactNode => { + return ( +
+ + {option.label} + +
+ ); + }, + [], + ); + + const handleOptionChange = React.useCallback( + (e: React.ChangeEvent<{}>, option: ISelectOption) => { + handleSelect(option); + setSelectedOption(option); + setSearchValue(undefined); + }, + [handleSelect, setSelectedOption, setSearchValue], + ); + + // ****** hooks + React.useEffect(() => { + if (selected) { + const controlledSelectedOption = selectOptions.find( + (option: ISelectOption) => option.value === selected, + ); + if (controlledSelectedOption) { + setSelectedOption(controlledSelectedOption); + } + } + }, [selected, selectOptions]); + + // ****** memoized data + const optionsToRender = React.useMemo(() => { + if ( + (searchValue || searchValue?.trim() !== '') && + searchValue !== selectedOption?.label + ) { + const searchKey = searchValue?.toLowerCase() || ''; + return selectOptions.filter((item: ISelectOption) => { + return item.label.toLowerCase().indexOf(searchKey) !== -1; + }); + } + return selectOptions; + }, [selectOptions, searchValue, selectedOption]); + + return ( +
+ option.group || ''} + getOptionLabel={(option: ISelectOption) => option.label} + getOptionSelected={(option: ISelectOption, value) => + option.value === value.value + } + renderInput={renderInput} + renderOption={renderOption} + classes={{ + popper: 'SelectDropdown__popper', + }} + {...rest} + /> +
+ ); +} + +SelectDropdown.displayName = 'SelectDropdown'; + +export default React.memo>(SelectDropdown); diff --git a/src/src/components/kit/SelectDropdown/index.tsx b/src/src/components/kit/SelectDropdown/index.tsx new file mode 100644 index 00000000..22761588 --- /dev/null +++ b/src/src/components/kit/SelectDropdown/index.tsx @@ -0,0 +1,5 @@ +import SelectDropdown from './SelectDropdown'; + +export * from './SelectDropdown.d'; + +export default SelectDropdown; diff --git a/src/src/components/kit/Slider/Slider.d.ts b/src/src/components/kit/Slider/Slider.d.ts new file mode 100644 index 00000000..1189c0bf --- /dev/null +++ b/src/src/components/kit/Slider/Slider.d.ts @@ -0,0 +1,12 @@ +import React from 'react'; + +import { SliderProps } from '@material-ui/core'; + +export interface ISliderProps extends SliderProps { + containerClassName?: string; + style?: React.CSSProperties; + onChange?: (event: React.ChangeEvent<{}>, value: number | number[]) => void; + prevIconNode?: React.ReactNode; + nextIconNode?: React.ReactNode; + label?: React.ReactNode; +} diff --git a/src/src/components/kit/Slider/Slider.scss b/src/src/components/kit/Slider/Slider.scss new file mode 100644 index 00000000..e7b4d5be --- /dev/null +++ b/src/src/components/kit/Slider/Slider.scss @@ -0,0 +1,84 @@ +@use 'src/styles/abstracts' as *; + +.Slider { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + .MuiSlider-root { + padding: 0; + height: 0.25rem; + .MuiSlider-rail { + height: 0.25rem; + border-radius: $border-radius-sm; + opacity: 1; + background: $cuddle-50; + } + .MuiSlider-track { + height: 0.25rem; + border-radius: $border-radius-sm; + background: $primary-color; + } + .MuiSlider-thumb { + background: $white; + border: 0.09375rem solid $primary-color; + margin-top: -0.25rem; + margin-left: -$space-xxs; + .MuiSlider-valueLabel { + left: calc(-50% - 0.625rem); + top: -1.0625rem; + } + .MuiSlider-valueLabel > span { + width: 2.3125rem; + height: 1.1875rem; + border: 0.0625rem solid $primary-color; + background: $white; + border-radius: 0.4375rem; + transform: unset; + span { + font-size: 0.625rem; + font-weight: $font-600; + color: $primary-color; + transform: unset; + text-overflow: ellipsis; + max-width: 100%; + overflow: hidden; + padding: $space-xxxxs $space-xxxs; + } + } + &.Mui-focusVisible { + box-shadow: 0 0 0 0.125rem rgba(20, 115, 230, 0.2); + } + &:hover { + box-shadow: 0 0 0 0.125rem rgba(20, 115, 230, 0.2); + } + &.MuiSlider-active { + box-shadow: 0 0 0 0.125rem rgba(20, 115, 230, 0.2); + } + &::after { + top: 0px; + bottom: 0px; + left: 0px; + right: 0px; + } + } + } + .Mui-disabled { + .MuiSlider-track { + background: #a7b7cd; + } + .MuiSlider-thumb { + margin-top: toRem(-2px); + margin-left: toRem(-4px); + } + } + .Mui-disabled { + .MuiSlider-track { + background: #a7b7cd; + } + .MuiSlider-thumb { + margin-top: toRem(-2px); + margin-left: toRem(-4px); + } + } +} diff --git a/src/src/components/kit/Slider/Slider.tsx b/src/src/components/kit/Slider/Slider.tsx new file mode 100644 index 00000000..1aefd716 --- /dev/null +++ b/src/src/components/kit/Slider/Slider.tsx @@ -0,0 +1,33 @@ +import React from 'react'; + +import { Slider as MaterialSlider } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ISliderProps } from '.'; + +import './Slider.scss'; + +function Slider({ + containerClassName = '', + style = {}, + prevIconNode = null, + nextIconNode = null, + label = null, + ...rest +}: ISliderProps): React.FunctionComponentElement { + return ( + +
+ {label} + {prevIconNode && prevIconNode} + + {nextIconNode && nextIconNode} +
+
+ ); +} + +Slider.displayName = 'Slider'; + +export default React.memo(Slider); diff --git a/src/src/components/kit/Slider/index.ts b/src/src/components/kit/Slider/index.ts new file mode 100644 index 00000000..e75312cc --- /dev/null +++ b/src/src/components/kit/Slider/index.ts @@ -0,0 +1,5 @@ +import Slider from './Slider'; + +export * from './Slider.d'; + +export default Slider; diff --git a/src/src/components/kit/Spinner/Spinner.d.ts b/src/src/components/kit/Spinner/Spinner.d.ts new file mode 100644 index 00000000..23964d6e --- /dev/null +++ b/src/src/components/kit/Spinner/Spinner.d.ts @@ -0,0 +1,7 @@ +export interface ISpinnerProps { + className?: string; + style?: React.StyleHTMLAttributes; + size?: number | string; + thickness?: number; + color?: string; +} diff --git a/src/src/components/kit/Spinner/Spinner.scss b/src/src/components/kit/Spinner/Spinner.scss new file mode 100644 index 00000000..3a4d3053 --- /dev/null +++ b/src/src/components/kit/Spinner/Spinner.scss @@ -0,0 +1,30 @@ +@use 'src/styles/abstracts' as *; + +.Spinner { + display: flex; + justify-content: center; + align-items: center; +} + +.Spinner__loader { + width: 100%; + height: 100%; + border-style: solid; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { + transform: rotate(0); + } + 50% { + transform: rotate(120deg); + } + 75% { + transform: rotate(270deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/src/src/components/kit/Spinner/Spinner.tsx b/src/src/components/kit/Spinner/Spinner.tsx new file mode 100644 index 00000000..fce46ae1 --- /dev/null +++ b/src/src/components/kit/Spinner/Spinner.tsx @@ -0,0 +1,42 @@ +import React from 'react'; + +import { ISpinnerProps } from './Spinner.d'; + +import './Spinner.scss'; + +/** + * @property {number | string} size - * The size of the circle. + * If using a number, the pixel unit is assumed. + * If using a string, you need to provide the CSS unit, e.g '3rem'. + * @property {number} thickness - The thickness of the circle. + * @property {string} color - The color of the circle. + * @property {string} className - component className + */ + +function Spinner({ + size = 40, + thickness = 3, + color = '#1473e6', + className = '', +}: ISpinnerProps): React.FunctionComponentElement { + return ( +
+
+
+ ); +} + +Spinner.displayName = 'Spinner'; + +export default React.memo(Spinner); diff --git a/src/src/components/kit/Spinner/index.tsx b/src/src/components/kit/Spinner/index.tsx new file mode 100644 index 00000000..baa7cb99 --- /dev/null +++ b/src/src/components/kit/Spinner/index.tsx @@ -0,0 +1,5 @@ +import Spinner from './Spinner'; + +export * from './Spinner.d'; + +export default Spinner; diff --git a/src/src/components/kit/Switcher/Switcher.d.ts b/src/src/components/kit/Switcher/Switcher.d.ts new file mode 100644 index 00000000..78be393f --- /dev/null +++ b/src/src/components/kit/Switcher/Switcher.d.ts @@ -0,0 +1,18 @@ +import React, { ReactElement } from 'react'; + +export interface ISwitcherProps { + leftLabel?: SwitcherLabel; + rightLabel?: SwitcherLabel; + checked: boolean | undefined; + color?: 'primary' | 'secondary'; + size?: 'small' | 'medium' | 'large'; + variant?: 'contained' | 'outlined'; + name?: string; + onChange: (e: React.ChangeEvent, checked: boolean) => void; +} + +export type SwitcherLabel = + | string + | number + | React.FunctionComponent + | ReactElement; diff --git a/src/src/components/kit/Switcher/Switcher.scss b/src/src/components/kit/Switcher/Switcher.scss new file mode 100644 index 00000000..bca11b15 --- /dev/null +++ b/src/src/components/kit/Switcher/Switcher.scss @@ -0,0 +1,189 @@ +@use 'src/styles/abstracts' as *; + +.Switcher { + display: inline-block; + cursor: pointer; + border-radius: 0.625rem; + color: #fff; + position: relative; + user-select: none; + border: none; + + &__circle { + border-radius: 0.625rem; + background-color: #fff; + transition: all 0.1s linear; + position: absolute; + left: 2px; + top: $space-xxxxs; + } + + &__leftLabel, + &__rightLabel { + transition: all 0.18s ease-out; + position: absolute; + top: 4px; + line-height: 8px; + } + + &__leftLabel { + left: 4px; + transform: scale(0); + } + + &__rightLabel { + transform: scale(1); + right: 4px; + } + + &__checked { + .Switcher__leftLabel { + transform: scale(1); + } + + .Switcher__rightLabel { + transform: scale(0); + } + } + + &__primary { + background-color: $pico-50; + + &.Switcher__checked { + background-color: $primary-color; + } + } + + &__secondary { + background-color: $pico-50; + + &.Switcher__checked { + background-color: $pico; + } + } + + &__small { + height: 0.8125rem; + width: 1.5rem; + font-size: 0.5rem; + .Switcher__circle { + width: 0.5625rem; + border-radius: 0.5rem; + height: 0.5625rem; + line-height: 0.5625rem; + top: 2px; + &__checked { + left: calc(100% - 11px); + } + } + &:hover { + .Switcher__circle { + width: 0.675rem; + &__checked { + left: calc(100% - 13px); + } + } + } + .Switcher__leftLabel, + .Switcher__rightLabel { + top: 3px; + font-size: 7px; + line-height: 7px; + display: flex; + align-items: center; + justify-content: center; + } + } + + &__medium { + height: 1rem; + width: 2rem; + line-height: 8px; + + .Switcher__circle { + font-size: 0.75rem; + width: 0.75rem; + height: 0.75rem; + &__checked { + left: calc(100% - 14px); + } + } + &:hover { + .Switcher__circle { + width: 0.9375rem; + &__checked { + left: calc(100% - 17px); + } + } + } + } + + &__large { + height: 1.25rem; + width: 2.5rem; + font-size: 10px; + line-height: 10px; + + .Switcher__circle { + width: 1rem; + height: 1rem; + &__checked { + left: calc(100% - 18px); + } + } + &:hover { + .Switcher__circle { + width: 1.25rem; + &__checked { + left: calc(100% - 22px); + } + } + } + + .Switcher__leftLabel, + .Switcher__rightLabel { + font-size: 10px; + line-height: 8px; + display: flex; + align-items: center; + justify-content: center; + top: 5px; + } + } + + &__outlined { + border: 0.0625rem solid $pico-50; + background-color: #fff; + color: $pico-50; + + &.Switcher__primary { + &.Switcher__small { + .Switcher__rightLabel { + top: 2px; + right: 2px; + } + + .Switcher__leftLabel { + top: 2px; + left: 2px; + } + } + + .Switcher__circle { + color: $pico-50; + background-color: $pico-50; + top: 1px; + &__checked { + color: $primary-color; + background-color: $primary-color; + } + } + + &.Switcher__checked { + border-color: $primary-color; + background-color: #fff; + color: $primary-color; + } + } + } +} diff --git a/src/src/components/kit/Switcher/Switcher.test.tsx b/src/src/components/kit/Switcher/Switcher.test.tsx new file mode 100644 index 00000000..aa695ea9 --- /dev/null +++ b/src/src/components/kit/Switcher/Switcher.test.tsx @@ -0,0 +1,52 @@ +import { render, fireEvent } from '@testing-library/react'; + +import Switcher from './Switcher'; + +const mockClick = jest.fn(); + +describe(' -', () => { + test('Renders Correctly', () => { + const { asFragment } = render( + , + ); + + expect(asFragment()).toMatchSnapshot(); + }); + + test('Renders width labels correctly', () => { + const { getByText } = render( + , + ); + + expect(getByText('right label', { exact: true })); + expect(getByText('left label', { exact: true })); + }); + + test('onchange event works properly', () => { + const { getByTestId } = render(); + + const switcher = getByTestId('switcher'); + + fireEvent.click(switcher); + expect(mockClick).toHaveBeenCalledTimes(1); + expect(switcher.querySelector('i')).not.toHaveClass( + 'Switcher__circle__checked', + ); + + fireEvent.click(switcher); + expect(mockClick).toHaveBeenCalledTimes(2); + expect(switcher.querySelector('i')).toHaveClass( + 'Switcher__circle__checked', + ); + }); +}); diff --git a/src/src/components/kit/Switcher/Switcher.tsx b/src/src/components/kit/Switcher/Switcher.tsx new file mode 100644 index 00000000..4820385a --- /dev/null +++ b/src/src/components/kit/Switcher/Switcher.tsx @@ -0,0 +1,58 @@ +import React from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ISwitcherProps } from './Switcher.d'; + +import './Switcher.scss'; + +function Switcher({ + onChange, + checked, + color = 'primary', + leftLabel, + rightLabel, + size = 'medium', + variant = 'contained', + name = 'switcher', +}: ISwitcherProps) { + const [checkedValue, setCheckedValue] = React.useState( + checked, + ); + + function handleClick(e: React.ChangeEvent) { + setCheckedValue(!checkedValue); + onChange(e, !checkedValue); + } + + React.useEffect(() => { + setCheckedValue((prevState) => { + return checked !== prevState ? checked : prevState; + }); + }, [checked]); + + return ( + + + + ); +} + +export default React.memo(Switcher); diff --git a/src/src/components/kit/Switcher/__snapshots__/Switcher.test.tsx.snap b/src/src/components/kit/Switcher/__snapshots__/Switcher.test.tsx.snap new file mode 100644 index 00000000..e2ec6585 --- /dev/null +++ b/src/src/components/kit/Switcher/__snapshots__/Switcher.test.tsx.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` - Renders Correctly 1`] = ` + + + +`; diff --git a/src/src/components/kit/Switcher/index.ts b/src/src/components/kit/Switcher/index.ts new file mode 100644 index 00000000..d00e51b3 --- /dev/null +++ b/src/src/components/kit/Switcher/index.ts @@ -0,0 +1,4 @@ +import Switcher from './Switcher'; + +export * from './Switcher.d'; +export default Switcher; diff --git a/src/src/components/kit/Test/Test.test.tsx b/src/src/components/kit/Test/Test.test.tsx new file mode 100644 index 00000000..79608848 --- /dev/null +++ b/src/src/components/kit/Test/Test.test.tsx @@ -0,0 +1,27 @@ +import { render } from '@testing-library/react'; + +import Test from './Test'; + +const Title1 = 'Test Title 1'; +const Title2 = 'Test Title 2'; + +describe(' - ', () => { + test('Renders without crashing', () => { + const { asFragment } = render(); + + expect(asFragment()).toMatchSnapshot(); + }); + + test('Renders right content', () => { + const { getByText } = render(); + + getByText(Title2); + }); + + test('Prop change works properly', () => { + const { getByText, rerender } = render(); + getByText(Title2); + rerender(); + getByText(Title1); + }); +}); diff --git a/src/src/components/kit/Test/Test.tsx b/src/src/components/kit/Test/Test.tsx new file mode 100644 index 00000000..d3941419 --- /dev/null +++ b/src/src/components/kit/Test/Test.tsx @@ -0,0 +1,24 @@ +import React from 'react'; + +import Text from 'components/kit/Text'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ITestProps } from './types.d'; + +import './styles.scss'; + +function Test({ + title, +}: ITestProps): React.FunctionComponentElement { + return ( + +
+ {title} +
+
+ ); +} + +Test.displayName = 'Test'; + +export default React.memo(Test); diff --git a/src/src/components/kit/Test/__snapshots__/Test.test.tsx.snap b/src/src/components/kit/Test/__snapshots__/Test.test.tsx.snap new file mode 100644 index 00000000..16122469 --- /dev/null +++ b/src/src/components/kit/Test/__snapshots__/Test.test.tsx.snap @@ -0,0 +1,15 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` - Renders without crashing 1`] = ` + +
+ + Test Title 1 + +
+
+`; diff --git a/src/src/components/kit/Test/index.ts b/src/src/components/kit/Test/index.ts new file mode 100644 index 00000000..9df95791 --- /dev/null +++ b/src/src/components/kit/Test/index.ts @@ -0,0 +1,6 @@ +import Test from './Test'; + +export * from './types.d'; +export * from './Test'; + +export default Test; diff --git a/src/src/components/kit/Test/styles.scss b/src/src/components/kit/Test/styles.scss new file mode 100644 index 00000000..ea63d417 --- /dev/null +++ b/src/src/components/kit/Test/styles.scss @@ -0,0 +1,8 @@ +@use 'src/styles/abstracts' as *; + +.Test { + display: flex; + justify-content: center; + align-items: center; +} + \ No newline at end of file diff --git a/src/src/components/kit/Test/types.d.ts b/src/src/components/kit/Test/types.d.ts new file mode 100644 index 00000000..43cffb8c --- /dev/null +++ b/src/src/components/kit/Test/types.d.ts @@ -0,0 +1,3 @@ +export interface ITestProps { + title: string; +} diff --git a/src/src/components/kit/Text/Text.d.ts b/src/src/components/kit/Text/Text.d.ts new file mode 100644 index 00000000..1ec566c9 --- /dev/null +++ b/src/src/components/kit/Text/Text.d.ts @@ -0,0 +1,41 @@ +import React from 'react'; + +export interface ITextProps + extends Partial< + React.HTMLAttributes< + HTMLSpanElement | HTMLHeadingElement | HTMLParagraphElement | HTMLElement + > + > { + component?: componentType; + weight?: componentWeightType; + size?: componentSizeType; + color?: componentColorType; + className?: string; + children?: React.ReactNode; + tint?: componentTintType; + ref?: React.MutableRefObject; +} + +type componentType = + | 'h1' + | 'h2' + | 'h3' + | 'h4' + | 'h5' + | 'h6' + | 'span' + | 'p' + | 'pre' + | 'strong' + | 'small'; +type componentColorType = + | 'primary' + | 'secondary' + | 'success' + | 'error' + | 'warning' + | 'info' + | 'inherit'; +type componentSizeType = 8 | 10 | 11 | 12 | 14 | 16 | 18 | 24 | 36; +type componentWeightType = 300 | 400 | 500 | 600 | 700; +type componentTintType = 5 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100; diff --git a/src/src/components/kit/Text/Text.scss b/src/src/components/kit/Text/Text.scss new file mode 100644 index 00000000..f7ddf60d --- /dev/null +++ b/src/src/components/kit/Text/Text.scss @@ -0,0 +1,193 @@ +@use 'src/styles/abstracts' as *; + +.Text { + &__size { + &_36 { + font-size: $text-xxxl; + } + + &_24 { + font-size: $text-xxl; + } + + &_18 { + font-size: $text-xl; + } + + &_16 { + font-size: $text-lg; + } + + &_14 { + font-size: $text-md; + } + &_12 { + font-size: $text-sm; + } + &_11 { + font-size: $text-xs; + } + &_10 { + font-size: $text-xxs; + } + &_8 { + font-size: $text-xxxs; + } + } + + &__weight { + &_300 { + font-weight: $font-300; + } + &_400 { + font-weight: $font-400; + } + &_500 { + font-weight: $font-500; + } + &_600 { + font-weight: $font-600; + } + &_700 { + font-weight: $font-700; + } + &_800 { + font-weight: $font-700; + } + &_900 { + font-weight: $font-700; + } + } + + &__color { + &_primary { + color: $text-color; + &_100 { + color: $pico; + } + &_90 { + color: $pico-90; + } + &_80 { + color: $pico-80; + } + &_70 { + color: $pico-70; + } + &_60 { + color: $pico-60; + } + &_50 { + color: $pico-50; + } + &_40 { + color: $pico-40; + } + &_30 { + color: $pico-30; + } + &_20 { + color: $pico-20; + } + &_10 { + color: $pico-10; + } + &_5 { + color: $pico-5; + } + } + &_secondary { + color: #fff; + &_100 { + color: $pico; + } + &_80 { + color: $pico-80; + } + &_50 { + color: $pico-50; + } + &_10 { + color: $pico-10; + } + } + &_error { + color: $error-color; + &_100 { + color: $error-color; + } + &_80 { + color: $error-color-80; + } + &_50 { + color: $error-color-50; + } + &_10 { + color: $error-color-10; + } + &_5 { + color: $error-color-5; + } + } + &_warning { + color: $warning-color; + &_100 { + color: $warning-color; + } + &_80 { + color: $warning-color-80; + } + &_50 { + color: $warning-color-50; + } + &_10 { + color: $warning-color-10; + } + &_5 { + color: $warning-color-5; + } + } + &_info { + color: $primary-color; + &_100 { + color: $primary-color; + } + &_80 { + color: $primary-color-80; + } + &_50 { + color: $primary-color-50; + } + &_10 { + color: $primary-color-10; + } + &_5 { + color: $primary-color-5; + } + } + &_success { + color: $success-color; + &_100 { + color: $success-color; + } + &_80 { + color: $success-color-80; + } + &_50 { + color: $success-color-50; + } + &_25 { + color: $success-color-25; + } + &_10 { + color: $success-color-10; + } + &_5 { + color: $success-color-5; + } + } + &_inherit { + color: inherit; + } + } +} diff --git a/src/src/components/kit/Text/Text.tsx b/src/src/components/kit/Text/Text.tsx new file mode 100644 index 00000000..054b621e --- /dev/null +++ b/src/src/components/kit/Text/Text.tsx @@ -0,0 +1,81 @@ +import React from 'react'; +import classNames from 'classnames'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ITextProps } from './Text.d'; + +import './Text.scss'; + +/** + * @property {number} size - text size + * @property {string} color - text color + * @property {number} weight - text weight + * @property {string} className - component className + * @property {string} component - defines rendering html tag + * @property {number} tint - tinting text color + * @property {React.HTMLAttributes} rest - rest properties that can be set + */ + +function Text({ + size, + color, + weight, + children, + className, + component, + tint, + ...rest +}: ITextProps): React.FunctionComponentElement { + const Element = (): React.FunctionComponentElement => { + const classes: string = classNames({ + Text: true, + [`Text__size_${size || 12}`]: true, + [`Text__weight_${weight || 500}`]: true, + [`Text__color_${color || 'primary'}${tint ? `_${tint}` : ''}`]: true, + [`${className}`]: !!className, + }); + + const elementProps = { + ...rest, + className: classes, + }; + + switch (component) { + case 'h1': + return

{children}

; + case 'h2': + return

{children}

; + case 'h3': + return

{children}

; + case 'h4': + return

{children}

; + case 'h5': + return
{children}
; + case 'h6': + return
{children}
; + case 'span': + return {children}; + case 'strong': + return {children}; + case 'small': + return {children}; + case 'p': + return

{children}

; + case 'pre': + return
{children}
; + default: + return {children}; + } + }; + + return ( + + + + ); +} + +Text.displayName = 'Text'; + +export default React.memo(Text); diff --git a/src/src/components/kit/Text/index.ts b/src/src/components/kit/Text/index.ts new file mode 100644 index 00000000..e06893db --- /dev/null +++ b/src/src/components/kit/Text/index.ts @@ -0,0 +1,3 @@ +import Text from './Text'; +export * from './Text.d'; +export default Text; diff --git a/src/src/components/kit/ToggleButton/ToggleButton.d.ts b/src/src/components/kit/ToggleButton/ToggleButton.d.ts new file mode 100644 index 00000000..c4916611 --- /dev/null +++ b/src/src/components/kit/ToggleButton/ToggleButton.d.ts @@ -0,0 +1,12 @@ +import { ButtonProps } from '@material-ui/core'; + +export default interface IToggleButtonProps extends ButtonProps { + onChange: (value: string | number | any, id?: string | number | any) => void; + id?: string | undefined; + leftLabel: string; + rightLabel: string; + leftValue: number | string; + rightValue: number | string; + value: string | number; + title: string; +} diff --git a/src/src/components/kit/ToggleButton/ToggleButton.scss b/src/src/components/kit/ToggleButton/ToggleButton.scss new file mode 100644 index 00000000..2160f989 --- /dev/null +++ b/src/src/components/kit/ToggleButton/ToggleButton.scss @@ -0,0 +1,25 @@ +@use 'src/styles/abstracts' as *; + +.ToggleButton { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; +} + +.ToggleButton__title { + font-size: $text-md; +} + +.ToggleButton__container { + padding: 0.25rem; + border: $border-main; + border-radius: $border-radius-md; + display: inline-block; + & button { + border-radius: 0.25rem !important; + &:first-child { + margin-right: 0.25rem; + } + } +} diff --git a/src/src/components/kit/ToggleButton/ToggleButton.tsx b/src/src/components/kit/ToggleButton/ToggleButton.tsx new file mode 100644 index 00000000..fb0c25b4 --- /dev/null +++ b/src/src/components/kit/ToggleButton/ToggleButton.tsx @@ -0,0 +1,65 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { Button } from '../index'; + +import IToggleButtonProps from './ToggleButton.d'; + +import './ToggleButton.scss'; + +function ToggleButton({ + leftLabel, + rightLabel, + title, + leftValue, + rightValue, + onChange, + value, + id, + className, +}: IToggleButtonProps): React.FunctionComponentElement { + function handleToggle(e: any): void { + const { id, value } = e.currentTarget; + onChange(value, id); + } + + return ( + +
+ +
+ {title} +
+
+ +
+ + +
+
+
+ ); +} + +export default ToggleButton; diff --git a/src/src/components/kit/ToggleButton/index.ts b/src/src/components/kit/ToggleButton/index.ts new file mode 100644 index 00000000..94712ae4 --- /dev/null +++ b/src/src/components/kit/ToggleButton/index.ts @@ -0,0 +1,4 @@ +import ToggleButton from './ToggleButton'; + +export * from './ToggleButton.d'; +export default ToggleButton; diff --git a/src/src/components/kit/index.ts b/src/src/components/kit/index.ts new file mode 100644 index 00000000..92177d68 --- /dev/null +++ b/src/src/components/kit/index.ts @@ -0,0 +1,40 @@ +import Text from './Text'; +import Switcher from './Switcher'; +import Button, { IButtonProps } from './Button'; +import ToggleButton from './ToggleButton'; +import Icon from './Icon'; +import Badge from './Badge'; +import Dropdown from './Dropdown'; +import JsonViewPopover from './JsonViewPopover'; +import AutoSuggestions from './AutoSuggestions'; +import Slider from './Slider'; +import Menu, { MenuItem } from './Menu'; +import Modal from './Modal'; +import ActionCard from './ActionCard'; +import InputWrapper from './Input'; +import Card from './Card'; +import SelectDropdown from './SelectDropdown'; +import Spinner from './Spinner'; + +export { + AutoSuggestions, + JsonViewPopover, + ToggleButton, + InputWrapper, + ActionCard, + Dropdown, + Switcher, + MenuItem, + Slider, + Button, + Modal, + Badge, + Text, + Icon, + Menu, + Card, + SelectDropdown, + Spinner, +}; + +export type { IButtonProps }; diff --git a/src/src/components/kit_v2/Badge/Badge.d.ts b/src/src/components/kit_v2/Badge/Badge.d.ts new file mode 100644 index 00000000..bbf551d4 --- /dev/null +++ b/src/src/components/kit_v2/Badge/Badge.d.ts @@ -0,0 +1,40 @@ +import { CSS, ColorPaletteType } from 'config/stitches/types'; + +export interface IBadgeProps { + /** + * @description Badge label + */ + label: string; + /** + * @description Badge color + * @default 'primary' + */ + color?: ColorPaletteType; + /** + * @description Badge size + * @default 'md' + */ + size?: 'xs' | 'sm' | 'md' | 'lg'; + /** + * @description Badge delete callback + * @default undefined + */ + onDelete?: (label: string) => void; + /** + * @description Badge disabled state + * @default false + * @type boolean + */ + disabled?: boolean; + /** + * @description Whether Badge is monospaced + * @default false + * @type boolean + */ + monospace?: boolean; + /** + * @description Badge stitches css prop object + * @example { backgroundColor: 'red' } + */ + css?: CSS; +} diff --git a/src/src/components/kit_v2/Badge/Badge.style.ts b/src/src/components/kit_v2/Badge/Badge.style.ts new file mode 100644 index 00000000..71eec851 --- /dev/null +++ b/src/src/components/kit_v2/Badge/Badge.style.ts @@ -0,0 +1,106 @@ +import Icon from 'components/kit_v2/Icon'; + +import { styled } from 'config/stitches'; +import { CSS } from 'config/stitches/types'; + +function getColors({ + color, + disabled, +}: { + color: string | undefined; + disabled: boolean; +}): CSS { + if (color) { + return { + bc: `$${color}${disabled ? 50 : 70}`, + '&:hover': { + bc: `$${color}80`, + }, + }; + } + return { + bc: 'white', + bs: '0 0 0 1px $colors$secondary50', + color: disabled ? '$textPrimary50' : '$textPrimary', + '&:hover': { + bc: '$colors$secondary10', + }, + }; +} + +const BadgeContainer = styled('div', { + width: 'fit-content', + display: 'inline-flex', + ai: 'center', + br: '$3', + color: '$textPrimary', + fontWeight: '$2', + lineHeight: '1', + transition: 'all 0.2s ease-out', + variants: { + font: { + mono: { + fontMono: 14, + }, + default: { + fontSize: '$3', + }, + }, + rightIcon: { true: {} }, + size: { + xs: { + height: '$1', + p: '0 $4', + }, + sm: { + height: '$2', + p: '0 $4', + }, + md: { + height: '$3', + p: '0 $6', + }, + lg: { + height: '$5', + p: '0 $6', + }, + }, + disabled: { + true: { + userSelect: 'none', + cursor: 'not-allowed', + pointerEvents: 'none', + color: '$textPrimary50', + }, + }, + }, + compoundVariants: [ + { + rightIcon: true, + css: { + pr: '0', + }, + }, + ], +}); + +const RightIcon: any = styled(Icon, { + display: 'flex', + ai: 'center', + jc: 'center', + size: '$1', + ml: '$2', + fontFamily: '$mono', + cursor: 'pointer', + userSelect: 'none', + variants: { + inputSize: { + xs: { mr: '$2' }, + sm: { mr: '$2' }, + md: { mr: '$4' }, + lg: { mr: '$4' }, + }, + }, +}); + +export { BadgeContainer, RightIcon, getColors }; diff --git a/src/src/components/kit_v2/Badge/Badge.tsx b/src/src/components/kit_v2/Badge/Badge.tsx new file mode 100644 index 00000000..41fdfe11 --- /dev/null +++ b/src/src/components/kit_v2/Badge/Badge.tsx @@ -0,0 +1,66 @@ +import React from 'react'; + +import { IconX } from '@tabler/icons-react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IBadgeProps } from './Badge.d'; +import { BadgeContainer, getColors, RightIcon } from './Badge.style'; + +/** + * Badge component params + * @param {string} label - Label of the badge + * @param {string} size - Size of the badge + * @param {ColorPaletteType} color - Color of the badge + * @param {boolean} disabled - Disabled state of the badge + * @param {boolean} monospace - Monospace font of the badge + * @param {function} onDelete - Callback function for delete action + */ + +const Badge = React.forwardRef< + React.ElementRef, + IBadgeProps +>( + ( + { + label, + size = 'md', + color, + css, + monospace = false, + disabled = false, + onDelete, + ...rest + }: IBadgeProps, + forwardedRef, + ): React.FunctionComponentElement => { + return ( + + + {label} + {onDelete ? ( + } + inputSize={size} + size='md' + onClick={() => onDelete(label)} + /> + ) : null} + + + ); + }, +); + +Badge.displayName = 'Badge'; +export default Badge; diff --git a/src/src/components/kit_v2/Badge/index.ts b/src/src/components/kit_v2/Badge/index.ts new file mode 100644 index 00000000..863f0815 --- /dev/null +++ b/src/src/components/kit_v2/Badge/index.ts @@ -0,0 +1,4 @@ +import Badge from './Badge'; + +export * from './Badge'; +export default Badge; diff --git a/src/src/components/kit_v2/Box/Box.d.ts b/src/src/components/kit_v2/Box/Box.d.ts new file mode 100644 index 00000000..2265a64d --- /dev/null +++ b/src/src/components/kit_v2/Box/Box.d.ts @@ -0,0 +1,166 @@ +import React from 'react'; + +import { CSS } from 'config/stitches/types'; + +// Polymorphic Box component props +export interface IBoxProps + extends Partial>, + IBoxCssProps { + /** + * @optional + * @default 'div' + * @description HTML element to render + */ + as?: React.ElementType; + /** + * @optional + * @default {} + * @description CSS styles + * @example + * + */ + css?: CSS; + /** + * @description flex prop + * @optional + * @default false + */ +} + +interface IBoxCssProps { + /** + * @description display prop + * @optional + * @example + * + * @default 'block' + */ + display?: CSS['display']; + /** + * @description flex prop + * @optional + * @example + * + */ + flex?: CSS['flex']; + /** + * @description flex direction prop + * @optional + */ + fd?: CSS['flexDirection']; + /** + * @description flex wrap prop + * @optional + */ + fw?: CSS['flexWrap']; + /** + * @description flex align items prop + * @optional + * @default 'stretch' + */ + ai?: CSS['alignItems']; + /** + * @description flex justify content prop + * @optional + * @default 'flex-start' + * @example + * + */ + jc?: CSS['justifyContent']; + /** + * @description margin prop + * @optional + */ + m?: CSS['margin']; + /** + * @description margin top prop + * @optional + * @example + * + */ + mt?: CSS['marginTop']; + /** + * @description margin right prop + * @optional + * @example + * + */ + mr?: CSS['marginRight']; + /** + * @description margin bottom prop + * @optional + * @example + * + */ + mb?: CSS['marginBottom']; + /** + * @description margin left prop + * @optional + * @example + * + */ + ml?: CSS['marginLeft']; + /** + * @description padding prop + * @optional + * @example + * + */ + p?: CSS['padding']; + /** + * @description padding top prop + * @optional + * @example + * + */ + pt?: CSS['paddingTop']; + /** + * @description padding right prop + * @optional + * @example + * + */ + pr?: CSS['paddingRight']; + /** + * @description padding bottom prop + * @optional + * @example + * + */ + pb?: CSS['paddingBottom']; + /** + * @description padding left prop + * @optional + * @example + * + */ + pl?: CSS['paddingLeft']; + /** + * @description width prop + * @optional + * @example + * + */ + width?: CSS['width']; + /** + * @description height prop + * @optional + * @example + * + */ + height?: CSS['height']; + /** + * @description min background color prop + * @optional + * @example + * + */ + bg?: CSS['backgroundColor']; + /** + * color prop + * @optional + * @example + * + */ + color?: CSS['color']; +} diff --git a/src/src/components/kit_v2/Box/Box.tsx b/src/src/components/kit_v2/Box/Box.tsx new file mode 100644 index 00000000..f90b739e --- /dev/null +++ b/src/src/components/kit_v2/Box/Box.tsx @@ -0,0 +1,84 @@ +import React from 'react'; + +import { Slot } from '@radix-ui/react-slot'; + +import { styled } from 'config/stitches'; + +import { IBoxProps } from './Box.d'; + +const StyledBox = styled(Slot, {}); + +/** + * Polymorphic Box component + * @param {IBoxProps} props + * @param {keyof React.ElementType} as - HTML element or React component + * @param {object} css - css object + * @param {React.ReactNode} children - React children + * @param {Partial>} rest - HTML attributes + * @returns {React.FunctionComponentElement} + * @see https://www.radix-ui.com/docs/primitives/utilities/slot + * @see https://stitches.dev/docs/overriding-styles#the-css-prop + */ + +const Box = React.forwardRef( + ( + { as = 'div', css, children, ...props }: IBoxProps, + forwardedRef, + ): React.FunctionComponentElement => { + const Component = as; + const { layoutProps, restProps } = React.useMemo(() => { + const layoutKeys = [ + 'display', + 'flex', + 'fd', + 'fw', + 'ai', + 'jc', + 'm', + 'mt', + 'mr', + 'mb', + 'ml', + 'p', + 'pt', + 'pr', + 'pb', + 'pl', + 'width', + 'height', + 'bg', + 'color', + ]; + const layoutProps = Object.entries(props) + .filter(([key]) => layoutKeys.includes(key)) + .reduce((obj, [key, value]) => { + obj[key] = value; + return obj; + }, {} as { [key: string]: any }); + + const restProps = Object.entries(props) + .filter(([key]) => !layoutKeys.includes(key)) + .reduce((obj, [key, value]) => { + obj[key] = value; + return obj; + }, {} as { [key: string]: any }); + return { layoutProps, restProps }; + }, [props]); + + return ( + } + > + {children} + + ); + }, +); + +Box.displayName = 'Box'; +export default React.memo(Box); diff --git a/src/src/components/kit_v2/Box/index.ts b/src/src/components/kit_v2/Box/index.ts new file mode 100644 index 00000000..158681ca --- /dev/null +++ b/src/src/components/kit_v2/Box/index.ts @@ -0,0 +1,4 @@ +import Box from './Box'; + +export * from './Box.d'; +export default Box; diff --git a/src/src/components/kit_v2/Button/Button.d.ts b/src/src/components/kit_v2/Button/Button.d.ts new file mode 100644 index 00000000..9e00aa64 --- /dev/null +++ b/src/src/components/kit_v2/Button/Button.d.ts @@ -0,0 +1,63 @@ +import React from 'react'; + +import { CSS, ColorPaletteType } from 'config/stitches/types'; + +// Button component props +export interface IButtonProps + extends Partial> { + /** + * @description The color of the button + * @example 'primary' + */ + color?: ColorPaletteType; + /** + * @description The size of the button + * @example 'md' + * @default 'md' + */ + size?: ButtonSizeType; + /** + * @description The variant of the button + * @example 'contained' + * @default 'contained' + */ + variant?: ButtonVariantType; + /** + * @description The disabled state of the button + * @example false + * @default false + */ + disabled?: boolean; + /** + * @description The start icon of the button + * @example + */ + leftIcon?: React.ReactNode; + /** + * @description The end icon of the button + * @example + */ + rightIcon?: React.ReactNode; + /** + * @description The full width state of the button + * @example false + */ + fullWidth?: boolean; + /** + * @description The spacing variant of the button + * @example 'default' + * @default 'default' + */ + horizontalSpacing?: 'default' | 'compact'; + /** + * @description The css prop of the button + * @example { backgroundColor: 'red' } + */ + css?: CSS; +} + +// Button component size types +export type ButtonSizeType = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; + +// Button component variants +type ButtonVariantType = 'ghost' | 'outlined' | 'contained' | 'static'; diff --git a/src/src/components/kit_v2/Button/Button.style.ts b/src/src/components/kit_v2/Button/Button.style.ts new file mode 100644 index 00000000..1741df92 --- /dev/null +++ b/src/src/components/kit_v2/Button/Button.style.ts @@ -0,0 +1,74 @@ +import Icon from 'components/kit_v2/Icon'; + +import { styled } from 'config/stitches'; + +const Container: any = styled('button', { + all: 'unset', + display: 'inline-flex', + width: 'fit-content', + ai: 'center', + jc: 'center', + lineHeight: 1, + fontWeight: '$2', + cursor: 'pointer', + br: '$3', + transition: 'all 0.2s ease-in-out', + fontSize: '$3', + variants: { + size: { + xs: { + height: '$sizes$1', + fontSize: '$fontSizes$2', + p: '0 $space$7', + }, + sm: { + height: '$sizes$2', + fontSize: '$fontSizes$2', + p: '0 $space$7', + }, + md: { + height: '$sizes$3', + p: '0 $space$8', + }, + lg: { + height: '$sizes$5', + p: '0 $space$9', + }, + xl: { + height: '$sizes$7', + p: '0 $space$11', + }, + }, + disabled: { + true: { + userSelect: 'none', + cursor: 'not-allowed', + pointerEvents: 'none', + }, + }, + fullWidth: { + true: { + width: '100%', + }, + }, + }, +}); + +const IconContainer = styled(Icon, { + size: '$sizes$1', + display: 'flex', + jc: 'center', + ai: 'center', + lineHeight: '1', + fontSize: '$2', +}); + +const LeftIcon: any = styled(IconContainer, { + mr: '$2', +}); + +const RightIcon: any = styled(IconContainer, { + ml: '$2', +}); + +export { Container, LeftIcon, RightIcon }; diff --git a/src/src/components/kit_v2/Button/Button.test.tsx b/src/src/components/kit_v2/Button/Button.test.tsx new file mode 100644 index 00000000..88216c4c --- /dev/null +++ b/src/src/components/kit_v2/Button/Button.test.tsx @@ -0,0 +1,24 @@ +import { render } from '@testing-library/react'; + +import Button from './Button'; + +// Test of Button component +describe('', () => { + test('Renders Correctly', () => { + const { asFragment } = render(); + expect(asFragment()).toMatchSnapshot(); + }); + + // test onClick event + test('onClick event works properly', () => { + const onClick = jest.fn(); + const { getByTestId } = render( + , + ); + const button = getByTestId('button'); + button.click(); + expect(onClick).toHaveBeenCalled(); + }); +}); diff --git a/src/src/components/kit_v2/Button/Button.tsx b/src/src/components/kit_v2/Button/Button.tsx new file mode 100644 index 00000000..b95bf78d --- /dev/null +++ b/src/src/components/kit_v2/Button/Button.tsx @@ -0,0 +1,76 @@ +import React from 'react'; + +import { getButtonStyles } from '../utils/getButtonStyles'; + +import { IButtonProps } from './Button.d'; +import { ButtonSpacingMap, getIconSpacing } from './buttonConfig'; +import { Container, LeftIcon, RightIcon } from './Button.style'; + +/** + * @property {IButtonProps['color']} color - color of the button + * @property {IButtonProps['size']} size - size of the button + * @property {IButtonProps['variant']} variant - variant of the button + * @property {IButtonProps['fullWidth']} fullWidth - whether the button should take the full width of its container + * @property {IButtonProps['disabled']} disabled - whether the button should be disabled + * @property {IButtonProps['leftIcon']} leftIcon - icon to be displayed on the left side of the button + * @property {IButtonProps['rightIcon']} rightIcon - icon to be displayed on the right side of the button + * @property {IButtonProps['children']} children - children to be displayed inside the button + */ + +const Button = React.forwardRef< + React.ElementRef, + IButtonProps +>( + ( + { + color = 'primary', + size = 'md', + variant = 'contained', + fullWidth = false, + horizontalSpacing = 'default', + disabled, + leftIcon, + rightIcon, + css, + children, + ...rest + }: IButtonProps, + forwardedRef, + ) => { + return ( + + {leftIcon ? ( + + ) : null} + {children} + {rightIcon ? ( + + ) : null} + + ); + }, +); + +Button.displayName = 'Button'; +export default React.memo(Button); diff --git a/src/src/components/kit_v2/Button/buttonConfig.ts b/src/src/components/kit_v2/Button/buttonConfig.ts new file mode 100644 index 00000000..6ae49150 --- /dev/null +++ b/src/src/components/kit_v2/Button/buttonConfig.ts @@ -0,0 +1,23 @@ +import { ButtonSizeType, IButtonProps } from './Button.d'; + +export const ButtonSpacingMap = { + compact: { xs: '0 $4', sm: '0 $4', md: '0 $5', lg: '0 $6', xl: '0 $7' }, + default: { xs: '0 $7', sm: '0 $7', md: '0 $8', lg: '0 $9', xl: '0 $11' }, +}; + +export const getIconSpacing = ( + spacing: IButtonProps['horizontalSpacing'], + size: ButtonSizeType, +) => { + if (spacing === 'compact') { + return 'calc($3 * -1)'; + } + let spaces: Record = { + xs: 'calc($3 * -1)', + sm: 'calc($3 * -1)', + md: 'calc($4 * -1)', + lg: 'calc($5 * -1)', + xl: 'calc($7 * -1)', + }; + return spaces[size]; +}; diff --git a/src/src/components/kit_v2/Button/index.ts b/src/src/components/kit_v2/Button/index.ts new file mode 100644 index 00000000..b2c94caf --- /dev/null +++ b/src/src/components/kit_v2/Button/index.ts @@ -0,0 +1,4 @@ +import Button from './Button'; + +export * from './Button.d'; +export default Button; diff --git a/src/src/components/kit_v2/ButtonGroup/ButtonGroup.d.ts b/src/src/components/kit_v2/ButtonGroup/ButtonGroup.d.ts new file mode 100644 index 00000000..7e82b3fc --- /dev/null +++ b/src/src/components/kit_v2/ButtonGroup/ButtonGroup.d.ts @@ -0,0 +1,3 @@ +import { IButtonProps } from '../Button'; + +export interface IButtonGroupProps extends IButtonProps {} diff --git a/src/src/components/kit_v2/ButtonGroup/ButtonGroup.style.ts b/src/src/components/kit_v2/ButtonGroup/ButtonGroup.style.ts new file mode 100644 index 00000000..e1db4dda --- /dev/null +++ b/src/src/components/kit_v2/ButtonGroup/ButtonGroup.style.ts @@ -0,0 +1,44 @@ +import { styled } from 'config/stitches'; + +const Container: any = styled('div', { + all: 'unset', + display: 'inline-flex', + width: 'fit-content', + ai: 'center', + jc: 'center', + fontWeight: '$2', + overflow: 'hidden', + '& > button': { + br: '0', + bs: 'none', + '&:not(:first-of-type)': { + borderLeft: '1px solid', + }, + '&:first-of-type': { + borderTopLeftRadius: '$3', + borderBottomLeftRadius: '$3', + }, + '&:last-of-type': { + borderTopRightRadius: '$3', + borderBottomRightRadius: '$3', + }, + }, + variants: { + variant: { + outlined: { + '& > button': { + bs: 'inset 0 0 0 1px', + '&:not(:first-of-type)': { + borderLeft: 'none', + ml: '-1px', + }, + '&:hover': { + zIndex: 1, + }, + }, + }, + }, + }, +}); + +export { Container }; diff --git a/src/src/components/kit_v2/ButtonGroup/ButtonGroup.tsx b/src/src/components/kit_v2/ButtonGroup/ButtonGroup.tsx new file mode 100644 index 00000000..0d8b72d1 --- /dev/null +++ b/src/src/components/kit_v2/ButtonGroup/ButtonGroup.tsx @@ -0,0 +1,39 @@ +import React from 'react'; + +import { IButtonGroupProps } from './ButtonGroup.d'; +import { Container } from './ButtonGroup.style'; + +/** + * @description ButtonGroup component is a wrapper for Button component to group them together + * ButtonGroup component params + * @param {string} color - Color of the button group + * @param {React.ReactNode} children - React children + * @param {Partial>} rest - HTML attributes + */ +const ButtonGroup = React.forwardRef< + React.ElementRef, + IButtonGroupProps +>(({ color, children, ...rest }: IButtonGroupProps, forwardedRef) => { + const childrenWIthProps = React.Children.map(children, (child) => { + return React.cloneElement(child as React.FunctionComponentElement, { + color, + ...rest, + }); + }); + + return ( + + {childrenWIthProps} + + ); +}); + +ButtonGroup.displayName = 'ButtonGroup'; +export default React.memo(ButtonGroup); diff --git a/src/src/components/kit_v2/ButtonGroup/index.ts b/src/src/components/kit_v2/ButtonGroup/index.ts new file mode 100644 index 00000000..547c97d8 --- /dev/null +++ b/src/src/components/kit_v2/ButtonGroup/index.ts @@ -0,0 +1,4 @@ +import ButtonGroup from './ButtonGroup'; + +export * from './ButtonGroup.d'; +export default ButtonGroup; diff --git a/src/src/components/kit_v2/Checkbox/Checkbox.d.ts b/src/src/components/kit_v2/Checkbox/Checkbox.d.ts new file mode 100644 index 00000000..8cc58eef --- /dev/null +++ b/src/src/components/kit_v2/Checkbox/Checkbox.d.ts @@ -0,0 +1,39 @@ +import { CheckboxProps } from '@radix-ui/react-checkbox'; + +/** + * The Checkbox component is a form component that allows users to select one or more options from a list. + * @description The interface for the Checkbox component. + */ +export interface ICheckboxProps extends CheckboxProps { + /** + * The checked state of the checkbox. + * @description The checked state of the checkbox. + * @default false + */ + checked?: CheckboxProps['checked']; + /** + * The default checked state of the checkbox. + * @description The default checked state of the checkbox. + * @default false + */ + defaultChecked?: boolean; + /** + * The required state of the checkbox. + * @description The required state of the checkbox. + * @default false + */ + required?: boolean; + /** + * The callback function that is fired when the checked state of the checkbox is changed. + * @description The callback function that is fired when the checked state of the checkbox is changed. + * @param checked The checked state of the checkbox. + * @default () => {} + */ + onCheckedChange?: (checked: CheckboxProps['checked']) => void; + /** + * @description disabled state + * @default false + * @type boolean + */ + disabled?: boolean; +} diff --git a/src/src/components/kit_v2/Checkbox/Checkbox.style.ts b/src/src/components/kit_v2/Checkbox/Checkbox.style.ts new file mode 100644 index 00000000..03b1fa18 --- /dev/null +++ b/src/src/components/kit_v2/Checkbox/Checkbox.style.ts @@ -0,0 +1,95 @@ +import * as CheckboxPrimitive from '@radix-ui/react-checkbox'; + +import { styled } from 'config/stitches'; + +const IndeterminateIcon = styled('span', { + width: '6px', + height: '6px', + bc: '$primary100', + br: '$1', + transition: 'all 0.2s ease-out', +}); + +const StyledIndicator = styled(CheckboxPrimitive.Indicator, { + display: 'flex', + jc: 'center', + ai: 'center', + height: '100%', + width: '100%', + color: 'white', + transition: 'all 0.2s ease-out', +}); + +const IndicatorWrapper = styled('span', { + width: '10px', + height: '10px', + display: 'flex', + ai: 'center', + jc: 'center', + bs: 'inset 0 0 0 1px $colors$secondary100', + br: '$2', + transition: 'all 0.2s ease-out', +}); + +const StyledCheckbox = styled(CheckboxPrimitive.Root, { + size: '20px', + border: 'unset', + bc: 'transparent', + borderRadius: '$2', + display: 'flex', + ai: 'center', + jc: 'center', + lineHeight: 1, + cursor: 'pointer', + transition: 'all 0.2s ease-out', + '&:hover': { + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$primary100', + }, + }, + '&:disabled': { + pointerEvents: 'none', + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$secondary50 !important', + }, + }, + '&[data-state=checked]': { + '&:hover': { + [`& ${IndicatorWrapper}`]: { + bc: '$primary110', + }, + }, + '&:disabled': { + [`& ${IndicatorWrapper}`]: { + bc: '$secondary50', + }, + }, + [`& ${IndicatorWrapper}`]: { + bc: '$primary100', + bs: 'inset 0 0 0 1px transparent', + '&:disabled': { + bc: '$secondary50 !important', + }, + }, + }, + '&[data-state=indeterminate]': { + '&:hover': { + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$primary110', + }, + [`& ${IndeterminateIcon}`]: { + bc: '$primary110', + }, + }, + '&:disabled': { + [`& ${IndeterminateIcon}`]: { + bc: '$secondary50', + }, + }, + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$primary100', + }, + }, +}); + +export { StyledCheckbox, StyledIndicator, IndicatorWrapper, IndeterminateIcon }; diff --git a/src/src/components/kit_v2/Checkbox/Checkbox.tsx b/src/src/components/kit_v2/Checkbox/Checkbox.tsx new file mode 100644 index 00000000..4e423d35 --- /dev/null +++ b/src/src/components/kit_v2/Checkbox/Checkbox.tsx @@ -0,0 +1,79 @@ +import React from 'react'; + +import Icon from 'components/kit/Icon'; + +import { ICheckboxProps } from './Checkbox.d'; +import { + IndeterminateIcon, + IndicatorWrapper, + StyledCheckbox, + StyledIndicator, +} from './Checkbox.style'; + +/** + * @description Checkbox component + * Checkbox component params + * @param {boolean} checked - Checked state of the checkbox + * @param {boolean} defaultChecked - Default checked state of the checkbox + * @param {boolean} disabled - Disabled state of the checkbox + * @returns {React.FunctionComponentElement} + * @constructor + * @example + * + */ +export const CheckBox = React.forwardRef< + React.ElementRef, + ICheckboxProps +>( + ( + { checked, defaultChecked, disabled, ...props }: ICheckboxProps, + forwardedRef, + ): React.FunctionComponentElement => { + const [isChecked, setIsChecked] = React.useState( + checked || defaultChecked, + ); + + // control checkbox state from outside + React.useEffect(() => { + if (checked !== isChecked) { + setIsChecked(checked); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [checked]); + + // control checkbox state from inside + const handleChange = React.useCallback( + (val: ICheckboxProps['checked']) => { + if (!disabled) { + const value: ICheckboxProps['checked'] = + isChecked === 'indeterminate' ? false : val; + setIsChecked(value); + if (props.onCheckedChange) { + props.onCheckedChange(value); + } + } + }, + [isChecked, props, disabled], + ); + + return ( + + + + {isChecked === 'indeterminate' ? : null} + {isChecked === true ? : null} + + + + ); + }, +); + +CheckBox.displayName = 'CheckBox'; +export default React.memo(CheckBox); diff --git a/src/src/components/kit_v2/Checkbox/index.ts b/src/src/components/kit_v2/Checkbox/index.ts new file mode 100644 index 00000000..c497e396 --- /dev/null +++ b/src/src/components/kit_v2/Checkbox/index.ts @@ -0,0 +1,4 @@ +import Checkbox from './Checkbox'; + +export * from './Checkbox.d'; +export default Checkbox; diff --git a/src/src/components/kit_v2/ControlsButton/ControlsButton.d.ts b/src/src/components/kit_v2/ControlsButton/ControlsButton.d.ts new file mode 100644 index 00000000..81ef611f --- /dev/null +++ b/src/src/components/kit_v2/ControlsButton/ControlsButton.d.ts @@ -0,0 +1,45 @@ +export interface IControlsButtonProps { + /** + * @description Popover open state + * @example false + */ + open: boolean; + /** + * @description Popover has applied values + * @example false + * @default false + */ + hasAppliedValues?: boolean; + /** + * @description Control popover triggers applied values count + * @example 2 + * @default 0 + */ + appliedValuesCount?: number; + /** + * @description Control popover trigger right icon props + * @example { icon: , onClick: () => {} } + */ + rightIcon?: { + icon: React.ReactNode; + onClick: () => void; + }; + /** + * @description Control popover trigger left icon + * @example + */ + leftIcon?: React.ReactNode; + /** + * @description Control popover trigger children + */ + children: React.ReactNode; + /** + * @description Control popover trigger sizes + * @example 'md' + */ + size?: 'md' | 'lg' | 'xl'; + /** + * @description The disabled state of the button + */ + disabled?: boolean; +} diff --git a/src/src/components/kit_v2/ControlsButton/ControlsButton.style.ts b/src/src/components/kit_v2/ControlsButton/ControlsButton.style.ts new file mode 100644 index 00000000..f13e758d --- /dev/null +++ b/src/src/components/kit_v2/ControlsButton/ControlsButton.style.ts @@ -0,0 +1,178 @@ +import Icon from 'components/kit_v2/Icon'; + +import { styled } from 'config/stitches'; + +const Trigger = styled('button', { + all: 'unset', + display: 'inline-flex', + width: 'fit-content', + ai: 'center', + jc: 'center', + lineHeight: 1, + fontWeight: '$2', + cursor: 'pointer', + borderRadius: '$3', + transition: 'all 0.2s ease-out', + fontSize: '$3', + color: ' #5A667A', + '&:hover': { + bc: '#E2E6ED', + }, + variants: { + applied: { + true: { + bc: '$secondary10', + }, + }, + focused: { + true: { + bs: '0px 0px 0px 1px $colors$secondary100', + bc: '#E2E6ED', + }, + }, + rightIcon: { true: {} }, + leftIcon: { true: {} }, + size: { + md: { + height: '$3', + pl: '$5', + pr: '$4', + }, + lg: { + height: '$5', + pl: '$6', + pr: '$5', + }, + xl: { + height: '$7', + pl: '$7', + pr: '$6', + }, + }, + disabled: { + true: { + userSelect: 'none', + cursor: 'not-allowed', + pointerEvents: 'none', + color: '$secondary50', + }, + }, + }, + compoundVariants: [ + { + rightIcon: true, + size: 'md', + css: { + pr: '$3', + }, + }, + { + rightIcon: true, + size: 'lg', + css: { + pr: '$4', + }, + }, + { + rightIcon: true, + size: 'xl', + css: { + pr: '$6', + }, + }, + { + leftIcon: true, + size: 'md', + css: { + pl: '$2', + }, + }, + { + leftIcon: true, + size: 'lg', + css: { + pl: '$3', + }, + }, + { + leftIcon: true, + size: 'xl', + css: { + pl: '$5', + }, + }, + ], +}); + +const ArrowIcon: any = styled('span', { + width: '10px', + display: 'flex', + ai: 'center', + jc: 'center', + ml: '$2', + variants: { + rightIcon: { true: {} }, + size: { + md: {}, + lg: { + ml: '$3', + }, + xl: { + ml: '$5', + }, + }, + }, + compoundVariants: [ + { + size: 'md', + rightIcon: true, + css: { + mr: '$2', + }, + }, + { + size: 'lg', + rightIcon: true, + css: { + mr: '$3', + }, + }, + { + size: 'xl', + rightIcon: true, + css: { + mr: '$5', + }, + }, + ], +}); + +const AppliedCount = styled('span', { + width: '16px', + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + overflow: 'hidden', + height: '14px', + lineHeight: 1.4, + bc: '$secondary30', + display: 'inline-block', + textAlign: 'center', + br: '100px', + fontSize: '10px', + fontWeight: '$3', + ml: '$3', +}); + +const LeftIcon: any = styled(Icon, { + size: '$1', + display: 'flex', + ai: 'center', + jc: 'center', + mr: '$2', +}); + +const RightIcon = styled(Icon, { + width: '$1', +}); + +export { Trigger, ArrowIcon, AppliedCount, LeftIcon, RightIcon }; diff --git a/src/src/components/kit_v2/ControlsButton/ControlsButton.tsx b/src/src/components/kit_v2/ControlsButton/ControlsButton.tsx new file mode 100644 index 00000000..bafb73e3 --- /dev/null +++ b/src/src/components/kit_v2/ControlsButton/ControlsButton.tsx @@ -0,0 +1,83 @@ +import React from 'react'; + +import { IconCaretDown, IconCaretUp } from '@tabler/icons-react'; + +import { IControlsButtonProps } from './ControlsButton.d'; +import { + AppliedCount, + ArrowIcon, + LeftIcon, + RightIcon, + Trigger, +} from './ControlsButton.style'; + +/** + * @description ControlsButton component + * ControlsButton component params + * @param {string} children - Label of the button + * @param {boolean} open - Open state of the button + * @param {string} rightIcon - Right icon of the button + * @param {string} size - Size of the button + * @param {boolean} hasAppliedValues - Applied values state of the button + * @param {number} appliedValuesCount - Applied values count of the button + * @param {string} leftIcon - Left icon of the button + * @param {boolean} disabled - Disabled state of the button + * @returns {React.FunctionComponentElement} - React component + */ +const ControlsButton = React.forwardRef< + React.ElementRef, + IControlsButtonProps +>( + ( + { + children, + open, + rightIcon, + size = 'md', + hasAppliedValues = false, + appliedValuesCount, + leftIcon, + disabled, + ...props + }: IControlsButtonProps, + forwardedRef, + ) => { + return ( + + {leftIcon ? : null} + {children} + {appliedValuesCount ? ( + {appliedValuesCount} + ) : null} + { + + {open ? : } + + } + {rightIcon?.icon ? ( + { + e.preventDefault(); + rightIcon?.onClick(); + }} + icon={rightIcon?.icon} + color='secondary' + /> + ) : null} + + ); + }, +); + +ControlsButton.displayName = 'ControlsButton'; +export default React.memo(ControlsButton); diff --git a/src/src/components/kit_v2/ControlsButton/index.ts b/src/src/components/kit_v2/ControlsButton/index.ts new file mode 100644 index 00000000..0d2f98f6 --- /dev/null +++ b/src/src/components/kit_v2/ControlsButton/index.ts @@ -0,0 +1,4 @@ +import ControlsButton from './ControlsButton'; + +export * from './ControlsButton'; +export default ControlsButton; diff --git a/src/src/components/kit_v2/Dialog/Dialog.d.ts b/src/src/components/kit_v2/Dialog/Dialog.d.ts new file mode 100644 index 00000000..28d6cda0 --- /dev/null +++ b/src/src/components/kit_v2/Dialog/Dialog.d.ts @@ -0,0 +1,50 @@ +import { DialogProps } from '@radix-ui/react-dialog'; +export interface IDialogProps extends DialogProps { + /** + * Dialog title + * @default '' + * @optional + * @type string + */ + title?: string; + /** + * Dialog description + * @default '' + * @optional + * @type string + */ + description?: string; + /** + * dialog confirm callback + * @default () => {} + * @optional + * @type function + */ + onConfirm?: () => void; + /** + * Dialog trigger element + * @default null + * @optional + * @type React.ReactNode + * @example + * + */ + trigger?: React.ReactNode; + /** + * Dialog title icon + * @default null + * @optional + * @type React.ReactNode + * @example + */ + titleIcon?: React.ReactNode; + /** + * Dialog children element (content) to be rendered inside the dialog body (below the title and description) and above the footer buttons + * @default null + * @optional + * @type React.ReactNode + * @example + *
Dialog content
+ */ + children?: React.ReactNode; +} diff --git a/src/src/components/kit_v2/Dialog/Dialog.style.ts b/src/src/components/kit_v2/Dialog/Dialog.style.ts new file mode 100644 index 00000000..738c2d8a --- /dev/null +++ b/src/src/components/kit_v2/Dialog/Dialog.style.ts @@ -0,0 +1,68 @@ +import * as DialogPrimitive from '@radix-ui/react-dialog'; + +import { keyframes, styled } from 'config/stitches'; + +import Box from '../Box'; + +const overlayShow = keyframes({ + '0%': { opacity: 0 }, + '100%': { opacity: 1 }, +}); + +const contentShow = keyframes({ + '0%': { opacity: 0, transform: 'translate(-50%, -48%) scale(.96)' }, + '100%': { opacity: 1, transform: 'translate(-50%, -50%) scale(1)' }, +}); + +const DialogOverlay = styled(DialogPrimitive.Overlay, { + bc: 'hsla(206, 22%, 7%, 0.5)', + position: 'fixed', + inset: 0, + animation: `${overlayShow} 150ms cubic-bezier(0.16, 1, 0.3, 1)`, +}); + +const DialogContent = styled(DialogPrimitive.Content, { + position: 'fixed', + top: '50%', + left: '50%', + bc: 'white', + br: '$5', + bs: '0px 2px 4px -4px rgba(54, 61, 73, 0.25)', + transform: 'translate(-50%, -50%)', + width: '90vw', + maxWidth: '450px', + maxHeight: '85vh', + p: '$5', + animation: `${contentShow} 150ms cubic-bezier(0.16, 1, 0.3, 1)`, + '&:focus': { outline: 'none' }, +}); + +const DialogTitle = styled(DialogPrimitive.Title, { + fontSize: '$4', + fontWeight: '$4', + color: '$textPrimary', + wordBreak: 'break-word', +}); + +const DialogDescription = styled(DialogPrimitive.Description, { + margin: '$7 0', + fontSize: 15, + lineHeight: 1.5, +}); + +const DialogActions = styled(Box, { + borderTop: '1px solid $colors$secondary20', + pt: '$5', + mt: '$9', + display: 'flex', + ai: 'center', + jc: 'flex-end', +}); + +export { + DialogOverlay, + DialogContent, + DialogTitle, + DialogDescription, + DialogActions, +}; diff --git a/src/src/components/kit_v2/Dialog/Dialog.test.tsx b/src/src/components/kit_v2/Dialog/Dialog.test.tsx new file mode 100644 index 00000000..0ff2cb4a --- /dev/null +++ b/src/src/components/kit_v2/Dialog/Dialog.test.tsx @@ -0,0 +1,36 @@ +import { render } from '@testing-library/react'; + +import Dialog from './Dialog'; + +// Test of Dialog component +describe('Dialog', () => { + // Test of Dialog component + it('should render Dialog component', () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + // Test of title prop + it('should render Dialog component with title', () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + // Test of description prop + it('should render Dialog component with description', () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + // Test of trigger prop + it('should render Dialog component with trigger', () => { + const { container } = render(Trigger} />); + expect(container).toMatchSnapshot(); + }); + + // Test of open prop + it('should render Dialog component with open', () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/src/src/components/kit_v2/Dialog/Dialog.tsx b/src/src/components/kit_v2/Dialog/Dialog.tsx new file mode 100644 index 00000000..e1fe837d --- /dev/null +++ b/src/src/components/kit_v2/Dialog/Dialog.tsx @@ -0,0 +1,114 @@ +import React from 'react'; + +import * as DialogPrimitive from '@radix-ui/react-dialog'; +import { IconX } from '@tabler/icons-react'; + +import Button from '../Button'; +import Box from '../Box'; +import IconButton from '../IconButton'; + +import { IDialogProps } from './Dialog.d'; +import { + DialogActions, + DialogContent, + DialogDescription, + DialogOverlay, + DialogTitle, +} from './Dialog.style'; + +/** + * @description Dialog component is for displaying a dialog with a title, description, and actions + * Dialog component params + * @param {React.ReactNode} trigger - React children + * @param {string} title - Title of the dialog + * @param {string} description - Description of the dialog + * @param {React.ReactNode} children - React children + * @param {boolean} open - Open state of the dialog + * @param {React.ReactNode} onConfirm - On confirm callback of the dialog + * @param {React.ReactNode} onOpenChange - On open change callback of the dialog + * @returns {React.FunctionComponentElement} + * @constructor + * @example + * console.log('confirm')} + * trigger={} + * /> + */ +function Dialog({ + trigger, + title, + description, + open = false, + titleIcon, + children, + onConfirm, + onOpenChange, + ...props +}: IDialogProps): React.FunctionComponentElement { + return ( + + {trigger ? ( + {trigger} + ) : null} + + + + + {title ? ( + + {titleIcon ? ( + + {titleIcon} + + ) : null} + {title} + + ) : null} + {description ? ( + {description} + ) : null} + {children} + + + + + + + + + + + } + /> + + + + + ); +} + +Dialog.displayName = 'Dialog'; +export default React.memo(Dialog); diff --git a/src/src/components/kit_v2/Dialog/index.ts b/src/src/components/kit_v2/Dialog/index.ts new file mode 100644 index 00000000..40eb89e1 --- /dev/null +++ b/src/src/components/kit_v2/Dialog/index.ts @@ -0,0 +1,4 @@ +import Dialog from './Dialog'; + +export * from './Dialog.d'; +export default Dialog; diff --git a/src/src/components/kit_v2/Icon/Icon.d.ts b/src/src/components/kit_v2/Icon/Icon.d.ts new file mode 100644 index 00000000..5f2d3b98 --- /dev/null +++ b/src/src/components/kit_v2/Icon/Icon.d.ts @@ -0,0 +1,49 @@ +import * as React from 'react'; + +import { CSS } from 'config/stitches/types'; + +// The interface for the Icon component +export interface IIconProps + extends Partial> { + /** + * @description The css property is used to extend the styles of the component. + * @example + * ```tsx + * + * ``` + * @see https://stitches.dev/docs/api#css + * @default undefined + */ + css?: CSS; + /** + * @description The size of the Icon. + * @example + * ```tsx + * + * ``` + * @default lg + */ + size?: 'sm' | 'md' | 'lg'; + /** + * @description The icon node. + * @example + * ```tsx + * } /> + * ``` + * ```tsx + * + * ``` + * @default undefined + * @see https://tablericons.com/ + */ + icon: React.ReactNode; + /** + * @description The color of the Icon. + * @example + * ```tsx + * + * ``` + * @default undefined + */ + color?: CSS['color']; +} diff --git a/src/src/components/kit_v2/Icon/Icon.style.ts b/src/src/components/kit_v2/Icon/Icon.style.ts new file mode 100644 index 00000000..28f05ed1 --- /dev/null +++ b/src/src/components/kit_v2/Icon/Icon.style.ts @@ -0,0 +1,36 @@ +import { Slot } from '@radix-ui/react-slot'; + +import { styled } from 'config/stitches'; + +const Container: any = styled('div', { + display: 'inline-flex', + ai: 'center', + jc: 'center', + size: '$1', +}); + +const IconWrapper = styled('i', { + display: 'inline-flex', + ai: 'center', + jc: 'center', + variants: { + size: { + sm: { + size: '12px', + }, + md: { + size: '16px', + }, + lg: { + size: '$1', + }, + }, + }, +}); + +const IconSlot = styled(Slot, { + width: '100%', + height: '100%', +}); + +export { Container, IconWrapper, IconSlot }; diff --git a/src/src/components/kit_v2/Icon/Icon.test.tsx b/src/src/components/kit_v2/Icon/Icon.test.tsx new file mode 100644 index 00000000..51f0f92a --- /dev/null +++ b/src/src/components/kit_v2/Icon/Icon.test.tsx @@ -0,0 +1,30 @@ +import { IconDeviceCctvOff } from '@tabler/icons-react'; +import { render } from '@testing-library/react'; + +import Icon from './Icon'; + +// Test of Button component +describe('} />', () => { + test('Renders Correctly', () => { + const { asFragment } = render(} />); + expect(asFragment()).toMatchSnapshot(); + }); + + // test size prop + test('size prop works properly', () => { + const { getByTestId } = render( + } size='sm' />, + ); + const icon = getByTestId('icon'); + expect(icon).toHaveStyle('width: 12px, height: 12px'); + }); + + // test css prop + test('css prop works properly', () => { + const { getByTestId } = render( + } css={{ color: 'red' }} />, + ); + const icon = getByTestId('icon'); + expect(icon).toHaveStyle("color: 'red'"); + }); +}); diff --git a/src/src/components/kit_v2/Icon/Icon.tsx b/src/src/components/kit_v2/Icon/Icon.tsx new file mode 100644 index 00000000..6e5ac040 --- /dev/null +++ b/src/src/components/kit_v2/Icon/Icon.tsx @@ -0,0 +1,40 @@ +import React from 'react'; + +import { IIconProps } from './Icon.d'; +import { Container, IconSlot, IconWrapper } from './Icon.style'; + +/** + * Icon component + * @param {string} size + * @param {React.ReactNode} icon + * @param {string} color + * @param {CSS} css + * @param {IIconProps} props + * @returns {React.FunctionComponentElement} + * @example + * + * } /> + * } size="sm" css={{ color: 'red' }}/> + */ +const Icon = React.forwardRef, IIconProps>( + ( + { size = 'lg', css, icon, color, ...props }: IIconProps, + forwardedRef, + ): React.FunctionComponentElement => { + return ( + + + {icon} + + + ); + }, +); + +Icon.displayName = 'Icon'; +export default React.memo(Icon); diff --git a/src/src/components/kit_v2/Icon/__snapshots__/Icon.test.tsx.snap b/src/src/components/kit_v2/Icon/__snapshots__/Icon.test.tsx.snap new file mode 100644 index 00000000..bc28ff98 --- /dev/null +++ b/src/src/components/kit_v2/Icon/__snapshots__/Icon.test.tsx.snap @@ -0,0 +1,48 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`} /> Renders Correctly 1`] = ` + +
+ + + + + + + + + + +
+
+`; diff --git a/src/src/components/kit_v2/Icon/index.ts b/src/src/components/kit_v2/Icon/index.ts new file mode 100644 index 00000000..2c1589a8 --- /dev/null +++ b/src/src/components/kit_v2/Icon/index.ts @@ -0,0 +1,4 @@ +import Icon from './Icon'; + +export * from './Icon.d'; +export default Icon; diff --git a/src/src/components/kit_v2/IconButton/IconButton.d.ts b/src/src/components/kit_v2/IconButton/IconButton.d.ts new file mode 100644 index 00000000..0c426b46 --- /dev/null +++ b/src/src/components/kit_v2/IconButton/IconButton.d.ts @@ -0,0 +1,47 @@ +import React from 'react'; + +import { CSS, ColorPaletteType } from 'config/stitches/types'; + +import { ButtonVariantType } from '../Button'; +export interface IIconButtonProps + extends Partial> { + /** + * @description The name of the icon + * @example 'add' + */ + icon: React.ReactNode; + /** + * @description The color of the icon button + * @example 'primary' + */ + color?: ColorPaletteType; + /** + * @description The size of the icon button + * @example 'md' + * @default 'md' + */ + size?: sizeType; + /** + * @description The variant of the icon button + * @example 'contained' + * @default 'contained' + */ + variant?: ButtonVariantType; + /** + * @description The disabled state of the icon button + * @example false + * @default false + */ + disabled?: boolean; + /** + * @description The css prop of the icon button + * @example { backgroundColor: 'red' } + * @default {} + */ + css?: CSS; +} + +// IconButton component size types +type sizeType = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; + +// IconButton component variants diff --git a/src/src/components/kit_v2/IconButton/IconButton.style.ts b/src/src/components/kit_v2/IconButton/IconButton.style.ts new file mode 100644 index 00000000..2d1c18af --- /dev/null +++ b/src/src/components/kit_v2/IconButton/IconButton.style.ts @@ -0,0 +1,43 @@ +import { styled } from 'config/stitches'; + +const Container = styled('button', { + all: 'unset', + display: 'inline-flex', + width: 'fit-content', + ai: 'center', + jc: 'center', + fontWeight: '$2', + cursor: 'pointer', + borderRadius: '$3', + transition: 'all 0.2s ease-in-out', + fontSize: '$2', + variants: { + size: { + xs: { + size: '$1', + }, + sm: { + size: '$2', + }, + md: { + size: '$3', + }, + lg: { + size: '$5', + fontSize: '$3', + }, + xl: { + size: '$7', + fontSize: '$3', + }, + }, + variant: { + contained: {}, + outlined: {}, + ghost: {}, + static: {}, + }, + }, +}); + +export { Container }; diff --git a/src/src/components/kit_v2/IconButton/IconButton.test.tsx b/src/src/components/kit_v2/IconButton/IconButton.test.tsx new file mode 100644 index 00000000..b5157434 --- /dev/null +++ b/src/src/components/kit_v2/IconButton/IconButton.test.tsx @@ -0,0 +1,22 @@ +import { render } from '@testing-library/react'; + +import IconButton from './IconButton'; + +// Test of IconButton component +describe('', () => { + test('Renders Correctly', () => { + const { asFragment } = render(); + expect(asFragment()).toMatchSnapshot(); + }); + + // test onClick event + test('onClick event works properly', () => { + const onClick = jest.fn(); + const { getByTestId } = render( + , + ); + const button = getByTestId('icon-button'); + button.click(); + expect(onClick).toHaveBeenCalled(); + }); +}); diff --git a/src/src/components/kit_v2/IconButton/IconButton.tsx b/src/src/components/kit_v2/IconButton/IconButton.tsx new file mode 100644 index 00000000..cd72ea18 --- /dev/null +++ b/src/src/components/kit_v2/IconButton/IconButton.tsx @@ -0,0 +1,54 @@ +import React from 'react'; + +import Icon from 'components/kit_v2/Icon'; + +import { getButtonStyles } from '../utils/getButtonStyles'; + +import { IIconButtonProps } from './IconButton.d'; +import { Container } from './IconButton.style'; + +/** + * @description IconButton component + * IconButton component params + * @param {string} icon - Icon of the button + * @param {string} size - Size of the button + * @param {string} color - Color of the button + * @param {string} variant - Variant of the button + * @param {boolean} disabled - Disabled state of the button + * @returns {React.FunctionComponentElement} - React component + * @example + * + */ +const IconButton = React.forwardRef< + React.ElementRef, + IIconButtonProps +>( + ( + { + icon, + size = 'sm', + color = 'primary', + variant = 'contained', + disabled = false, + css, + ...props + }: IIconButtonProps, + forwardedRef, + ): React.FunctionComponentElement => { + return ( + + + + ); + }, +); + +export default React.memo(IconButton); diff --git a/src/src/components/kit_v2/IconButton/__snapshots__/IconButton.test.tsx.snap b/src/src/components/kit_v2/IconButton/__snapshots__/IconButton.test.tsx.snap new file mode 100644 index 00000000..c56777fe --- /dev/null +++ b/src/src/components/kit_v2/IconButton/__snapshots__/IconButton.test.tsx.snap @@ -0,0 +1,14 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` Renders Correctly 1`] = ` + + + +`; diff --git a/src/src/components/kit_v2/IconButton/index.ts b/src/src/components/kit_v2/IconButton/index.ts new file mode 100644 index 00000000..0fa129c3 --- /dev/null +++ b/src/src/components/kit_v2/IconButton/index.ts @@ -0,0 +1,4 @@ +import IconButton from './IconButton'; + +export * from './IconButton.d'; +export default IconButton; diff --git a/src/src/components/kit_v2/Input/Input.d.ts b/src/src/components/kit_v2/Input/Input.d.ts new file mode 100644 index 00000000..edd3774f --- /dev/null +++ b/src/src/components/kit_v2/Input/Input.d.ts @@ -0,0 +1,45 @@ +import React from 'react'; + +import { CSS } from 'config/stitches/types'; + +// The Input component interface. +export interface IInputProps extends React.HTMLProps { + /** + * The Input placeholder. + * @default '' + */ + placeholder?: string; + /** + * The Input size. + * @default 'md' + */ + inputSize?: 'md' | 'lg' | 'xl'; + /** + * The error state. + * @default false + */ + error?: boolean; + /** + * The caption string. + */ + caption?: string; + /** + * The Input error message. + */ + errorMessage?: string; + /** + * The Input disabled state. + * @default false + */ + disabled?: boolean; + /** + * The Input left icon. + */ + leftIcon?: React.ReactNode; + /** + * The Input css prop. + * @default {} + * @example { backgroundColor: 'red' } + */ + css?: CSS; +} diff --git a/src/src/components/kit_v2/Input/Input.style.ts b/src/src/components/kit_v2/Input/Input.style.ts new file mode 100644 index 00000000..ab818825 --- /dev/null +++ b/src/src/components/kit_v2/Input/Input.style.ts @@ -0,0 +1,197 @@ +import Icon from 'components/kit_v2/Icon'; + +import { styled } from 'config/stitches'; + +const Container = styled('div', { + display: 'flex', + fd: 'column', +}); + +const LeftIcon = styled(Icon, { + position: 'absolute', + display: 'flex', + ai: 'center', + jc: 'center', + size: '$sizes$1', + color: '$secondary50', + pointerEvents: 'none', + variants: { + inputSize: { + md: { + left: '$space$4', + }, + lg: { + left: '$space$5', + }, + xl: { + left: '$space$6', + }, + }, + focused: { + true: { + color: '$textPrimary !important', + }, + }, + disabled: { + true: { + color: '$secondary30', + }, + }, + }, +}); + +const InputWrapper = styled('div', { + position: 'relative', + display: 'flex', + ai: 'center', + '&:hover': { + [`& ${LeftIcon}`]: { + color: '$secondary100', + }, + }, + variants: { + disabled: { + true: { + cursor: 'not-allowed', + pointerEvents: 'none', + color: '$secondary30', + }, + }, + }, +}); + +const InputContainer: any = styled('input', { + border: 'none', + outline: 'none', + height: '100%', + width: '100%', + color: '$textPrimary', + bs: '0px 0px 0px 1px $colors$secondary50', + br: '$3', + fontSize: '$3', + p: 0, + '&::placeholder': { + color: '$textPrimary50', + }, + '&:hover': { + bs: '0px 0px 0px 1px $colors$secondary100', + }, + '&:focus': { + bs: '0px 0px 0px 1px $colors$primary100', + }, + variants: { + leftIcon: { true: {} }, + size: { + md: { + height: '$sizes$3', + pl: '$6', + pr: '$16', + }, + lg: { + pl: '$7', + pr: '$17', + height: '$sizes$5', + }, + xl: { + pl: '$8', + pr: '$18', + height: '$sizes$7', + }, + }, + error: { + true: { + bs: '0px 0px 0px 1px $colors$danger100 !important', + }, + }, + disabled: { + true: { + color: '$textPrimary50', + }, + }, + }, + compoundVariants: [ + { + leftIcon: true, + size: 'md', + css: { + pl: '$16', + }, + }, + { + leftIcon: true, + size: 'lg', + css: { + pl: '$17', + }, + }, + { + leftIcon: true, + size: 'xl', + css: { + pl: '$18', + }, + }, + ], +}); + +const ClearButtonContainer = styled('div', { + position: 'absolute', + display: 'flex', + ai: 'center', + jc: 'center', + size: '$sizes$1', + cursor: 'pointer', + '& .Icon__container': { + display: 'flex', + ai: 'center', + jc: 'center', + p: '3px', + '& > i': { + background: '$secondary20', + color: '#5A667A', + br: '$round', + height: '100%', + p: '1px', + }, + }, + variants: { + size: { + md: { + right: '$4', + }, + lg: { + right: '$5', + }, + xl: { + right: '$6', + }, + }, + }, +}); + +const Caption = styled('p', { + fontSize: '$2', + mt: '2px', + color: '$textPrimary50', + variants: { + error: { + true: { + color: '$danger100', + }, + }, + disabled: { + true: { + color: '$secondary30', + }, + }, + }, +}); + +export { + Container, + InputContainer, + InputWrapper, + LeftIcon, + ClearButtonContainer, + Caption, +}; diff --git a/src/src/components/kit_v2/Input/Input.tsx b/src/src/components/kit_v2/Input/Input.tsx new file mode 100644 index 00000000..d19b50c6 --- /dev/null +++ b/src/src/components/kit_v2/Input/Input.tsx @@ -0,0 +1,132 @@ +import React from 'react'; + +import { IconX } from '@tabler/icons-react'; + +import Icon from 'components/kit_v2/Icon'; + +import { IInputProps } from './Input.d'; +import { + Caption, + ClearButtonContainer, + Container, + InputContainer, + InputWrapper, + LeftIcon, +} from './Input.style'; + +/** + * @description Input component + * Input component params + * @param {string} value - Value of the input + * @param {string} inputSize - Size of the input + * @param {string} placeholder - Placeholder of the input + * @param {boolean} error - Error state of the input + * @param {object} inputElementProps - Props of the input element + * @param {string} caption - Caption of the input + * @param {string} errorMessage - Error message of the input + * @param {string} leftIcon - Left icon of the input + * @param {boolean} disabled - Disabled state of the input + * @param {function} onChange - On change callback of the input + * @returns {React.FunctionComponentElement} - React component + * @example + * + */ +const Input = React.forwardRef, IInputProps>( + ( + { + inputSize = 'md', + placeholder, + error, + caption, + errorMessage, + leftIcon, + disabled, + css = {}, + ...props + }: IInputProps, + forwardedRef, + ): React.FunctionComponentElement => { + const [inputValue, setInputValue] = React.useState(props.value || ''); + const [isFocused, setIsFocused] = React.useState(false); + + React.useEffect(() => { + if (props.value !== inputValue) { + setInputValue(props.value); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [props.value]); + + const handleChange = React.useCallback( + (event: React.ChangeEvent) => { + let { value } = event.target; + setInputValue(value); + if (props.onChange) { + props.onChange(event); + } + }, + [props], + ); + + const handleClear = React.useCallback(() => { + if (disabled) return; + setInputValue(''); + if (props.onChange) { + props.onChange({ + target: { value: '' }, + } as React.ChangeEvent); + } + }, [disabled, props]); + + const onFocus = React.useCallback(() => { + setIsFocused(true); + }, []); + + const onBlur = React.useCallback(() => { + setIsFocused(false); + }, []); + + return ( + + + {leftIcon && ( + + )} + + + } /> + + + {errorMessage || caption ? ( +
+ ) : null} + + ); + }, +); + +Input.displayName = 'Input'; +export default React.memo(Input); diff --git a/src/src/components/kit_v2/Input/index.ts b/src/src/components/kit_v2/Input/index.ts new file mode 100644 index 00000000..d8d636d6 --- /dev/null +++ b/src/src/components/kit_v2/Input/index.ts @@ -0,0 +1,4 @@ +import Input from './Input'; + +export * from './Input.d'; +export default Input; diff --git a/src/src/components/kit_v2/ListItem/ListItem.d.ts b/src/src/components/kit_v2/ListItem/ListItem.d.ts new file mode 100644 index 00000000..7a0ae5ad --- /dev/null +++ b/src/src/components/kit_v2/ListItem/ListItem.d.ts @@ -0,0 +1,56 @@ +import React from 'react'; + +import { CSS } from 'config/stitches/types'; + +/** + * @description List item component props + */ +export interface IListItemProps + extends Partial> { + /** + * @description The size of the list item + * @example 'md' + * @default 'md' + */ + size?: ListItemSize; + /** + * @description The onClick event handler + * @example () => {} + * @type () => void + * @default undefined + * @optional true + */ + onClick?: (event: React.MouseEvent) => void; + /** + * @description The children of the list item + * @example
children
+ * @type React.ReactNode + * @default undefined + * @optional true + */ + children?: React.ReactNode; + /** + * @description The left node of the list item + * @example
left node
+ * @type React.ReactNode + * @default undefined + * @optional true + */ + leftNode?: React.ReactNode; + /** + * @description The right node of the list item + * @example
right node
+ * @type React.ReactNode + * @default undefined + * @optional true + */ + rightNode?: React.ReactNode; + /** + * @description The css of the list item + * @example { color: 'red' } + * @type CSS + */ + css?: CSS; +} + +export type ListItemSize = 'sm' | 'md' | 'lg'; diff --git a/src/src/components/kit_v2/ListItem/ListItem.style.ts b/src/src/components/kit_v2/ListItem/ListItem.style.ts new file mode 100644 index 00000000..09abf2ed --- /dev/null +++ b/src/src/components/kit_v2/ListItem/ListItem.style.ts @@ -0,0 +1,39 @@ +import { styled } from 'config/stitches'; + +const Container = styled('div', { + display: 'flex', + ai: 'center', + p: '0 $5', + br: '$3', + transition: 'all 0.2s ease-out', + cursor: 'pointer', + color: '#454545', + fontSize: '$3', + '&:hover': { + bc: '#EFF0F2', + }, + variants: { + size: { + sm: { + height: '$1', + }, + md: { + height: '$3', + }, + lg: { + height: '$5', + }, + }, + }, +}); + +const Content = styled('div', { + maxWidth: '100%', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', + overflow: 'hidden', + m: '0 $3', + flex: 1, +}); + +export { Container, Content }; diff --git a/src/src/components/kit_v2/ListItem/ListItem.tsx b/src/src/components/kit_v2/ListItem/ListItem.tsx new file mode 100644 index 00000000..c9633b2f --- /dev/null +++ b/src/src/components/kit_v2/ListItem/ListItem.tsx @@ -0,0 +1,49 @@ +import React from 'react'; + +import { IListItemProps } from './ListItem.d'; +import { Container, Content } from './ListItem.style'; + +/** + * ListItem component + * @param {React.ReactNode} children - children + * @param {function} onClick - onClick handler + * @param {ListItemSize} size - size of the ListItem + * @param {React.ReactNode} rightNode - right node + * @param {React.ReactNode} leftNode - left node + * @param {IListItemProps} rest - rest props + * @returns {React.FunctionComponentElement} + */ +const ListItem = React.forwardRef< + React.ElementRef, + IListItemProps +>( + ( + { + size = 'md', + children, + leftNode, + rightNode, + css = {}, + onClick, + ...rest + }: IListItemProps, + forwardedRef, + ): React.FunctionComponentElement => { + return ( + null} + size={size} + css={css} + ref={forwardedRef} + > + {leftNode ? leftNode : null} + {children} + {rightNode ? rightNode : null} + + ); + }, +); + +ListItem.displayName = 'ListItem'; +export default React.memo(ListItem); diff --git a/src/src/components/kit_v2/ListItem/index.ts b/src/src/components/kit_v2/ListItem/index.ts new file mode 100644 index 00000000..1a4aabb9 --- /dev/null +++ b/src/src/components/kit_v2/ListItem/index.ts @@ -0,0 +1,4 @@ +import ListItem from './ListItem'; + +export * from './ListItem.d'; +export default ListItem; diff --git a/src/src/components/kit_v2/Popover/Popover.d.ts b/src/src/components/kit_v2/Popover/Popover.d.ts new file mode 100644 index 00000000..4c1884a2 --- /dev/null +++ b/src/src/components/kit_v2/Popover/Popover.d.ts @@ -0,0 +1,33 @@ +import { PopperContentProps } from '@radix-ui/react-popover'; + +import { CSS } from 'config/stitches/types'; + +// Interface of the Popover component +export interface IPopoverProps { + /** + * Popover content + */ + content: React.ReactNode | any; + /** + * Trigger element + @default: + */ + trigger: React.ReactNode | (({ open: boolean }) => React.ReactNode); + /** + * popper props + */ + popperProps?: PopperProps; + /** + * Popover is default open + @default: false + */ + defaultOpen?: boolean; +} + +export interface PopperProps extends Partial { + /** + * styles for popper + * @default: {} + * */ + css?: CSS; +} diff --git a/src/src/components/kit_v2/Popover/Popover.style.ts b/src/src/components/kit_v2/Popover/Popover.style.ts new file mode 100644 index 00000000..43c02532 --- /dev/null +++ b/src/src/components/kit_v2/Popover/Popover.style.ts @@ -0,0 +1,50 @@ +import * as PopoverPrimitive from '@radix-ui/react-popover'; + +import { keyframes, styled } from 'config/stitches'; + +const slideUpAndFade = keyframes({ + '0%': { opacity: 0, transform: 'translateY(2px)' }, + '100%': { opacity: 1, transform: 'translateY(0)' }, +}); + +const slideRightAndFade = keyframes({ + '0%': { opacity: 0, transform: 'translateX(-2px)' }, + '100%': { opacity: 1, transform: 'translateX(0)' }, +}); + +const slideDownAndFade = keyframes({ + '0%': { opacity: 0, transform: 'translateY(-2px)' }, + '100%': { opacity: 1, transform: 'translateY(0)' }, +}); + +const slideLeftAndFade = keyframes({ + '0%': { opacity: 0, transform: 'translateX(2px)' }, + '100%': { opacity: 1, transform: 'translateX(0)' }, +}); + +const StyledContent = styled(PopoverPrimitive.Content, { + borderRadius: 4, + padding: 20, + width: 260, + zIndex: '$popover', + backgroundColor: 'white', + boxShadow: + 'hsl(206 22% 7% / 35%) 0px 10px 38px -10px, hsl(206 22% 7% / 20%) 0px 10px 20px -15px', + '@media (prefers-reduced-motion: no-preference)': { + animationDuration: '400ms', + animationTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)', + willChange: 'transform, opacity', + '&[data-state="open"]': { + '&[data-side="top"]': { animationName: slideDownAndFade }, + '&[data-side="right"]': { animationName: slideLeftAndFade }, + '&[data-side="bottom"]': { animationName: slideUpAndFade }, + '&[data-side="left"]': { animationName: slideRightAndFade }, + }, + }, + '&:focus': { + boxShadow: + "hsl(206 22% 7% / 35%) 0px 10px 38px -10px, hsl(206 22% 7% / 20%) 0px 10px 20px -15px, 0 0 0 2px 'black'", + }, +}); + +export { StyledContent }; diff --git a/src/src/components/kit_v2/Popover/Popover.tsx b/src/src/components/kit_v2/Popover/Popover.tsx new file mode 100644 index 00000000..22f3cc9e --- /dev/null +++ b/src/src/components/kit_v2/Popover/Popover.tsx @@ -0,0 +1,56 @@ +import React from 'react'; + +import * as PopoverPrimitive from '@radix-ui/react-popover'; + +import { IPopoverProps } from './Popover.d'; +import { StyledContent } from './Popover.style'; + +/** + * @description Popover component is for displaying a popover with a title, description, and actions + * Popover component params + * @param {React.ReactNode} trigger - React children + * @param {React.ReactNode} content - React children + * @param {boolean} defaultOpen - Default open state of the popover + * @param {PopperProps} popperProps - Popper props + * @returns {React.FunctionComponentElement} + * @constructor + * @example + * Open popover} + * content={Popover content} + * /> + */ +function Popover({ + trigger, + content, + defaultOpen, + popperProps, +}: IPopoverProps): React.FunctionComponentElement { + const [open, setOpen] = React.useState(defaultOpen); + + const handleOpenChange = React.useCallback((val: boolean) => { + setOpen(val); + }, []); + + return ( + + + {typeof trigger === 'function' ? trigger({ open }) : trigger} + + + + {content} + + + + ); +} + +Popover.displayName = 'Popover'; +export default React.memo(Popover); diff --git a/src/src/components/kit_v2/Popover/index.ts b/src/src/components/kit_v2/Popover/index.ts new file mode 100644 index 00000000..497a8666 --- /dev/null +++ b/src/src/components/kit_v2/Popover/index.ts @@ -0,0 +1,3 @@ +import Popover from './Popover'; + +export default Popover; diff --git a/src/src/components/kit_v2/QueryBadge/QueryBadge.d.ts b/src/src/components/kit_v2/QueryBadge/QueryBadge.d.ts new file mode 100644 index 00000000..235a6f73 --- /dev/null +++ b/src/src/components/kit_v2/QueryBadge/QueryBadge.d.ts @@ -0,0 +1,29 @@ +import { IButtonProps } from '../Button'; + +/** + * @description QueryBadge component props + */ +export interface IQueryBadgeProps extends IButtonProps { + /** + * @description QueryBadge component children + * @default null + * @type {React.ReactNode} + */ + children?: React.ReactNode; + /** + * @description QueryBadge component size + * @default 'md' + */ + size?: 'sm' | 'md' | 'lg' | 'xl'; + /** + * @description QueryBadge component color + * @default 'primary' + */ + color?: 'primary' | 'secondary'; + /** + * @description QueryBadge component disabled state + * @default false + * @type boolean + */ + disabled?: boolean; +} diff --git a/src/src/components/kit_v2/QueryBadge/QueryBadge.style.ts b/src/src/components/kit_v2/QueryBadge/QueryBadge.style.ts new file mode 100644 index 00000000..25d6c693 --- /dev/null +++ b/src/src/components/kit_v2/QueryBadge/QueryBadge.style.ts @@ -0,0 +1,9 @@ +import { styled } from 'config/stitches'; + +import Text from '../Text'; + +const ButtonText = styled(Text, { + color: '$textPrimary', +}); + +export { ButtonText }; diff --git a/src/src/components/kit_v2/QueryBadge/QueryBadge.tsx b/src/src/components/kit_v2/QueryBadge/QueryBadge.tsx new file mode 100644 index 00000000..c79183f1 --- /dev/null +++ b/src/src/components/kit_v2/QueryBadge/QueryBadge.tsx @@ -0,0 +1,73 @@ +import React from 'react'; + +import { IconEye } from '@tabler/icons-react'; + +import ButtonGroup from '../ButtonGroup'; +import Button from '../Button'; +import IconButton from '../IconButton'; + +import { IQueryBadgeProps } from './QueryBadge.d'; +import { ButtonText } from './QueryBadge.style'; + +/** + * @component QueryBadge + * @description QueryBadge component + * @param {string} size - size of the QueryBadge + * @param {string} color - color of the QueryBadge + * @param {boolean} disabled - disabled state of the QueryBadge + * @returns {React.FunctionComponentElement} - React component + * @example + * + */ +const QueryBadge = React.forwardRef< + React.ElementRef, + IQueryBadgeProps +>( + ( + { + size = 'sm', + color = 'secondary', + disabled = false, + variant = 'outlined', + children, + ...rest + }: IQueryBadgeProps, + forwardedRef, + ): React.FunctionComponentElement => { + return ( + + + } + css={color === 'primary' ? { bc: '$primary10' } : {}} + /> + + ); + }, +); + +QueryBadge.displayName = 'QueryBadge'; +export default React.memo(QueryBadge); diff --git a/src/src/components/kit_v2/QueryBadge/index.ts b/src/src/components/kit_v2/QueryBadge/index.ts new file mode 100644 index 00000000..6762b9db --- /dev/null +++ b/src/src/components/kit_v2/QueryBadge/index.ts @@ -0,0 +1,4 @@ +import QueryBadge from './QueryBadge'; + +export * from './QueryBadge.d'; +export default QueryBadge; diff --git a/src/src/components/kit_v2/Radio/Radio.d.ts b/src/src/components/kit_v2/Radio/Radio.d.ts new file mode 100644 index 00000000..4c46d1e3 --- /dev/null +++ b/src/src/components/kit_v2/Radio/Radio.d.ts @@ -0,0 +1,19 @@ +import { RadioGroupItemProps } from '@radix-ui/react-radio-group'; + +export interface IRadioItemProps extends RadioGroupItemProps { + /** + * The value of the radio button. + * @default '' + */ + value: string; + /** + * The disabled state of the radio button. + * @default false + */ + disabled?: boolean; + /** + * The required state of the radio button. + * @default false + */ + required?: boolean; +} diff --git a/src/src/components/kit_v2/Radio/Radio.style.ts b/src/src/components/kit_v2/Radio/Radio.style.ts new file mode 100644 index 00000000..4cf4822e --- /dev/null +++ b/src/src/components/kit_v2/Radio/Radio.style.ts @@ -0,0 +1,85 @@ +import { Root, Item, Indicator } from '@radix-ui/react-radio-group'; + +import { styled } from 'config/stitches'; + +const StyledRadioGroup = styled(Root, {}); + +const IndicatorWrapper = styled('span', { + all: 'unset', + display: 'inline-block', + bc: 'white', + width: 12, + height: 12, + br: '$round', + transition: '$main', + bs: 'inset 0 0 0 1px $colors$secondary100', + cursor: 'pointer', +}); + +const RadioGroupIndicator = styled(Indicator, { + display: 'flex', + ai: 'center', + jc: 'center', + width: '100%', + height: '100%', + position: 'relative', + transition: '$main', + '&::after': { + content: '""', + display: 'block', + width: 6, + height: 6, + br: '50%', + bc: '$primary100', + }, +}); + +const RadioItem = styled(Item, { + all: 'unset', + bc: 'white', + size: '$1', + br: '$round', + transition: '$main', + display: 'flex', + ai: 'center', + jc: 'center', + cursor: 'pointer', + '&:hover': { + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$primary100', + }, + }, + '&[data-state="checked"]': { + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$primary100', + }, + }, +}); + +const Flex = styled('div', { + display: 'flex', + '&[data-disabled]': { + pointerEvents: 'none', + [`& ${IndicatorWrapper}`]: { + bs: 'inset 0 0 0 1px $colors$secondary50 !important', + }, + [`& ${RadioGroupIndicator}`]: { + '&::after': { + bc: '$secondary50', + }, + }, + }, +}); + +const RadioLabel = styled('label', { + cursor: 'pointer', +}); + +export { + StyledRadioGroup, + RadioItem, + RadioGroupIndicator, + IndicatorWrapper, + Flex, + RadioLabel, +}; diff --git a/src/src/components/kit_v2/Radio/Radio.tsx b/src/src/components/kit_v2/Radio/Radio.tsx new file mode 100644 index 00000000..505186b8 --- /dev/null +++ b/src/src/components/kit_v2/Radio/Radio.tsx @@ -0,0 +1,53 @@ +import React from 'react'; + +import { RadioGroupProps } from '@radix-ui/react-radio-group'; + +import { IRadioItemProps } from './Radio.d'; +import { + Flex, + IndicatorWrapper, + RadioGroupIndicator, + RadioItem, + RadioLabel, + StyledRadioGroup, +} from './Radio.style'; + +/** + * @description Radio component is for displaying a radio button + * Radio component params + * @param {React.ReactNode} children - React children + * @param {props} props - RadioGroupProps + * @returns {React.FunctionComponentElement} + * @constructor + * @example + * + * Radio 1 + * Radio 2 + * + */ +export const RadioGroup = React.forwardRef< + React.ElementRef, + RadioGroupProps +>(({ children, ...props }: RadioGroupProps) => ( + {children} +)); + +const Radio = React.forwardRef, IRadioItemProps>( + ({ ...props }: IRadioItemProps, forwardedRef) => ( + + + + + + + {props.children ? ( + + {props.children} + + ) : null} + + ), +); + +Radio.displayName = 'Radio'; +export default React.memo(Radio); diff --git a/src/src/components/kit_v2/Radio/index.ts b/src/src/components/kit_v2/Radio/index.ts new file mode 100644 index 00000000..0a24668a --- /dev/null +++ b/src/src/components/kit_v2/Radio/index.ts @@ -0,0 +1,4 @@ +import RadioItem from './Radio'; + +export * from './Radio.d'; +export default RadioItem; diff --git a/src/src/components/kit_v2/Select/Select.d.ts b/src/src/components/kit_v2/Select/Select.d.ts new file mode 100644 index 00000000..d0b16886 --- /dev/null +++ b/src/src/components/kit_v2/Select/Select.d.ts @@ -0,0 +1,123 @@ +import React from 'react'; + +import { CSS } from 'config/stitches/types'; + +import { IPopoverProps } from '../Popover/Popover'; + +// The interface of the Select + +export interface ISelectProps { + /** + * @description The size of the select + * @example 'md' + * @default 'md' + */ + size?: SelectSizeType; + /** + * @description The onChange event handler + * @example () => {} + * @type () => void + * @default undefined + */ + onChange?: (event: React.ChangeEvent) => void; + /** + * @description The options of the select + * @example [{group: 'Metrics', options: [{value: 'metric1', label: 'Metric 1'}]}] + * @type ISelectOption[] + * @default undefined + */ + options?: SelectOptionType[]; + /** + * @description The value of the select + * @example 'metric1' | ['metric1', 'metric2'] + * @type string | string[] + * @default undefined + */ + value?: string | string[]; + /** + * @description The multiple select + * @example false + */ + multiple?: boolean; + /** + * @description The css of the list item + * @example { color: 'red' } + * @type CSS + */ + css?: CSS; + /** + * @description The disabled state of the list item + * @example false + */ + disabled?: boolean; + /** + * @description The trigger of the list item + * @example + */ + trigger?: React.ReactNode; + /** + * @description The popper props of the Select component + * @example sideOffset: 8 + */ + popoverProps?: IPopoverProps; + /** + * @description onValueChange event handler + * @example (val: string) => {} + * @type (val: string) => void + */ + onValueChange: (val: string) => void; + /** + * @description the height of the select + * @example 400 + * @default 400 + * @type number + */ + height?: number; + /** + * @description searchability of the select + * @example false + * @default false + */ + searchable?: boolean; +} + +type SelectOptionType = { + group?: string; + options?: { value: string; label: string | React.ReactNode }[]; +}; + +type SelectSizeType = 'sm' | 'md' | 'lg'; +export interface ISelectItemProps { + /** + * @description The data of the item + * @example {items, value, onValueChange, multiple, size} + * @required + */ + data: { + items: SelectItemType[]; + value: string | string[] | undefined; + onValueChange: (val: string) => void; + multiple?: boolean | undefined; + size: SelectSizeType; + }; + /** + * @description The index of the item + * @example 0 + * @type number + * @required + */ + index: number; + /** + * @description The style of the item + * @example { color: 'red' } + * @type CSS + * @required + */ + style: React.CSSProperties; +} + +export type SelectItemType = { + value?: string; + label?: string | React.ReactNode; + group?: string; +}; diff --git a/src/src/components/kit_v2/Select/Select.test.tsx b/src/src/components/kit_v2/Select/Select.test.tsx new file mode 100644 index 00000000..fc6e7565 --- /dev/null +++ b/src/src/components/kit_v2/Select/Select.test.tsx @@ -0,0 +1,36 @@ +import { render } from '@testing-library/react'; + +import Select from './'; + +// Test of Select component +describe('Select component', () => { + const options = [ + { + group: 'Group 1', + options: [ + { value: 'test1', label: 'Test 1' }, + { value: 'test2', label: 'Test 2' }, + ], + }, + ]; + + it('should render with options', () => { + const { container } = render( + {}} + />, + ); + expect(container).toBeInTheDocument(); + }); +}); diff --git a/src/src/components/kit_v2/Select/Select.tsx b/src/src/components/kit_v2/Select/Select.tsx new file mode 100644 index 00000000..68174a49 --- /dev/null +++ b/src/src/components/kit_v2/Select/Select.tsx @@ -0,0 +1,200 @@ +import React from 'react'; +import { FixedSizeList as List } from 'react-window'; + +import Popover from '../Popover'; +import Button from '../Button'; +import Box from '../Box'; +import Text from '../Text'; +import Input from '../Input'; + +import { ISelectProps, ISelectItemProps } from './Select.d'; +import SelectItem from './SelectItem'; + +const sizeDict = { + sm: 20, + md: 24, + lg: 28, +}; + +/** + * @description Virtualized Select component with search + * @param {boolean} multiple - whether multiple select + * @param {React.ReactNode} trigger - trigger element + * @param {PopoverProps} popoverProps - popover props + * @param {string | string[] | undefined } value - selected value + * @param {(val: string | string[]) => void} onValueChange - on value change callback + * @param {boolean} searchable - whether searchable + * @param {ISelectItemProps['data']['items']} options - options + * @param {('sm' | 'md' | 'lg')} size - size + * @param {number} height - the height of the list + * @returns {React.FunctionComponentElement} + */ +const Select = ({ + multiple, + trigger, + popoverProps, + value, + onValueChange, + searchable, + options = [], + size = 'md', + height = 256, +}: ISelectProps) => { + const [search, setSearch] = React.useState(''); + + const onSearchChange = React.useCallback((e) => { + setSearch(e.target.value); + }, []); + + const flattenOptions: ISelectItemProps['data']['items'] | [] = + React.useMemo(() => { + if (options.length > 0) { + return options + ?.map((item) => { + if (item.group) { + return [{ group: item.group }, ...item.options!]; + } else { + return [...item.options!]; + } + }) + .flat(); + } else { + return []; + } + }, [options]); + + const searchedOptions: ISelectItemProps['data']['items'] | [] = + React.useMemo(() => { + let data: ISelectItemProps['data']['items'] | any[] = []; + if (searchable && options.length > 0) { + data = options + ?.map((item) => { + const filteredData = item?.options + ?.filter((option) => { + if (option.label) { + return (option.label as string) + .toLowerCase() + .includes(search.toLowerCase()); + } + return false; + }) + .map((opt: any) => { + const searchVal = search.toLowerCase(); + const index = opt.label.toLowerCase().indexOf(searchVal); + const beforeStr = opt.label.substring(0, index); + const afterStr = opt.label.slice(index + search.length); + const middleStr = opt.label.substring( + index, + index + search.length, + ); + const title = + index > -1 ? ( + <> + {beforeStr} + {middleStr} + {afterStr} + + ) : ( + opt.label + ); + return { ...opt, label: title }; + }); + + if (filteredData?.length) { + return { ...item, options: filteredData }; + } + return null; + }) + .filter(Boolean); + } + + if (data?.length > 0) { + const flatten = data + ?.map((item) => { + if (item.group) { + return [{ group: item.group }, ...item.options]; + } else { + return [...item.options]; + } + }) + .flat(); + return flatten; + } + return []; + }, [options, search, searchable]); + + const noResults: boolean = React.useMemo(() => { + if (searchable) { + return ( + !!search && searchedOptions.length === 0 && flattenOptions?.length > 0 + ); + } + return false; + }, [search, searchable, searchedOptions, flattenOptions]); + + const data: ISelectItemProps['data'] = React.useMemo(() => { + const items = searchable ? searchedOptions : flattenOptions; + return { + items: noResults ? flattenOptions : items, + value, + onValueChange, + multiple, + size, + }; + }, [ + flattenOptions, + multiple, + noResults, + onValueChange, + searchable, + searchedOptions, + size, + value, + ]); + + return ( + trigger || } + content={ + <> + {searchable ? ( + + + {noResults ? ( + + No Results + + ) : null} + + ) : null} + + + {SelectItem} + + + + } + /> + ); +}; + +Select.displayName = 'Select'; +export default React.memo(Select); diff --git a/src/src/components/kit_v2/Select/SelectItem.tsx b/src/src/components/kit_v2/Select/SelectItem.tsx new file mode 100644 index 00000000..1cf834ce --- /dev/null +++ b/src/src/components/kit_v2/Select/SelectItem.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { areEqual } from 'react-window'; + +import { IconCheck } from '@tabler/icons-react'; + +import Text from '../Text'; +import Icon from '../Icon'; +import ListItem from '../ListItem'; +import { CheckBox } from '../Checkbox/Checkbox'; + +import { ISelectItemProps } from './Select.d'; + +/** + * SelectItem component for react-window list + * @param {ISelectItemProps} props - props + * @returns {React.FunctionComponentElement} + * @constructor + * @category Components + * @subcategory Select + */ +const SelectItem = ({ + data, + index, + style, +}: ISelectItemProps): React.FunctionComponentElement => { + const { items, value, onValueChange, multiple, size } = data; + const item = items[index]; + let selected: boolean = false; + if (item.value) { + selected = value === item.value || value?.indexOf(item.value) !== -1; + } + const rightNode = multiple ? null : selected ? ( + } /> + ) : null; + + return ( + <> + {item.group ? ( + + {item.group} + + ) : ( + : null} + onClick={() => onValueChange(item.value!)} + > + + {item.label} + + + )} + + ); +}; + +SelectItem.displayName = 'SelectItem'; +export default React.memo(SelectItem, areEqual); diff --git a/src/src/components/kit_v2/Select/index.ts b/src/src/components/kit_v2/Select/index.ts new file mode 100644 index 00000000..8fd02a2e --- /dev/null +++ b/src/src/components/kit_v2/Select/index.ts @@ -0,0 +1,4 @@ +import Select from './Select'; + +export * from './Select.d'; +export default Select; diff --git a/src/src/components/kit_v2/Separator/Separator.d.ts b/src/src/components/kit_v2/Separator/Separator.d.ts new file mode 100644 index 00000000..c1f2497b --- /dev/null +++ b/src/src/components/kit_v2/Separator/Separator.d.ts @@ -0,0 +1,26 @@ +import { SeparatorProps } from '@radix-ui/react-separator'; + +import { CSS } from 'config/stitches/types'; + +export interface ISeparatorProps extends SeparatorProps { + /** + * @description The color of the separator + * @example 'primary' + * @default 'gray' + */ + color?: CSS['color']; + /** + * @description The margin of the separator + * @example '10px' + * @default '0' + * @type {CSS['margin']} + */ + margin?: CSS['margin']; + /** + * @description The css prop of the separator + * @example { margin: '10px' } + * @default {} + * @type {CSS} + */ + css?: CSS; +} diff --git a/src/src/components/kit_v2/Separator/Separator.style.ts b/src/src/components/kit_v2/Separator/Separator.style.ts new file mode 100644 index 00000000..a448a760 --- /dev/null +++ b/src/src/components/kit_v2/Separator/Separator.style.ts @@ -0,0 +1,8 @@ +import * as Separator from '@radix-ui/react-separator'; + +import { styled } from 'config/stitches'; + +export const SeparatorRoot: any = styled(Separator.Root, { + '&[data-orientation=horizontal]': { height: 1, width: '100%' }, + '&[data-orientation=vertical]': { height: 'inherit', width: 1 }, +}); diff --git a/src/src/components/kit_v2/Separator/Separator.test.tsx b/src/src/components/kit_v2/Separator/Separator.test.tsx new file mode 100644 index 00000000..2e997f86 --- /dev/null +++ b/src/src/components/kit_v2/Separator/Separator.test.tsx @@ -0,0 +1,40 @@ +import { render } from '@testing-library/react'; + +import Separator from './Separator'; + +// Test of Separator component + +describe('', () => { + test('Renders Correctly', () => { + const { asFragment } = render(); + expect(asFragment()).toMatchSnapshot(); + }); + + // test color prop + test('color prop works properly', () => { + const { getByTestId } = render(); + const separator = getByTestId('separator'); + expect(separator).toHaveStyle('background-color: $primary100'); + }); + + // test orientation prop + test('orientation prop works properly', () => { + const { getByTestId } = render(); + const separator = getByTestId('separator'); + expect(separator).toHaveAttribute('data-orientation', 'vertical'); + }); + + // test margin prop + test('margin prop works properly', () => { + const { getByTestId } = render(); + const separator = getByTestId('separator'); + expect(separator).toHaveStyle('margin: "0 $4'); + }); + + // test css prop + test('css prop works properly', () => { + const { getByTestId } = render(); + const separator = getByTestId('separator'); + expect(separator).toHaveStyle("color: 'red'"); + }); +}); diff --git a/src/src/components/kit_v2/Separator/Separator.tsx b/src/src/components/kit_v2/Separator/Separator.tsx new file mode 100644 index 00000000..4f14ef5f --- /dev/null +++ b/src/src/components/kit_v2/Separator/Separator.tsx @@ -0,0 +1,42 @@ +import React from 'react'; + +import { SeparatorRoot } from './Separator.style'; +import { ISeparatorProps } from './Separator.d'; + +/** + * Separator component + * @param {string} color - color of the separator line + * @param {string} margin - margin of the separator line + * @param {CSS} css - css of the separator line + * @param {ISeparatorProps} props - HTML attributes + * @returns {React.FunctionComponentElement} + * @example + * + * + * + * + */ +function Separator({ + orientation = 'horizontal', + color = '$secondary30', + margin, + css, + ...props +}: ISeparatorProps): React.FunctionComponentElement { + return ( + + ); +} + +Separator.displayName = 'Separator'; +export default React.memo(Separator); diff --git a/src/src/components/kit_v2/Separator/__snapshots__/Separator.test.tsx.snap b/src/src/components/kit_v2/Separator/__snapshots__/Separator.test.tsx.snap new file mode 100644 index 00000000..ecd1dd52 --- /dev/null +++ b/src/src/components/kit_v2/Separator/__snapshots__/Separator.test.tsx.snap @@ -0,0 +1,12 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` Renders Correctly 1`] = ` + +
+ {errorMessage ? errorMessage : caption || ''} +
+ )} + + + ); +} +export default ActiveRunsTable; diff --git a/src/src/pages/Dashboard/components/ActiveRunsTable/useActiveRunsTable.tsx b/src/src/pages/Dashboard/components/ActiveRunsTable/useActiveRunsTable.tsx new file mode 100644 index 00000000..4ff0ea90 --- /dev/null +++ b/src/src/pages/Dashboard/components/ActiveRunsTable/useActiveRunsTable.tsx @@ -0,0 +1,264 @@ +import React from 'react'; +import _ from 'lodash-es'; +import moment from 'moment'; + +import RunNameColumn from 'components/Table/RunNameColumn'; +import { Badge } from 'components/kit'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import { TABLE_DATE_FORMAT } from 'config/dates/dates'; + +import { IResourceState } from 'modules/core/utils/createResource'; + +import { IRun } from 'types/services/models/metrics/runModel'; + +import contextToString from 'utils/contextToString'; +import { processDurationTime } from 'utils/processDurationTime'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import { formatValue } from 'utils/formatValue'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { decode, encode } from 'utils/encoder/encoder'; + +import createActiveRunsEngine from './ActiveRunsStore'; + +function useActiveRunsTable() { + const tableRef = React.useRef(null); + const { current: activeRunsEngine } = React.useRef(createActiveRunsEngine); + const activeRunsStore: IResourceState[]> = + activeRunsEngine.activeRunsState((state) => state); + const [selectedRows, setSelectedRows] = React.useState< + Record + >({}); + const [comparisonQuery, setComparisonQuery] = React.useState(''); + + React.useEffect(() => { + activeRunsEngine.fetchActiveRuns(); + return () => { + activeRunsEngine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const metricsColumns = React.useMemo(() => { + if (activeRunsStore.data) { + const metrics: any = []; + const systemMetrics: any = []; + const metricsValues: any = {}; + activeRunsStore.data.forEach(({ hash, traces }: IRun) => { + traces.metric.forEach((trace: any) => { + const metricHash = getMetricHash(trace.name, trace.context as any); + + if (metricsValues.hasOwnProperty(metricHash)) { + metricsValues[metricHash][hash] = [ + trace.values.last_step, + trace.values.last, + ]; + } else { + metricsValues[metricHash] = { + [hash]: [trace.values.last_step, trace.values.last], + }; + + const metricContext = contextToString( + trace.context as Record, + ) as string; + + const isSystem = isSystemMetric(trace.name); + const col = { + key: metricHash, + content: ( + + ), + topHeader: isSystem + ? formatSystemMetricName(trace.name) + : trace.name, + name: trace.name, + context: metricContext, + isSystem, + }; + + if (isSystem) { + systemMetrics.push(col); + } else { + metrics.push(col); + } + } + }); + }); + + return { + columns: _.orderBy(metrics, ['name', 'context'], ['asc', 'asc']).concat( + _.orderBy(systemMetrics, ['name', 'context'], ['asc', 'asc']), + ) as any, + values: metricsValues, + }; + } + + return { + columns: [], + values: [], + }; + }, [activeRunsStore.data]); + + // memoized table data + const tableData = React.useMemo(() => { + if (activeRunsStore.data) { + return activeRunsStore.data.map( + ({ props, hash }: IRun, index: number) => { + const key = encode({ + hash, + }); + let row: any = { + key, + selectKey: key, + index, + experiment: { + content: ( + + ), + }, + run: { + content: ( + + ), + }, + date: moment(props.creation_time * 1000).format(TABLE_DATE_FORMAT), + duration: processDurationTime( + props.creation_time * 1000, + props.end_time ? props.end_time * 1000 : Date.now(), + ), + }; + + metricsColumns.columns.forEach((col: any) => { + const [step, value] = metricsColumns.values[col.key][hash] ?? [ + null, + null, + ]; + row[col.key] = { + content: + step === null + ? '--' + : col.isSystem + ? formatValue(value) + : `step: ${step} / value: ${formatValue(value)}`, + }; + }); + return row; + }, + ); + } + return []; + }, [activeRunsStore.data, metricsColumns]); + + // memoized table columns + const tableColumns = React.useMemo(() => { + const columns = [ + { + key: 'experiment', + content: Experiment, + topHeader: 'Run', + pin: 'left', + }, + { + key: 'run', + content: Name, + topHeader: 'Run', + pin: 'left', + }, + { + key: 'date', + content: Date, + topHeader: 'Run', + }, + { + key: 'duration', + content: Duration, + topHeader: 'Run', + }, + ]; + return columns.concat(metricsColumns.columns); + }, [metricsColumns]); + + // Update the table data and columns when the activity data changes + React.useEffect(() => { + if (tableRef.current?.updateData) { + tableRef.current.updateData({ + newColumns: tableColumns, + newData: tableData, + }); + } + }, [tableData, tableColumns]); + + // Handler for row selection + const onRowSelect = React.useCallback( + ({ actionType, data }) => { + let selected: Record = { ...selectedRows }; + switch (actionType) { + case 'single': + if (selectedRows[data.key]) { + selected = _.omit(selectedRows, data.key); + } else { + selected[data.key] = true; + } + break; + case 'selectAll': + if (Array.isArray(data)) { + data.forEach((item: any) => { + if (!selectedRows[item.key]) { + selected[item.key] = true; + } + }); + } else { + Object.values(data) + .reduce((acc: any[], value: any) => { + return acc.concat(value.items); + }, []) + .forEach((item: any) => { + if (!selectedRows[item.selectKey]) { + selected[item.selectKey] = true; + } + }); + } + break; + case 'removeAll': + if (Array.isArray(data)) { + selected = {}; + } + break; + } + + setSelectedRows(selected); + + setComparisonQuery( + `run.hash in [${Object.keys(selected) + .map((key) => `"${JSON.parse(decode(key)).hash}"`) + .join(', ')}]`, + ); + }, + [selectedRows], + ); + + return { + data: activeRunsStore.data, + tableData, + tableColumns, + tableRef, + loading: activeRunsStore.loading, + selectedRows, + comparisonQuery, + onRowSelect, + }; +} + +export default useActiveRunsTable; diff --git a/src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.scss b/src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.scss new file mode 100644 index 00000000..fb0e3642 --- /dev/null +++ b/src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.scss @@ -0,0 +1,38 @@ +@use 'src/styles/abstracts' as *; + +.AimIntegrations { + margin-top: $space-lg; +} + +.AimIntegrations__section { + padding: $space-lg 0; +} + +.AimIntegrations__section__title { + margin-bottom: $space-sm; +} + +.AimIntegrations__section__accordion { + box-shadow: 0 0 0 1px $pico-20; + margin: 0 !important; + + &::before { + content: none; + } +} + +.AimIntegrations__section__accordion__summary { + padding: $space-xs $space-sm !important; + min-height: 42px !important; + max-height: 42px !important; +} + +.AimIntegrations__section__accordion__details { + display: block; + padding: $space-sm $space-sm!important; +} + +.AimIntegrations__section__text { + font-style: italic; + margin-top: $space-sm; +} diff --git a/src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.tsx b/src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.tsx new file mode 100644 index 00000000..67bb80d2 --- /dev/null +++ b/src/src/pages/Dashboard/components/AimIntegrations/AimIntegrations.tsx @@ -0,0 +1,202 @@ +import * as React from 'react'; + +import { + Accordion, + AccordionDetails, + AccordionSummary, + Link, +} from '@material-ui/core'; + +import { Icon, Text } from 'components/kit'; +import CodeBlock from 'components/CodeBlock/CodeBlock'; + +import { DOCUMENTATIONS } from 'config/references'; + +import './AimIntegrations.scss'; + +function AimIntegrations() { + const [expanded, setExpanded] = React.useState(0); + + const handleChange = + (panel: number) => (event: React.ChangeEvent<{}>, newExpanded: boolean) => { + setExpanded(newExpanded ? panel : false); + }; + + const integrations = [ + { + title: 'Integrate PyTorch Lightning', + docsLink: DOCUMENTATIONS.INTEGRATIONS.PYTORCH_LIGHTNING, + code: `from aim.pytorch_lightning import AimLogger + +# ... +trainer = pl.Trainer(logger=AimLogger(experiment='experiment_name')) +# ...`, + }, + { + title: 'Integrate Hugging Face', + docsLink: DOCUMENTATIONS.INTEGRATIONS.HUGGING_FACE, + code: `from aim.hugging_face import AimCallback + +# ... +aim_callback = AimCallback(repo='/path/to/logs/dir', experiment='mnli') +trainer = Trainer( + model=model, + args=training_args, + train_dataset=train_dataset if training_args.do_train else None, + eval_dataset=eval_dataset if training_args.do_eval else None, + callbacks=[aim_callback], + # ... +) +# ...`, + }, + { + title: 'Integrate Keras & tf.keras', + docsLink: DOCUMENTATIONS.INTEGRATIONS.KERAS, + code: `import aim + +# ... +model.fit(x_train, y_train, epochs=epochs, callbacks=[ + aim.keras.AimCallback(repo='/path/to/logs/dir', experiment='experiment_name') + + # Use aim.tensorflow.AimCallback in case of tf.keras + aim.tensorflow.AimCallback(repo='/path/to/logs/dir', experiment='experiment_name') +]) +# ...`, + }, + { + title: 'Integrate KerasTuner', + docsLink: DOCUMENTATIONS.INTEGRATIONS.KERAS_TUNER, + code: `from aim.keras_tuner import AimCallback + +# ... +tuner.search( + train_ds, + validation_data=test_ds, + callbacks=[AimCallback(tuner=tuner, repo='.', experiment='keras_tuner_test')], +) +# ...`, + }, + { + title: 'Integrate XGBoost', + docsLink: DOCUMENTATIONS.INTEGRATIONS.XGBOOST, + code: `from aim.xgboost import AimCallback + +# ... +aim_callback = AimCallback(repo='/path/to/logs/dir', experiment='experiment_name') +bst = xgb.train(param, xg_train, num_round, watchlist, callbacks=[aim_callback]) +# ...`, + }, + { + title: 'Integrate CatBoost', + docsLink: DOCUMENTATIONS.INTEGRATIONS.CATBOOST, + code: `from aim.catboost import AimLogger + +# ... +model.fit(train_data, train_labels, log_cout=AimLogger(loss_function='Logloss'), logging_level="Info") +# ...`, + }, + { + title: 'Integrate fastai', + docsLink: DOCUMENTATIONS.INTEGRATIONS.FASTAI, + code: `from aim.fastai import AimCallback + +# ... +learn = cnn_learner(dls, resnet18, pretrained=True, + loss_func=CrossEntropyLossFlat(), + metrics=accuracy, model_dir="/tmp/model/", + cbs=AimCallback(repo='.', experiment='fastai_test')) +# ...`, + }, + { + title: 'Integrate LightGBM', + docsLink: DOCUMENTATIONS.INTEGRATIONS.LIGHT_GBM, + code: `from aim.lightgbm import AimCallback + +# ... +aim_callback = AimCallback(experiment='lgb_test') +aim_callback.experiment['hparams'] = params + +gbm = lgb.train(params, + lgb_train, + num_boost_round=20, + valid_sets=lgb_eval, + callbacks=[aim_callback, lgb.early_stopping(stopping_rounds=5)]) +# ...`, + }, + + { + title: 'Integrate PyTorch Ignite', + docsLink: DOCUMENTATIONS.INTEGRATIONS.PYTORCH_IGNITE, + code: `from aim.pytorch_ignite import AimLogger + +# ... +aim_logger = AimLogger() + +aim_logger.log_params({ + "model": model.__class__.__name__, + "pytorch_version": str(torch.__version__), + "ignite_version": str(ignite.__version__), +}) + +aim_logger.attach_output_handler( + trainer, + event_name=Events.ITERATION_COMPLETED, + tag="train", + output_transform=lambda loss: {'loss': loss} +) +# ...`, + }, + ]; + + return ( +
+ + Integrate Aim with your favorite ML framework + +
+ {integrations.map((item, i) => ( + + } + className='AimIntegrations__section__accordion__summary' + > + + {item.title} + + + + + + See documentation{' '} + + here + + . + + + + ))} +
+
+ ); +} + +export default AimIntegrations; diff --git a/src/src/pages/Dashboard/components/AimIntegrations/index.ts b/src/src/pages/Dashboard/components/AimIntegrations/index.ts new file mode 100644 index 00000000..abd212a2 --- /dev/null +++ b/src/src/pages/Dashboard/components/AimIntegrations/index.ts @@ -0,0 +1,3 @@ +import AimIntegrations from './AimIntegrations'; + +export default AimIntegrations; diff --git a/src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeed.tsx b/src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeed.tsx new file mode 100644 index 00000000..4e9754ee --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeed.tsx @@ -0,0 +1,13 @@ +import React from 'react'; + +import ContributionsFeed from 'components/ContributionsFeed'; + +import useDashboardContributionsFeed from './useDashboardContributionsFeed'; + +function DashboardContributionsFeed(): React.FunctionComponentElement | null { + const props = useDashboardContributionsFeed(); + + return ; +} + +export default React.memo(DashboardContributionsFeed); diff --git a/src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeedStore.ts b/src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeedStore.ts new file mode 100644 index 00000000..85a336af --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardContributionsFeed/DashboardContributionsFeedStore.ts @@ -0,0 +1,25 @@ +import { createSearchRunRequest } from 'modules/core/api/runsApi'; +import createResource from 'modules/core/utils/createResource'; + +import { RequestOptions } from 'services/NetworkService'; + +import { IRun } from 'types/services/models/metrics/runModel'; + +import { parseStream } from 'utils/encoder/streamEncoding'; + +function createDashboardContributionsFeedEngine() { + let { call } = createSearchRunRequest(); + + const { fetchData, state, destroy } = createResource[]>( + async (queryParams: RequestOptions['query_params']) => + parseStream(await call(queryParams)), + ); + return { + fetchContributionsFeed: (queryParams: RequestOptions['query_params']) => + fetchData(queryParams), + contributionsFeedState: state, + destroy, + }; +} + +export default createDashboardContributionsFeedEngine(); diff --git a/src/src/pages/Dashboard/components/DashboardContributionsFeed/index.ts b/src/src/pages/Dashboard/components/DashboardContributionsFeed/index.ts new file mode 100644 index 00000000..af543c42 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardContributionsFeed/index.ts @@ -0,0 +1,3 @@ +import DashboardContributionsFeed from './DashboardContributionsFeed'; + +export default DashboardContributionsFeed; diff --git a/src/src/pages/Dashboard/components/DashboardContributionsFeed/useDashboardContributionsFeed.ts b/src/src/pages/Dashboard/components/DashboardContributionsFeed/useDashboardContributionsFeed.ts new file mode 100644 index 00000000..33dd0c1f --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardContributionsFeed/useDashboardContributionsFeed.ts @@ -0,0 +1,125 @@ +import React from 'react'; +import moment from 'moment'; + +import { + TIMELINE_DAY_FORMAT, + TIMELINE_MONTH_FORMAT, + TIMELINE_TIME_FORMAT, +} from 'config/dates/dates'; + +import { IResourceState } from 'modules/core/utils/createResource'; + +import { IRun } from 'types/services/models/metrics/runModel'; + +import projectContributionsEngine from '../ProjectContributions/ProjectContributionsStore'; + +import contributionsFeedEngine from './DashboardContributionsFeedStore'; + +function useDashboardContributionsFeed() { + const [data, setData] = React.useState([]); + const { current: engine } = React.useRef(contributionsFeedEngine); + const contributionsFeedStore: IResourceState = + engine.contributionsFeedState((state) => state); + const { current: contributionsEngine } = React.useRef( + projectContributionsEngine, + ); + const contributionsState = contributionsEngine.projectContributionsState( + (state) => state, + ); + + React.useEffect(() => { + engine.fetchContributionsFeed({ + limit: 25, + exclude_params: true, + exclude_traces: true, + }); + return () => { + engine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useEffect(() => { + if (contributionsFeedStore.data?.length) { + let newData = [...data, ...contributionsFeedStore.data]; + setData(newData); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [contributionsFeedStore.data]); + + const memoizedData = React.useMemo(() => { + // get existing month list from the contributionsFeedStore data + const feedData: { [key: string]: any } = {}; + if (data.length) { + const monthList = data?.reduce((acc: any, run: IRun) => { + const { props } = run; + const month = moment(props.creation_time * 1000).format( + TIMELINE_MONTH_FORMAT, + ); + if (!acc.includes(month)) { + acc.push(month); + } + return acc; + }, []); + // create a list of objects with month and contributions + + monthList.forEach((month: string) => { + feedData[month] = {}; + }); + + // add contributions to the month list + data?.forEach((run: IRun) => { + const { props, hash } = run; + + // get the month + const month = moment(props.creation_time * 1000).format( + TIMELINE_MONTH_FORMAT, + ); + + // get the day of the month + const day = moment(props.creation_time * 1000).format( + TIMELINE_DAY_FORMAT, + ); + + // create a contribution object + const contribution = { + name: props.name, + date: moment(props.creation_time * 1000).format(TIMELINE_TIME_FORMAT), + hash, + active: props.active, + creation_time: props.creation_time, + experiment: props.experiment?.name, + experimentId: props.experiment?.id, + }; + if (feedData[month]?.[day]?.length) { + feedData[month][day].push(contribution); + } else { + feedData[month][day] = [contribution]; + } + }); + } + return feedData; + }, [data]); + + function loadMore(): void { + if (contributionsFeedStore.data && !contributionsFeedStore.loading) { + engine.fetchContributionsFeed({ + limit: 25, + exclude_params: true, + exclude_traces: true, + offset: data[data.length - 1].hash, + }); + } + } + + return { + isLoading: contributionsFeedStore.loading, + data: memoizedData, + totalRunsCount: contributionsState.data?.num_runs, + archivedRunsCount: contributionsState.data?.num_archived_runs, + fetchedCount: data.length, + loadMore, + }; +} + +export default useDashboardContributionsFeed; diff --git a/src/src/pages/Dashboard/components/DashboardRight/DashboardRight.scss b/src/src/pages/Dashboard/components/DashboardRight/DashboardRight.scss new file mode 100644 index 00000000..c675f5d1 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/DashboardRight.scss @@ -0,0 +1,13 @@ +@use 'src/styles/abstracts' as *; + +.DashboardRight { + display: flex; + flex-direction: column; + width: 285px; + background-color: #fafafb; + overflow: auto; + &__title { + margin-top: $space-md; + padding: 0 $space-lg; + } +} diff --git a/src/src/pages/Dashboard/components/DashboardRight/DashboardRight.tsx b/src/src/pages/Dashboard/components/DashboardRight/DashboardRight.tsx new file mode 100644 index 00000000..01418b9d --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/DashboardRight.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +import { Text } from 'components/kit'; + +import ReleaseNotes from './ReleaseNotes/ReleaseNotes'; + +import './DashboardRight.scss'; + +function DashboardRight(): React.FunctionComponentElement { + return ( + + ); +} + +export default React.memo(DashboardRight); diff --git a/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.scss b/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.scss new file mode 100644 index 00000000..05ee72f5 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.scss @@ -0,0 +1,21 @@ +@use 'src/styles/abstracts' as *; + +.GuideLinks { + padding: $space-sm $space-sm $space-unit; + display: flex; + flex-direction: column; + border-bottom: $border-dark-lighter; + &__title { + margin-left: $space-sm; + } + &__content { + margin: $space-xs 0 $space-unit; + &--name { + flex: 1 100; + } + } + &--btn { + margin: 0 $space-sm; + text-decoration: none; + } +} diff --git a/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.tsx b/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.tsx new file mode 100644 index 00000000..e83c0fdc --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuideDocs.tsx @@ -0,0 +1,91 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; +import ListItem from 'components/kit/ListItem/ListItem'; + +import { DOCUMENTATIONS } from 'config/references'; + +import guideStore from './GuidesStore'; + +import './GuideDocs.scss'; + +function GuideDocs(): React.FunctionComponentElement { + const { shuffle, guideLinks, shuffled } = guideStore(); + + const onClick: ( + e: React.MouseEvent, + path: string, + newTab?: boolean, + ) => void = React.useCallback( + (e: React.MouseEvent, path: string, newTab = false) => { + e.stopPropagation(); + if (path) { + window.open(path, newTab ? '_blank' : '_self'); + window.focus(); + return; + } + }, + [], + ); + + React.useEffect(() => { + if (!shuffled) { + shuffle(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( +
+ + Guides + +
+ {guideLinks.map( + (link: { name: string; url: string }, index: number) => ( + + onClick(e, link.url)} + size={12} + tint={100} + > + {link.name} + + +
+ onClick(e, link.url, true)} + name='new-tab' + /> +
+
+
+ ), + )} +
+ + + +
+ ); +} + +export default React.memo(GuideDocs); diff --git a/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuidesStore.ts b/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuidesStore.ts new file mode 100644 index 00000000..b9542b28 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/GuideDocs/GuidesStore.ts @@ -0,0 +1,20 @@ +import create from 'zustand'; + +import { DASHBOARD_PAGE_GUIDES } from 'config/references'; + +const guideStore = create<{ + shuffled: boolean; + guideLinks: any; + shuffle: () => void; +}>((set) => ({ + shuffled: false, + guideLinks: [{}], + shuffle: () => { + const guideLinks = DASHBOARD_PAGE_GUIDES; + const shuffledLinks = guideLinks + .sort(() => 0.5 - Math.random()) + .slice(0, 4); + set({ shuffled: true, guideLinks: shuffledLinks }); + }, +})); +export default guideStore; diff --git a/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.scss b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.scss new file mode 100644 index 00000000..59ed5125 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.scss @@ -0,0 +1,114 @@ +@use 'src/styles/abstracts' as *; + +.ReleaseNotes { + display: flex; + flex-direction: column; + &__Spinner { + display: flex; + align-items: center; + justify-content: center; + height: calc(100vh - 40px); + } + &__latest { + display: flex; + flex-direction: column; + margin-top: $space-lg; + padding: 0 $space-lg $space-unit; + border-bottom: $border-dark-lighter; + &__title { + display: flex; + margin-bottom: $space-sm; + span { + margin-left: $space-xs; + padding: $space-xxxxs $space-xxxs; + color: $white; + background-color: $primary-color; + border-radius: $border-radius-xss; + font-size: 10px; + font-weight: $font-700; + } + } + &__content { + display: flex; + flex-direction: column; + a { + text-decoration: none; + display: block; + } + &__item { + display: flex; + padding-left: 18px; + margin-bottom: $space-sm; + position: relative; + span { + word-break: break-word; + } + &::before { + content: ''; + position: absolute; + left: 0; + top: 3px; + width: 7px; + height: 7px; + border-radius: $border-radius-circle; + background-color: $pico-30; + } + &:last-child { + margin-bottom: 0; + } + } + } + } + &__changelog { + border-bottom: $border-dark-lighter; + &__title { + padding: $space-sm $space-lg 0; + } + &__content { + margin-top: $space-sm; + max-height: 290px; + padding: 0 $space-lg $space-unit; + overflow: auto; + .ReleaseNoteItem { + &::after { + height: calc(100% + #{$space-sm}); + } + } + } + &__currentRelease { + position: relative; + padding: $space-sm $space-lg; + .ReleaseNoteItem { + &::after { + top: -13px; + height: calc(100% + #{$space-sm}); + } + } + &::before { + content: ''; + transition: all 0.18s ease-out; + opacity: 0; + position: absolute; + left: 0; + top: -12px; + height: 13px; + width: 100%; + background: linear-gradient( + 180deg, + rgba(234, 235, 239, 0) 0%, + #eaebef 100% + ); + } + &__scroll { + &::before { + opacity: 1; + } + .ReleaseNoteItem { + &::after { + top: -11px !important; + } + } + } + } + } +} diff --git a/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.tsx b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.tsx new file mode 100644 index 00000000..79687979 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleaseNotes.tsx @@ -0,0 +1,105 @@ +import React from 'react'; + +import { Button, Spinner, Text } from 'components/kit'; +import ReleaseNoteItem from 'components/ReleaseNoteItem/ReleaseNoteItem'; + +import { AIM_VERSION } from 'config/config'; + +import GuideLinks from '../GuideDocs/GuideDocs'; + +import useReleaseNotes from './useReleaseNotes'; + +import './ReleaseNotes.scss'; + +function ReleaseNotes(): React.FunctionComponentElement { + const { + changelogData, + LatestReleaseData, + currentReleaseData, + isLoading, + releaseNoteRef, + scrollShadow, + } = useReleaseNotes(); + + return ( +
+ {isLoading ? ( +
+ +
+ ) : ( + <> +
+
+ + Aim {LatestReleaseData?.tagName} + + {`v${AIM_VERSION}` === LatestReleaseData?.tagName ? null : ( + Latest + )} +
+
+ {LatestReleaseData?.info?.map((title: string, index: number) => ( +
+ {title.replace(/-/g, ' ')} +
+ ))} + + + +
+
+ {`v${AIM_VERSION}` === LatestReleaseData?.tagName ? null : ( +
+ + Changelog + +
+ {changelogData.map((item) => ( + + ))} +
+ {currentReleaseData ? ( +
+ +
+ ) : null} +
+ )} + + + )} +
+ ); +} + +export default React.memo(ReleaseNotes); diff --git a/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleasesStore.ts b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleasesStore.ts new file mode 100644 index 00000000..e92c8267 --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/ReleasesStore.ts @@ -0,0 +1,11 @@ +import { fetchReleaseNotes } from 'modules/core/api/releaseNotesApi'; +import { IReleaseNote } from 'modules/core/api/releaseNotesApi/types'; +import createResource from 'modules/core/utils/createResource'; + +function createReleasesEngine() { + const { fetchData, state, destroy } = + createResource(fetchReleaseNotes); + return { fetchReleases: fetchData, releasesState: state, destroy }; +} + +export default createReleasesEngine(); diff --git a/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/useReleaseNotes.ts b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/useReleaseNotes.ts new file mode 100644 index 00000000..001b0dea --- /dev/null +++ b/src/src/pages/Dashboard/components/DashboardRight/ReleaseNotes/useReleaseNotes.ts @@ -0,0 +1,161 @@ +import React from 'react'; +import _ from 'lodash-es'; +import { marked } from 'marked'; + +import { AIM_VERSION } from 'config/config'; + +import { IReleaseNote } from 'modules/core/api/releaseNotesApi/types'; +import { IResourceState } from 'modules/core/utils/createResource'; +import { fetchReleaseByTagName } from 'modules/core/api/releaseNotesApi'; + +import createReleaseNotesEngine from './ReleasesStore'; + +const CHANGELOG_CONTENT_MAX_HEIGHT = 296; +function useReleaseNotes() { + const [loading, setLoading] = React.useState(true); + const [mounted, setMounted] = React.useState(false); + const [scrollShadow, setScrollShadow] = React.useState(false); + const [currentRelease, setCurrentRelease] = React.useState(); + const { current: releaseNotesEngine } = React.useRef( + createReleaseNotesEngine, + ); + const releaseNotesStore: IResourceState = + releaseNotesEngine.releasesState((state) => state); + const releaseNoteRef = React.useRef(null); + + React.useEffect(() => { + const releaseNoteNode = releaseNoteRef.current; + + if (releaseNotesStore.data?.length) { + // detect current release in fetched release notes + const release: IReleaseNote | undefined = releaseNotesStore.data?.find( + (release: IReleaseNote) => release.tag_name === `v${AIM_VERSION}`, + ); + if (release) { + setCurrentRelease(release); + setLoading(false); + } else { + fetchCurrentRelease(); + } + } else { + releaseNotesEngine.fetchReleases(); + } + return () => { + releaseNoteNode?.removeEventListener('scroll', onChangelogContentScroll); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [releaseNotesStore.data]); + + React.useEffect(() => { + if (!loading) { + setMounted(true); + } + if (mounted && releaseNoteRef.current) { + if ( + releaseNoteRef?.current?.scrollHeight > CHANGELOG_CONTENT_MAX_HEIGHT + ) { + setScrollShadow(true); + } + releaseNoteRef?.current?.addEventListener( + 'scroll', + onChangelogContentScroll, + ); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [loading, mounted]); + + const onChangelogContentScroll = _.throttle(() => { + const hasScrollShadow: boolean = + releaseNoteRef!.current!.scrollTop + CHANGELOG_CONTENT_MAX_HEIGHT <= + releaseNoteRef!.current!.scrollHeight; + setScrollShadow(hasScrollShadow); + }, 150); + async function fetchCurrentRelease(): Promise { + try { + const data = await fetchReleaseByTagName(`v${AIM_VERSION}`); + setCurrentRelease(data); + setLoading(false); + } catch (e) { + setLoading(false); + } + } + + function getLatestReleaseInfo(releaseBody: string): RegExpMatchArray | null { + const wrapper = document.createElement('div'); + wrapper.innerHTML = marked.parse(releaseBody); + const listElements: string[] = []; + wrapper.querySelectorAll('li').forEach((li, index) => { + if (index < 4) { + listElements.push( + li.innerText.replace( + // eslint-disable-next-line no-useless-escape + /(\sby\s\@[A-z\d](?:[A-z\d]|-(?=[A-z\d])){0,38}\s\w+\shttps\:\/\/github\.com\/((\w+\/?){4}))/g, + '', + ), + ); + } else { + return; + } + }); + return listElements; + } + + // function to modify release notes name + function modifyReleaseName(releaseTitle: string): string { + // eslint-disable-next-line no-useless-escape + return releaseTitle.replace(/(^\🚀\s*v\d+\.\d+\.\d+\s*\-\s*)/, ''); + } + + const changelogData: { tagName: string; info: any; url: string }[] = + React.useMemo(() => { + const data: { tagName: string; info: any; url: string }[] = []; + releaseNotesStore?.data?.some((release: IReleaseNote) => { + if (release.tag_name === `v${AIM_VERSION}`) { + return true; + } + data.push({ + tagName: release.tag_name, + info: modifyReleaseName(release.name), + url: release.html_url, + }); + return false; + }); + return data; + }, [releaseNotesStore.data]); + + const currentReleaseData: + | { tagName: string; info: any; url: string } + | undefined = React.useMemo(() => { + if (currentRelease) { + return { + tagName: currentRelease?.tag_name, + info: modifyReleaseName(currentRelease?.name), + url: currentRelease.html_url, + }; + } + }, [currentRelease]); + + const LatestReleaseData: + | { tagName: string; info: any; url: string } + | undefined = React.useMemo(() => { + const latest = releaseNotesStore?.data?.[0]; + if (latest) { + return { + tagName: latest?.tag_name, + info: getLatestReleaseInfo(latest.body), + url: latest.html_url, + }; + } + }, [releaseNotesStore.data]); + + return { + changelogData, + currentReleaseData, + LatestReleaseData, + isLoading: loading, + releaseNoteRef, + scrollShadow, + }; +} + +export default useReleaseNotes; diff --git a/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.scss b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.scss new file mode 100644 index 00000000..248e4820 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.scss @@ -0,0 +1,29 @@ +@use 'src/styles/abstracts' as *; + +$bookmark-height: 24px; +.DashboardBookmarks { + padding: $space-sm; + border-top: $border-dark-lighter; + + &__title { + padding: 0 $space-sm; + margin-bottom: $space-xs; + } + &__list { + max-height: 5 * $bookmark-height; + overflow: auto; + &__ListItem { + &__Text { + flex: 1; + margin-left: $space-xs; + text-transform: capitalize; + } + } + } + &__NavLink { + margin-top: $space-unit; + text-decoration: none; + display: block; + padding: 0 $space-sm; + } +} diff --git a/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.tsx b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.tsx new file mode 100644 index 00000000..a061b068 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarks.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { NavLink } from 'react-router-dom'; + +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; +import ListItem from 'components/kit/ListItem/ListItem'; + +import { IDashboardData } from 'modules/core/api/dashboardsApi'; + +import { BookmarkIconType } from 'pages/Bookmarks/components/BookmarkCard/BookmarkCard'; + +import useDashboardBookmarks from './useDashboardBookmarks'; + +import './DashboardBookmarks.scss'; + +function DashboardBookmarks(): React.FunctionComponentElement | null { + const { dashboardBookmarksStore, handleClick } = useDashboardBookmarks(); + + return dashboardBookmarksStore.data?.length ? ( +
+ + Bookmarks{' '} + {dashboardBookmarksStore.data.length + ? `(${dashboardBookmarksStore.data.length})` + : ''} + +
+ {dashboardBookmarksStore.data + .slice(0, 5) + ?.map((dashboard: IDashboardData) => ( + +
+ + + handleClick(e, dashboard)} + size={12} + tint={100} + > + {dashboard.name} + +
+ handleClick(e, dashboard, true)} + name='new-tab' + /> +
+
+
+
+ ))} +
+ {dashboardBookmarksStore.data.length > 5 ? ( + + + + ) : null} +
+ ) : null; +} + +export default React.memo(DashboardBookmarks); diff --git a/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarksStore.ts b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarksStore.ts new file mode 100644 index 00000000..85c86fa6 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/DashboardBookmarksStore.ts @@ -0,0 +1,17 @@ +import { + fetchDashboardsList, + IDashboardData, +} from 'modules/core/api/dashboardsApi'; +import createResource from 'modules/core/utils/createResource'; + +function createDashboardBookmarksEngine() { + const { fetchData, state, destroy } = + createResource(fetchDashboardsList); + return { + fetchDashboardBookmarks: fetchData, + dashboardBookmarksState: state, + destroy, + }; +} + +export default createDashboardBookmarksEngine(); diff --git a/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/useDashboardBookmarks.tsx b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/useDashboardBookmarks.tsx new file mode 100644 index 00000000..f7d0e4e5 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/DashboardBookmarks/useDashboardBookmarks.tsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { useHistory } from 'react-router-dom'; + +import { IResourceState } from 'modules/core/utils/createResource'; +import { IDashboardData } from 'modules/core/api/dashboardsApi'; + +import createBookmarksEngine from './DashboardBookmarksStore'; + +function useDashboardBookmarks() { + const history = useHistory(); + const { current: dashboardBookmarksEngine } = React.useRef( + createBookmarksEngine, + ); + const dashboardBookmarksStore: IResourceState = + dashboardBookmarksEngine.dashboardBookmarksState((state) => state); + + React.useEffect(() => { + dashboardBookmarksEngine.fetchDashboardBookmarks(); + return () => { + dashboardBookmarksEngine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const handleClick: ( + e: React.MouseEvent, + dashboard: IDashboardData, + newTab?: boolean, + ) => void = React.useCallback( + ( + e: React.MouseEvent, + dashboard: IDashboardData, + newTab = false, + ) => { + e.stopPropagation(); + if (dashboard) { + const path = `${dashboard.app_type}/${dashboard.app_id}`; + if (newTab) { + window.open(path, '_blank'); + window.focus(); + return; + } + history.push(path); + } + }, + [history], + ); + + return { handleClick, dashboardBookmarksStore }; +} + +export default useDashboardBookmarks; diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.d.ts b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.d.ts new file mode 100644 index 00000000..da00b740 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.d.ts @@ -0,0 +1,7 @@ +export type ExperimentsCardRowDataType = { + key: number; + name: string; + archived: boolean; + run_count: number; + id: string; +}; diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.scss b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.scss new file mode 100644 index 00000000..779068f6 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.scss @@ -0,0 +1,15 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentsCard { + border-top: $border-dark-lighter; + padding: $space-unit $space-sm; + &__title { + margin-bottom: $space-sm; + padding: 0 $space-sm; + } + .ExperimentNameBox { + &__experimentName { + font-size: $text-sm; + } + } +} diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.tsx b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.tsx new file mode 100644 index 00000000..b8618a1a --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsCard.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import DataList from 'components/kit/DataList'; +import { Text } from 'components/kit'; + +import CompareSelectedRunsPopover from 'pages/Metrics/components/Table/CompareSelectedRunsPopover'; + +import { AppNameEnum } from 'services/models/explorer'; + +import useExperimentsCard from './useExperimentsCard'; + +import './ExperimentsCard.scss'; + +function ExperimentsCard(): React.FunctionComponentElement | null { + const { + tableRef, + tableColumns, + tableData, + experimentsStore, + selectedRows, + experimentsQuery, + } = useExperimentsCard(); + return experimentsStore.data?.length ? ( +
+ + Experiments ({experimentsStore.data.length}) + + , + ]} + disableMatchBar={true} + /> +
+ ) : null; +} + +ExperimentsCard.displayName = 'ExperimentsCard'; + +export default React.memo(ExperimentsCard); diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsStore.ts b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsStore.ts new file mode 100644 index 00000000..93b9d930 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/ExperimentsStore.ts @@ -0,0 +1,13 @@ +import { + getExperiments, + IExperimentData, +} from 'modules/core/api/experimentsApi'; +import createResource from 'modules/core/utils/createResource'; + +function createExperimentsEngine() { + const { fetchData, state, destroy } = + createResource(getExperiments); + return { fetchExperiments: fetchData, experimentsState: state, destroy }; +} + +export default createExperimentsEngine(); diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/index.ts b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/index.ts new file mode 100644 index 00000000..82c235f5 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/index.ts @@ -0,0 +1,4 @@ +import ExperimentsCard from './ExperimentsCard'; + +export * from './ExperimentsCard.d'; +export default ExperimentsCard; diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/useExperimentsCard.tsx b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/useExperimentsCard.tsx new file mode 100644 index 00000000..c40b03e6 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExperimentsCard/useExperimentsCard.tsx @@ -0,0 +1,206 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { Checkbox } from '@material-ui/core'; + +import { Icon, Text } from 'components/kit'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import { IResourceState } from 'modules/core/utils/createResource'; +import { IExperimentData } from 'modules/core/api/experimentsApi'; + +import createExperimentEngine from './ExperimentsStore'; + +import { ExperimentsCardRowDataType } from '.'; + +function useExperimentsCard() { + const tableRef = React.useRef(null); + const [selectedRows, setSelectedRows] = React.useState< + Record + >({}); + const { current: experimentsEngine } = React.useRef(createExperimentEngine); + const experimentsStore: IResourceState = + experimentsEngine.experimentsState((state) => state); + + React.useEffect(() => { + experimentsEngine.fetchExperiments(); + return () => { + experimentsEngine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // memoized table data + const tableData: ExperimentsCardRowDataType[] = React.useMemo(() => { + if (experimentsStore.data) { + return experimentsStore.data.map( + ({ name, archived, run_count, id }: IExperimentData, index: number) => { + return { + key: index, + name, + archived, + run_count, + id, + }; + }, + ); + } + return []; + }, [experimentsStore.data]); + + // on row selection + const onRowSelect = React.useCallback( + (rowKey?: string, rowData?: ExperimentsCardRowDataType) => { + if (rowKey) { + const newSelectedRows = selectedRows[rowKey] + ? _.omit(selectedRows, rowKey) + : { ...selectedRows, [rowKey]: rowData }; + setSelectedRows(newSelectedRows); + } else if (!_.isEmpty(selectedRows)) { + setSelectedRows({}); + } else { + const newSelectedRows = tableData.reduce( + ( + acc: Record, + rowData: ExperimentsCardRowDataType, + ) => { + acc[rowData.id] = rowData; + return acc; + }, + {}, + ); + setSelectedRows(newSelectedRows); + } + }, + [selectedRows, tableData], + ); + + // memoized table columns + const tableColumns = React.useMemo( + () => [ + { + dataKey: 'id', + key: 'id', + title: ( + } + className='selectCheckbox' + checkedIcon={ + tableData.length === Object.keys(selectedRows)?.length ? ( + + + + ) : ( + + + + ) + } + onClick={() => onRowSelect()} + checked={!_.isEmpty(selectedRows)} + /> + ), + width: '20px', + cellRenderer: ({ + cellData, + rowData, + }: { + cellData: string; + rowData: ExperimentsCardRowDataType; + }) => { + return ( + } + className='selectCheckbox' + checked={!!selectedRows[cellData]} + checkedIcon={ + + + + } + onClick={() => onRowSelect(cellData, rowData)} + /> + ); + }, + }, + { + dataKey: 'name', + key: 'name', + title: ( + + Name + + ), + width: 'calc(100% - 50px)', + style: { paddingLeft: 10, paddingRight: 12 }, + cellRenderer: ({ + cellData, + rowData, + }: { + cellData: string; + rowData: ExperimentsCardRowDataType; + }) => ( + + ), + }, + { + dataKey: 'run_count', + key: 'run_count', + title: ( + + Runs + + ), + flexGrow: 1, + width: '46px', + textAlign: 'right', + style: { textAlign: 'right' }, + cellRenderer: ({ cellData }: { cellData: number }) => ( + + {cellData} + + ), + }, + ], + [tableData?.length, onRowSelect, selectedRows], + ); + + // Update the table data and columns when the experiments data changes + React.useEffect(() => { + if (tableRef.current?.updateData) { + tableRef.current.updateData({ + newColumns: tableColumns, + newData: tableData, + }); + } + }, [tableData, tableColumns]); + + const experimentsQuery = React.useMemo(() => { + return `run.experiment in [${Object.values(selectedRows) + .map(({ name }: ExperimentsCardRowDataType) => `"${name}"`) + .join(',')}]`; + }, [selectedRows]); + + return { + tableRef, + tableColumns, + tableData, + experimentsStore, + selectedRows, + experimentsQuery, + }; +} +export default useExperimentsCard; diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExploreSection.scss b/src/src/pages/Dashboard/components/ExploreSection/ExploreSection.scss new file mode 100644 index 00000000..70491e58 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExploreSection.scss @@ -0,0 +1,137 @@ +@use 'src/styles/abstracts' as *; + +.ExploreSection { + display: flex; + flex-direction: column; + min-width: 310px; + width: 310px; + background-color: $pico-2; + overflow: auto; + height: 100vh; + &__Spinner { + height: 100%; + display: flex; + align-items: center; + justify-content: center; + } + &__loading { + display: none; + } + &__title { + margin-top: 1.25rem; + padding: 0 1.5rem; + } + .ExploreSection__content { + .DataList { + .CompareSelectedRunsPopover__trigger { + margin-right: 0 !important; + .Icon__container { + margin-right: $space-xxxs; + } + .Text { + font-size: $text-sm; + } + } + + .IllustrationBlock { + &__container { + padding-bottom: 0; + } + &__large__img { + height: 100%; + img { + height: 100%; + } + } + } + .defaultSelectIcon { + border: 1.5px solid $pico-50; + border-radius: $border-radius-xs; + width: 12px; + height: 12px; + } + &__toolbarItems { + height: unset; + margin-left: $space-xs; + } + &__textsTable { + border: none; + padding-left: $space-xs; + } + .SearchBar { + width: auto; + min-width: 250px; + padding: 0 $space-sm; + margin-bottom: $space-xxxs; + .SearchInput { + margin-right: 0; + } + .MuiOutlinedInput-root { + background-color: $white; + } + label { + font-size: $text-sm; + } + } + .selectedSelectIcon { + border-radius: $border-radius-xs; + width: 12px; + height: 12px; + background: $primary-color; + color: $white; + display: flex; + justify-content: center; + align-items: center; + } + .partiallySelectedSelectIcon { + border-radius: $border-radius-xs; + width: 12px; + height: 12px; + display: flex; + justify-content: center; + align-items: center; + } + .MuiCheckbox-root { + padding: $space-xxxs !important; + } + .BaseTable { + background-color: transparent; + &__table { + background-color: transparent; + } + &__header { + background: transparent; + &-row { + background-color: transparent; + } + &-cell { + border: none; + background-color: transparent; + padding: 0; + &--text { + font-size: 12px; + } + } + } + &__row { + background-color: transparent; + box-shadow: unset; + &-cell { + background-color: transparent; + border: none; + padding: 0; + &:first-child { + padding: 0; + } + p { + max-width: 100%; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + } + } + } + } +} diff --git a/src/src/pages/Dashboard/components/ExploreSection/ExploreSection.tsx b/src/src/pages/Dashboard/components/ExploreSection/ExploreSection.tsx new file mode 100644 index 00000000..729942b9 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/ExploreSection.tsx @@ -0,0 +1,60 @@ +import React from 'react'; + +import { Spinner, Text } from 'components/kit'; + +import ExperimentsCard from './ExperimentsCard'; +import DashboardBookmarks from './DashboardBookmarks/DashboardBookmarks'; +import QuickLinks from './QuickLinks/QuickLinks'; +import TagsCard from './TagsCard/TagsCard'; +import RecentSearches from './RecentSearches/RecentSearches'; +import createTagsEngine from './TagsCard/TagsStore'; +import createExperimentsEngine from './ExperimentsCard/ExperimentsStore'; +import bookmarksEngine from './DashboardBookmarks/DashboardBookmarksStore'; + +import './ExploreSection.scss'; + +function ExploreSection(): React.FunctionComponentElement { + const [loading, setLoading] = React.useState(true); + const { loading: tagsLoading } = React.useRef( + createTagsEngine, + ).current.tagsState((state) => state); + const { loading: experimentsLoading } = React.useRef( + createExperimentsEngine, + ).current.experimentsState((state) => state); + const { loading: bookmarksLoading } = React.useRef( + bookmarksEngine, + ).current.dashboardBookmarksState((state) => state); + + React.useEffect(() => { + // if all resources are loaded + if (!tagsLoading && !experimentsLoading && !bookmarksLoading) { + setLoading(false); + } + }, [bookmarksLoading, experimentsLoading, tagsLoading]); + + return ( + + ); +} + +export default React.memo(ExploreSection); diff --git a/src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.scss b/src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.scss new file mode 100644 index 00000000..bf3b38c7 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.scss @@ -0,0 +1,17 @@ +@use 'src/styles/abstracts' as *; + +.QuickLinks { + padding: $space-lg $space-sm $space-unit; + &__title { + margin-bottom: $space-xs; + padding: 0 $space-sm; + } + &__list { + margin-top: $space-md $space-lg; + &__ListItem { + &__Text { + flex: 1; + } + } + } +} diff --git a/src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.tsx b/src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.tsx new file mode 100644 index 00000000..edbe8aa1 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/QuickLinks/QuickLinks.tsx @@ -0,0 +1,112 @@ +import React from 'react'; +import { useHistory } from 'react-router-dom'; +import moment from 'moment'; + +import { Tooltip } from '@material-ui/core'; + +import { Icon, Text } from 'components/kit'; +import ListItem from 'components/kit/ListItem/ListItem'; + +import { DATE_QUERY_FORMAT } from 'config/dates/dates'; + +import { encode } from 'utils/encoder/encoder'; + +import './QuickLinks.scss'; + +const linkItems: { path: string; label: string }[] = [ + { + path: 'active', + label: 'Active runs', + }, + { + path: 'archived', + label: 'Archived runs', + }, + { + path: 'latest', + label: "Last week's runs", + }, +]; + +function QuickLinks(): React.FunctionComponentElement { + const history = useHistory(); + + const onClick: ( + e: React.MouseEvent, + value: string, + newTab?: boolean, + ) => void = React.useCallback( + (e: React.MouseEvent, value: string, newTab = false) => { + e.stopPropagation(); + if (value) { + let search = {}; + if (value === 'latest') { + search = encode({ + query: `datetime(${moment() + .subtract(7, 'day') + .format( + DATE_QUERY_FORMAT, + )}) <= run.created_at < datetime(${moment().format( + DATE_QUERY_FORMAT, + )})`, + }); + } else { + search = encode({ + query: `run.${value.toLowerCase()} == True`, + }); + } + const path = `/runs?select=${search}`; + if (newTab) { + window.open(path, '_blank'); + window.focus(); + return; + } + history.push(path); + } + }, + [history], + ); + + return ( +
+ + Quick Navigation + +
+ {linkItems.map(({ label, path }) => ( + + onClick(e, path)} + size={12} + tint={100} + > + {label} + + +
+ onClick(e, path, true)} + name='new-tab' + /> +
+
+
+ ))} +
+
+ ); +} + +export default QuickLinks; diff --git a/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearchItem.tsx b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearchItem.tsx new file mode 100644 index 00000000..9a237db8 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearchItem.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { useHistory } from 'react-router-dom'; + +import { Tooltip } from '@material-ui/core'; + +import ListItem from 'components/kit/ListItem/ListItem'; +import { Icon } from 'components/kit'; + +import useCodeHighlighter from 'hooks/useCodeHighlighter'; + +import { BookmarkIconType } from 'pages/Bookmarks/components/BookmarkCard/BookmarkCard'; + +import { encode } from 'utils/encoder/encoder'; + +function RecentSearchItem({ + query, + explorer, +}: { + query: string; + explorer: string; +}) { + const { elementRef } = useCodeHighlighter(); + const history = useHistory(); + + const onClick: (e: React.MouseEvent, newTab?: boolean) => void = + React.useCallback( + (e: React.MouseEvent, newTab?: boolean) => { + e.stopPropagation(); + const search = encode({ + query, + advancedMode: true, + advancedQuery: query, + }); + const path = `/${explorer}?select=${search}`; + if (newTab) { + window.open(path, '_blank'); + window.focus(); + return; + } + history.push(path); + }, + [explorer, history, query], + ); + return ( + +
+ onClick(e)}> + +
+            {query}
+          
+ onClick(e, true)} + name='new-tab' + /> +
+
+
+ ); +} +export default React.memo(RecentSearchItem); diff --git a/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.scss b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.scss new file mode 100644 index 00000000..b7e68184 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.scss @@ -0,0 +1,21 @@ +@use 'src/styles/abstracts' as *; + +.RecentSearches { + padding: 0 $space-sm $space-unit; + &__title { + margin-bottom: $space-xs; + padding: 0 $space-sm; + } + + pre { + max-width: 100%; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + font-size: 15px; + font-weight: $font-600; + @include monospaceFontFamily(15); + flex: 1 1; + margin: 0 $space-xs; + } +} diff --git a/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.tsx b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.tsx new file mode 100644 index 00000000..af23102f --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/RecentSearches.tsx @@ -0,0 +1,46 @@ +import React from 'react'; + +import { Text } from 'components/kit'; + +import { getItem } from 'utils/storage'; + +import RecentSearchItem from './RecentSearchItem'; + +import './RecentSearches.scss'; + +function RecentSearches(): React.FunctionComponentElement | null { + const [recentSearches, setRecentSearches] = React.useState< + { explorer: string; query: string }[] + >([]); + + React.useEffect(() => { + const recent = getItem('recentSearches'); + if (recent) { + setRecentSearches(JSON.parse(recent)); + } + }, []); + return recentSearches.length ? ( +
+ + Recent Searches + +
+ {recentSearches.map((item, index) => ( + + ))} +
+
+ ) : null; +} + +export default React.memo(RecentSearches); diff --git a/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/useRecentSearches.ts b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/useRecentSearches.ts new file mode 100644 index 00000000..56cfc9fe --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/RecentSearches/useRecentSearches.ts @@ -0,0 +1,5 @@ +function useRecentSearches() { + return null; +} + +export default useRecentSearches; diff --git a/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.d.ts b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.d.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.scss b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.scss new file mode 100644 index 00000000..1f3a5702 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.scss @@ -0,0 +1,19 @@ +@use 'src/styles/abstracts' as *; + +.TagsCard { + border-top: $border-dark-lighter; + padding: 1rem; + padding: $space-unit $space-sm; + &__title { + margin-bottom: $space-sm; + padding: 0 $space-sm; + } + .Badge { + border-radius: $border-radius-sm; + } + &__NavLink { + text-decoration: none; + display: block; + margin-top: $space-unit; + } +} diff --git a/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.tsx b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.tsx new file mode 100644 index 00000000..dc00ebee --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsCard.tsx @@ -0,0 +1,72 @@ +import React from 'react'; +import { NavLink } from 'react-router-dom'; + +import DataList from 'components/kit/DataList'; +import { Button, Text } from 'components/kit'; + +import CompareSelectedRunsPopover from 'pages/Metrics/components/Table/CompareSelectedRunsPopover'; + +import { AppNameEnum } from 'services/models/explorer'; + +import useTagsCard from './useTagsCard'; + +import './TagsCard.scss'; + +function TagsCard(): React.FunctionComponentElement | null { + const { + tableRef, + tableColumns, + tableData, + tagsStore, + selectedRows, + tagsQuery, + } = useTagsCard(); + + return ( +
+ + Tags {tagsStore?.data?.length ? `(${tagsStore?.data?.length})` : ''} + + {tagsStore?.data?.length ? ( + , + ]} + /> + ) : null} + + + +
+ ); +} + +TagsCard.displayName = 'TagsCard'; + +export default React.memo(TagsCard); diff --git a/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsStore.ts b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsStore.ts new file mode 100644 index 00000000..57e39ee4 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/TagsStore.ts @@ -0,0 +1,11 @@ +import createResource from 'modules/core/utils/createResource'; +import { fetchTagsList } from 'modules/core/api/tagsApi'; +import { ITagData } from 'modules/core/api/tagsApi/types'; + +function createTagsEngine() { + const { fetchData, state, destroy } = + createResource(fetchTagsList); + return { fetchTags: fetchData, tagsState: state, destroy }; +} + +export default createTagsEngine(); diff --git a/src/src/pages/Dashboard/components/ExploreSection/TagsCard/useTagsCard.tsx b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/useTagsCard.tsx new file mode 100644 index 00000000..bf0e6e36 --- /dev/null +++ b/src/src/pages/Dashboard/components/ExploreSection/TagsCard/useTagsCard.tsx @@ -0,0 +1,177 @@ +import React from 'react'; +import _ from 'lodash-es'; + +import { Checkbox } from '@material-ui/core'; + +import { Badge, Icon, Text } from 'components/kit'; + +import { IResourceState } from 'modules/core/utils/createResource'; +import { ITagData } from 'modules/core/api/tagsApi/types'; + +import createTagsEngine from './TagsStore'; + +function useTagsCard() { + const tableRef = React.useRef(null); + const [selectedRows, setSelectedRows] = React.useState([]); + const { current: tagsEngine } = React.useRef(createTagsEngine); + const tagsStore: IResourceState = tagsEngine.tagsState( + (state) => state, + ); + + React.useEffect(() => { + tagsEngine.fetchTags(); + return () => { + tagsEngine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // memoized table data + const tableData = React.useMemo(() => { + if (tagsStore.data) { + return tagsStore.data.map( + ({ name, archived, run_count, color }: ITagData) => { + return { + key: name, + name, + color, + archived, + run_count, + id: name, + }; + }, + ); + } + return []; + }, [tagsStore.data]); + + // on row selection + const onRowSelect = React.useCallback( + (rowKey?: string) => { + if (rowKey) { + const newSelectedRows = selectedRows.includes(rowKey) + ? selectedRows.filter((row: string) => row !== rowKey) + : [...selectedRows, rowKey]; + setSelectedRows(newSelectedRows); + } else if (selectedRows.length) { + setSelectedRows([]); + } else { + setSelectedRows(tableData.map(({ name }: any) => name)); + } + }, + [selectedRows, tableData], + ); + + // memoized table columns + const tableColumns = React.useMemo( + () => [ + { + dataKey: 'id', + key: 'id', + title: ( + } + className='selectCheckbox' + checkedIcon={ + tableData.length === Object.keys(selectedRows)?.length ? ( + + + + ) : ( + + + + ) + } + onClick={() => onRowSelect()} + checked={!!selectedRows.length} + /> + ), + width: '20px', + cellRenderer: ({ cellData }: any) => { + return ( + } + className='selectCheckbox' + checked={selectedRows.includes(cellData)} + checkedIcon={ + + + + } + onClick={() => onRowSelect(cellData)} + /> + ); + }, + }, + { + dataKey: 'name', + key: 'name', + title: ( + + Name + + ), + width: 'calc(100% - 50px)', + style: { paddingLeft: 10, paddingRight: 12 }, + cellRenderer: ({ cellData, rowData: { color } }: any) => ( + + ), + }, + { + dataKey: 'run_count', + key: 'run_count', + title: ( + + Runs + + ), + flexGrow: 1, + style: { textAlign: 'right' }, + width: '46px', + cellRenderer: ({ cellData }: any) => ( + + {cellData} + + ), + }, + ], + [tableData?.length, onRowSelect, selectedRows], + ); + + // Update the table data and columns when the tags data changes + React.useEffect(() => { + if (tableRef.current?.updateData) { + tableRef.current.updateData({ + newColumns: tableColumns, + newData: tableData, + }); + } + }, [tableData, tableColumns]); + + const tagsQuery = React.useMemo(() => { + return `any([t in [${_.uniq(selectedRows) + .map((val: string) => `"${val}"`) + .join(',')}] for t in run.tags])`; + }, [selectedRows]); + + return { + tableRef, + tableColumns, + tableData, + tagsStore, + selectedRows, + tagsQuery, + }; +} +export default useTagsCard; diff --git a/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.scss b/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.scss new file mode 100644 index 00000000..e5e9c7cc --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.scss @@ -0,0 +1,44 @@ +@use 'src/styles/abstracts' as *; + +.ProjectContributions { + margin: 1.75rem 0; + &__HeatMap { + display: flex; + overflow: hidden; + @media only screen and (max-width: 1452px) { + justify-content: flex-end; + } + } + &__Statistics__card { + background: linear-gradient(97.73deg, #8c32af 0%, #6bace5 100%); + opacity: 0.8; + border-radius: $border-radius-main; + width: 13.125em; + height: 80px; + color: $white; + position: relative; + span { + display: block; + } + + &:after { + content: url('../../../../../src/assets/experiments.svg'); + position: absolute; + right: 0; + top: 0; + opacity: 0.4; + } + + &:last-child { + margin-top: 6px; + background: linear-gradient(98.46deg, #1473e6 0%, #09c6f9 100%); + &:after { + content: url('../../../../../src/assets/runs.svg'); + } + } + } + + &__loader { + margin-top: 0.5rem; + } +} diff --git a/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.tsx b/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.tsx new file mode 100644 index 00000000..7bede888 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributions.tsx @@ -0,0 +1,48 @@ +import React from 'react'; + +import HeatMap from 'components/HeatMap/HeatMap'; +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import { trackEvent } from 'services/analytics'; + +import useProjectContributions from './useProjectContributions'; + +import './ProjectContributions.scss'; + +function ProjectContributions(): React.FunctionComponentElement { + const { projectContributionsStore } = useProjectContributions(); + function shiftDate(date: any, numDays: any) { + const newDate = new Date(date); + newDate.setDate(newDate.getDate() + numDays); + return newDate; + } + let today = new Date(); + return ( + +
+ + Contributions + +
+ { + trackEvent(ANALYTICS_EVENT_KEYS.dashboard.activityCellClick); + }} + data={Object.keys( + projectContributionsStore.data?.activity_map ?? {}, + ).map((k) => [ + new Date(k), + projectContributionsStore.data?.activity_map[k], + ])} + /> +
+
+
+ ); +} +export default React.memo(ProjectContributions); diff --git a/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributionsStore.ts b/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributionsStore.ts new file mode 100644 index 00000000..2a133c65 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectContributions/ProjectContributionsStore.ts @@ -0,0 +1,17 @@ +import { + getProjectContributions, + GetProjectContributionsResult, +} from 'modules/core/api/projectApi'; +import createResource from 'modules/core/utils/createResource'; + +function projectContributionsEngine() { + const { fetchData, state, destroy } = + createResource(getProjectContributions); + return { + fetchProjectContributions: fetchData, + projectContributionsState: state, + destroy, + }; +} + +export default projectContributionsEngine(); diff --git a/src/src/pages/Dashboard/components/ProjectContributions/useProjectContributions.tsx b/src/src/pages/Dashboard/components/ProjectContributions/useProjectContributions.tsx new file mode 100644 index 00000000..c13a19fb --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectContributions/useProjectContributions.tsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import { GetProjectContributionsResult } from 'modules/core/api/projectApi'; +import { IResourceState } from 'modules/core/utils/createResource'; + +import projectContributionsEngine from './ProjectContributionsStore'; + +function useProjectContributions() { + const { current: engine } = React.useRef(projectContributionsEngine); + const projectContributionsStore: IResourceState = + engine.projectContributionsState((state) => state); + + React.useEffect(() => { + if (!projectContributionsStore.data) { + engine.fetchProjectContributions(); + } + return () => { + engine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return { + projectContributionsStore, + }; +} + +export default useProjectContributions; diff --git a/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.d.ts b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.d.ts new file mode 100644 index 00000000..885275a4 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.d.ts @@ -0,0 +1,12 @@ +import * as React from 'react'; + +import { IconName } from 'components/kit/Icon'; + +export interface IProjectStatistic { + label: string; + count: number; + iconBgColor?: string; + icon?: IconName; + navLink?: string; + badge?: { value: string; style?: React.CSSProperties }; +} diff --git a/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.scss b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.scss new file mode 100644 index 00000000..5e98dce1 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.scss @@ -0,0 +1,20 @@ +@use 'src/styles/abstracts' as *; + +.ProjectStatistics { + &__totalRuns { + margin-top: $space-lg; + } + &__trackedSequences { + margin-top: $space-lg; + } + &__cards { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: $space-unit; + margin-top: $space-sm; + } + &__bar { + margin-top: $space-sm; + } +} diff --git a/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.tsx b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.tsx new file mode 100644 index 00000000..d2bf9177 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatistics.tsx @@ -0,0 +1,250 @@ +import * as React from 'react'; + +import { Text } from 'components/kit'; +import StatisticsCard from 'components/StatisticsCard'; +import StatisticsBar from 'components/StatisticsBar'; + +import routes from 'routes/routes'; + +import { SequenceTypesEnum } from 'types/core/enums'; + +import { encode } from 'utils/encoder/encoder'; + +import { IProjectStatistic, useProjectStatistics } from '.'; + +import './ProjectStatistics.scss'; + +const statisticsInitialMap: Record = { + [SequenceTypesEnum.Metric]: { + label: 'Metrics', + count: 0, + icon: 'metrics', + iconBgColor: '#7A4CE0', + navLink: routes.METRICS.path, + }, + systemMetrics: { + label: 'Sys. metrics', + count: 0, + icon: 'metrics', + iconBgColor: '#AF4EAB', + navLink: `${routes.METRICS.path}?select=${encode({ + advancedQuery: "metric.name.startswith('__system__') == True", + advancedMode: true, + })}`, + }, + [SequenceTypesEnum.Figures]: { + label: 'Figures', + icon: 'figures', + count: 0, + iconBgColor: '#18AB6D', + navLink: routes.FIGURES_EXPLORER.path, + }, + [SequenceTypesEnum.Images]: { + label: 'Images', + icon: 'images', + count: 0, + iconBgColor: '#F17922', + navLink: routes.IMAGE_EXPLORE.path, + }, + [SequenceTypesEnum.Audios]: { + label: 'Audios', + icon: 'audios', + count: 0, + iconBgColor: '#FCB500', + navLink: routes.AUDIOS_EXPLORER.path, + badge: { + value: 'New', + style: { backgroundColor: '#1473e6', color: '#fff' }, + }, + }, + [SequenceTypesEnum.Texts]: { + label: 'Texts', + icon: 'text', + count: 0, + iconBgColor: '#E149A0', + navLink: routes.TEXT_EXPLORER.path, + badge: { + value: 'New', + style: { backgroundColor: '#1473e6', color: '#fff' }, + }, + }, + [SequenceTypesEnum.Distributions]: { + label: 'Distributions', + icon: 'distributions', + count: 0, + iconBgColor: '#0394B4', + navLink: '', + badge: { + value: 'Explorer coming soon', + }, + }, +}; + +const runsCountingInitialMap: Record<'archived' | 'runs', IProjectStatistic> = { + runs: { + label: 'runs', + icon: 'runs', + count: 0, + iconBgColor: '#1473E6', + navLink: routes.RUNS.path, + }, + archived: { + label: 'archived', + icon: 'archive', + count: 0, + iconBgColor: '#606986', + navLink: `/runs?select=${encode({ query: 'run.archived == True' })}`, + }, +}; + +function ProjectStatistics() { + const [hoveredState, setHoveredState] = React.useState({ + source: '', + id: '', + }); + const { projectParamsStore, projectContributionsStore } = + useProjectStatistics(); + + const { statisticsMap, totalTrackedSequencesCount } = React.useMemo(() => { + const statistics = { ...statisticsInitialMap }; + let totalTrackedSequencesCount = 0; + + for (let [seqName, seqData] of Object.entries( + projectParamsStore.data || {}, + )) { + let systemMetricsCount = 0; + let sequenceItemsCount = 0; + for (let [itemKey, itemData] of Object.entries(seqData)) { + if (itemKey.startsWith('__system__')) { + systemMetricsCount += itemData.length; + } else { + sequenceItemsCount += itemData.length; + } + } + totalTrackedSequencesCount += sequenceItemsCount; + statistics[seqName].count = sequenceItemsCount; + if (systemMetricsCount) { + totalTrackedSequencesCount += systemMetricsCount; + statistics.systemMetrics.count = systemMetricsCount; + } + } + return { statisticsMap: statistics, totalTrackedSequencesCount }; + }, [projectParamsStore]); + + const { totalRunsCount, archivedRuns } = React.useMemo( + () => ({ + totalRunsCount: projectContributionsStore.data?.num_runs || 0, + archivedRuns: projectContributionsStore.data?.num_archived_runs || 0, + }), + [projectContributionsStore], + ); + const statisticsBarData = React.useMemo( + () => + Object.values(statisticsMap).map( + ({ label, iconBgColor = '#000', count }) => ({ + highlighted: hoveredState.id === label, + label, + color: iconBgColor, + percent: + totalTrackedSequencesCount === 0 + ? 0 + : (count / totalTrackedSequencesCount) * 100, + }), + ), + [statisticsMap, totalTrackedSequencesCount, hoveredState], + ); + const runsCountingMap = React.useMemo( + () => ({ + runs: { + ...runsCountingInitialMap.runs, + count: totalRunsCount - archivedRuns, + }, + archived: { + ...runsCountingInitialMap.archived, + count: archivedRuns, + }, + }), + [archivedRuns, totalRunsCount], + ); + const onMouseOver = React.useCallback((id = '', source = '') => { + setHoveredState({ source, id }); + }, []); + const onMouseLeave = React.useCallback(() => { + setHoveredState({ source: '', id: '' }); + }, []); + return ( +
+ + Total runs: {totalRunsCount} + +
+ {Object.values(runsCountingMap).map( + ({ label, icon, count, iconBgColor, navLink }) => ( + + ), + )} +
+ + Tracked sequences + +
+ {Object.values(statisticsMap).map( + ({ label, icon, count, iconBgColor, navLink, badge }) => ( + + ), + )} +
+
+ +
+
+ ); +} + +ProjectStatistics.displayName = 'ProjectStatistics'; + +export default React.memo(ProjectStatistics); diff --git a/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatisticsStore.ts b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatisticsStore.ts new file mode 100644 index 00000000..a9cca3a1 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectStatistics/ProjectStatisticsStore.ts @@ -0,0 +1,23 @@ +import createResource from 'modules/core/utils/createResource'; +import { getParams, GetParamsResult } from 'modules/core/api/projectApi'; + +import { SequenceTypesEnum } from 'types/core/enums'; + +function projectStatisticsEngine() { + const { fetchData, state, destroy } = createResource(() => + getParams({ + sequence: [ + SequenceTypesEnum.Metric, + SequenceTypesEnum.Images, + SequenceTypesEnum.Figures, + SequenceTypesEnum.Texts, + SequenceTypesEnum.Audios, + SequenceTypesEnum.Distributions, + ], + exclude_params: true, + }), + ); + return { fetchProjectParams: fetchData, projectParamsState: state, destroy }; +} + +export default projectStatisticsEngine(); diff --git a/src/src/pages/Dashboard/components/ProjectStatistics/index.tsx b/src/src/pages/Dashboard/components/ProjectStatistics/index.tsx new file mode 100644 index 00000000..8b236988 --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectStatistics/index.tsx @@ -0,0 +1,7 @@ +import ProjectStatistics from './ProjectStatistics'; +import useProjectStatistics from './useProjectStatistics'; + +export * from './ProjectStatistics.d'; +export { useProjectStatistics }; + +export default ProjectStatistics; diff --git a/src/src/pages/Dashboard/components/ProjectStatistics/useProjectStatistics.tsx b/src/src/pages/Dashboard/components/ProjectStatistics/useProjectStatistics.tsx new file mode 100644 index 00000000..57b602bc --- /dev/null +++ b/src/src/pages/Dashboard/components/ProjectStatistics/useProjectStatistics.tsx @@ -0,0 +1,31 @@ +import * as React from 'react'; + +import projectContributionsEngine from '../ProjectContributions/ProjectContributionsStore'; + +import projectStatisticsEngine from './ProjectStatisticsStore'; + +function useProjectStatistics() { + const { current: projectStatsEngine } = React.useRef(projectStatisticsEngine); + const projectParamsStore = projectStatsEngine.projectParamsState( + (state) => state, + ); + const { current: contributionsEngine } = React.useRef( + projectContributionsEngine, + ); + const projectContributionsStore = + contributionsEngine.projectContributionsState((state) => state); + + React.useEffect(() => { + if (!projectParamsStore.data) { + projectStatsEngine.fetchProjectParams(); + } + return () => { + projectStatsEngine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [projectStatsEngine]); + + return { projectParamsStore, projectContributionsStore }; +} + +export default useProjectStatistics; diff --git a/src/src/pages/Dashboard/components/QuickStart/QuickStart.scss b/src/src/pages/Dashboard/components/QuickStart/QuickStart.scss new file mode 100644 index 00000000..65dec975 --- /dev/null +++ b/src/src/pages/Dashboard/components/QuickStart/QuickStart.scss @@ -0,0 +1,14 @@ +@use 'src/styles/abstracts' as *; + +.QuickStart__section { + padding: $space-lg 0; +} + +.QuickStart__section__title { + margin-bottom: $space-sm; +} + +.QuickStart__section__text { + font-style: italic; + margin-top: $space-sm; +} diff --git a/src/src/pages/Dashboard/components/QuickStart/QuickStart.tsx b/src/src/pages/Dashboard/components/QuickStart/QuickStart.tsx new file mode 100644 index 00000000..4608789d --- /dev/null +++ b/src/src/pages/Dashboard/components/QuickStart/QuickStart.tsx @@ -0,0 +1,74 @@ +import * as React from 'react'; + +import { Link } from '@material-ui/core'; + +import { Text } from 'components/kit'; +import CodeBlock from 'components/CodeBlock/CodeBlock'; + +import { DOCUMENTATIONS } from 'config/references'; + +import './QuickStart.scss'; + +function QuickStart() { + return ( +
+ + Quick Start + +
+ + Integrate Aim with your code + + + + See the full list of supported trackable objects(e.g. images, text, + etc){' '} + + here + + . + +
+
+ ); +} + +export default QuickStart; diff --git a/src/src/pages/Dashboard/components/QuickStart/index.ts b/src/src/pages/Dashboard/components/QuickStart/index.ts new file mode 100644 index 00000000..a9701cfe --- /dev/null +++ b/src/src/pages/Dashboard/components/QuickStart/index.ts @@ -0,0 +1,3 @@ +import QuickStart from './QuickStart'; + +export default QuickStart; diff --git a/src/src/pages/Experiment/Experiment.scss b/src/src/pages/Experiment/Experiment.scss new file mode 100644 index 00000000..19449e09 --- /dev/null +++ b/src/src/pages/Experiment/Experiment.scss @@ -0,0 +1,109 @@ +@use 'src/styles/abstracts' as *; + +.Experiment { + height: 100%; + background: $cuddle-10; + &__tabsContainer { + background: $white; + box-shadow: 0 toRem(4px) toRem(6px) rgba(144, 175, 218, 0.2), + 0 1px 0 0 $cuddle-20; + border-top: $border-grey-lighter; + position: relative; + z-index: 1; + &__tabs { + .MuiTabs-fixed { + overflow: auto !important; + } + .MuiTabs-scroller { + --ms-overflow-style: none; + --scrollbar-width: none; + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } + } + .MuiTabs-indicator { + display: none; + } + } + .PrivateTabIndicator-root-1 { + display: none; + } + .MuiTabs-root { + height: toRem(40px); + min-height: auto; + } + .MuiTabs-flexContainer { + .MuiTab-textColorPrimary { + color: $pico-80; + font-size: $text-md; + font-weight: $font-500; + text-transform: unset; + min-height: toRem(40px); + transition: all 0.18s ease-out; + &:hover { + color: $pico; + background-color: $cuddle-30; + } + .MuiTab-wrapper { + line-height: 1.05; + } + &.MuiTab-root { + padding: 0.625rem $space-unit; + min-width: auto !important; + border-right: 1px solid transparent; + text-transform: capitalize; + } + &.Mui-selected { + color: $pico; + position: relative; + &::before { + content: ''; + width: 100%; + height: toRem(3px); + background: $primary-color; + position: absolute; + left: 0; + bottom: 0; + transition: all 3s; + } + } + } + } + .PrivateTabIndicator-root-5 { + display: none; + } + &.MuiPaper-rounded { + border-radius: unset; + } + } + &__tabPanelBox { + overflow-y: auto; + height: calc(100vh - 112px); + &__suspenseLoaderContainer { + width: 100%; + display: flex; + justify-content: center; + height: 100%; + align-items: center; + } + } + &__tabPanel { + .MuiBox-root { + height: 100%; + .RunDetailTabLoader { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + } + } + &.overviewPanel { + position: relative; + overflow: hidden; + .RunOverviewTab { + padding: 0 $space-unit; + } + } + } +} diff --git a/src/src/pages/Experiment/Experiment.tsx b/src/src/pages/Experiment/Experiment.tsx new file mode 100644 index 00000000..9c9fb38e --- /dev/null +++ b/src/src/pages/Experiment/Experiment.tsx @@ -0,0 +1,249 @@ +import React, { LazyExoticComponent } from 'react'; +import { + Route, + Switch, + useHistory, + useLocation, + useParams, + useRouteMatch, +} from 'react-router-dom'; +import { Link } from 'react-router-dom'; + +import { Paper, Tab, Tabs } from '@material-ui/core'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import BusyLoaderWrapper from 'components/BusyLoaderWrapper/BusyLoaderWrapper'; +import NotificationContainer, { + useNotificationContainer, +} from 'components/NotificationContainer'; +import { Spinner } from 'components/kit'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { setDocumentTitle } from 'utils/document/documentTitle'; + +import ExperimentHeader from './components/ExperimentHeader'; +import useExperimentState from './useExperimentState'; + +import './Experiment.scss'; + +const ExperimentOverviewTab = React.lazy( + () => + import( + /* webpackChunkName: "ExperimentOverviewTab" */ './components/ExperimentOverviewTab' + ), +); + +const ExperimentRunsTab = React.lazy( + () => + import( + /* webpackChunkName: "ExperimentOverviewTab" */ './components/ExperimentRunsTab' + ), +); + +const ExperimentNotesTab = React.lazy( + () => + import( + /* webpackChunkName: "ExperimentOverviewTab" */ './components/ExperimentNotesTab' + ), +); + +const ExperimentSettingsTab = React.lazy( + () => + import( + /* webpackChunkName: "ExperimentOverviewTab" */ './components/ExperimentSettingsTab' + ), +); + +const tabs: Record = { + overview: 'Overview', + runs: 'Runs', + notes: 'Notes', + settings: 'Settings', +}; + +function Experiment(): React.FunctionComponentElement { + const { experimentId } = useParams<{ experimentId: string }>(); + const history = useHistory(); + const { url } = useRouteMatch(); + const { pathname } = useLocation(); + const [activeTab, setActiveTab] = React.useState(pathname); + const { + experimentState, + experimentsState, + getExperimentsData, + updateExperiment, + } = useExperimentState(experimentId); + const { notificationState, onNotificationDelete } = + useNotificationContainer(); + + const { data: experimentData, loading: isExperimentLoading } = + experimentState; + + const { data: experimentsData, loading: isExperimentsLoading } = + experimentsState; + + const tabContent: Record< + string, + { props: Record; Component: LazyExoticComponent } + > = { + overview: { + props: { + experimentName: experimentData?.name ?? '', + experimentId, + description: experimentData?.description ?? '', + }, + Component: ExperimentOverviewTab, + }, + runs: { + props: { + experimentName: experimentData?.name ?? '', + experimentId, + }, + Component: ExperimentRunsTab, + }, + notes: { + props: { + experimentId, + }, + Component: ExperimentNotesTab, + }, + settings: { + props: { + experimentName: experimentData?.name ?? '', + updateExperiment, + description: experimentData?.description ?? '', + }, + Component: ExperimentSettingsTab, + }, + }; + + function handleTabChange(event: React.ChangeEvent<{}>, newValue: string) { + setActiveTab(newValue); + } + + function redirect(): void { + const splitPathname: string[] = pathname.split('/'); + const path: string = `${url}/overview`; + if (splitPathname.length > 4) { + history.replace(path); + setActiveTab(path); + return; + } + if (splitPathname[3]) { + if (!Object.keys(tabs).includes(splitPathname[3])) { + history.replace(path); + } + } else { + history.replace(path); + } + setActiveTab(path); + } + + function getCurrentTabValue(pathname: string, url: string) { + const values = Object.keys(tabs).map((tabKey) => `${url}/${tabKey}`); + return values.indexOf(pathname) === -1 ? false : pathname; + } + + React.useEffect(() => { + if (pathname !== activeTab) { + setActiveTab(pathname); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [pathname]); + + React.useEffect(() => { + setDocumentTitle(experimentData?.name || experimentId, true); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [experimentData]); + + React.useEffect(() => { + redirect(); + analytics.pageView(ANALYTICS_EVENT_KEYS.experiment.pageView); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + +
+ + + + {Object.keys(tabs).map((tabKey: string) => ( + + ))} + + + + + {Object.keys(tabs).map((tabKey: string) => { + const { Component, props } = tabContent[tabKey]; + return ( + + + {tabKey === 'overview' ? ( +
+ + +
+ } + > + + + + ) : ( +
+
+ + +
+ } + > + + +
+ + )} +
+
+ ); + })} +
+
+
+ +
+ ); +} +export default React.memo(Experiment); diff --git a/src/src/pages/Experiment/ExperimentStore.ts b/src/src/pages/Experiment/ExperimentStore.ts new file mode 100644 index 00000000..42bcf8fd --- /dev/null +++ b/src/src/pages/Experiment/ExperimentStore.ts @@ -0,0 +1,64 @@ +import { notificationContainerStore } from 'components/NotificationContainer'; + +import { + getExperimentById, + getExperiments, + updateExperimentById, + IExperimentData, +} from 'modules/core/api/experimentsApi'; +import createResource from 'modules/core/utils/createResource'; + +import * as analytics from 'services/analytics'; + +function experimentEngine() { + const { + fetchData: fetchExperimentData, + state: experimentState, + destroy: destroyExperiment, + } = createResource(getExperimentById); + const { + fetchData: fetchExperimentsData, + state: experimentsState, + destroy: destroyExperiments, + } = createResource(getExperiments); + + function updateExperiment(name: string, description: string) { + const experimentData = experimentState.getState().data; + updateExperimentById( + { name, description, archived: experimentData?.archived }, + experimentData?.id || '', + ) + .then(() => { + experimentState.setState((prev: any) => ({ + data: { ...prev.data, name, description }, + })); + notificationContainerStore.onNotificationAdd({ + id: Date.now(), + messages: ['Changes successfully saved'], + severity: 'success', + }); + analytics.trackEvent( + '[Experiment] Edit Experiment name and description', + ); + }) + .catch((err) => { + notificationContainerStore.onNotificationAdd({ + id: Date.now(), + messages: [err.message || 'Something went wrong'], + severity: 'error', + }); + }); + } + + return { + fetchExperimentData, + experimentState, + destroyExperiment, + fetchExperimentsData, + experimentsState, + destroyExperiments, + updateExperiment, + }; +} + +export default experimentEngine(); diff --git a/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.d.ts b/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.d.ts new file mode 100644 index 00000000..af88ddb5 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.d.ts @@ -0,0 +1,10 @@ +import { IExperimentData } from 'modules/core/api/experimentsApi/types'; + +export interface IExperimentHeaderProps { + isExperimentLoading: boolean; + experimentData: IExperimentData | null; + isExperimentsLoading: boolean; + experimentsData: IExperimentData[] | null; + experimentId: string; + getExperimentsData: () => void; +} diff --git a/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.scss b/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.scss new file mode 100644 index 00000000..d202fc4f --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.scss @@ -0,0 +1,100 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentHeader { + &__headerContainer { + height: 4.375rem; + background: $white; + display: flex; + align-items: center; + &__appBarBox { + display: flex; + padding-top: $space-unit; + justify-content: space-between; + &__navigationContainer { + max-width: 50%; + width: 50%; + } + &__actionContainer { + width: 4.5rem; + display: flex; + justify-content: center; + align-items: center; + border-left: $border-main; + margin-bottom: $space-unit; + i { + color: $pico-70; + } + a { + text-decoration: unset; + } + } + } + &__appBarTitleBox { + display: flex; + flex-direction: column; + font-size: $text-md; + font-weight: $font-600; + color: $text-color; + align-items: flex-start; + height: fit-content; + max-width: 100%; + width: auto; + &__appBarTitleBoxWrapper { + display: flex; + width: 100%; + } + &__title { + margin-bottom: $space-xxs; + } + &__date { + display: flex; + i { + margin-right: $space-xxs; + color: $pico-70; + } + } + &__Skeleton { + margin-right: $space-xs; + } + &__buttonSelectToggler { + width: 1.5rem; + height: 1.5rem; + top: -$space-xxxxs; + &.opened { + background: $primary-color-10; + } + .MuiButton-label { + padding-top: $space-xxxxs; + } + } + &__container { + display: flex; + align-items: flex-start; + flex-direction: column; + margin-right: $space-xxxs; + cursor: pointer; + max-width: calc(100% - 6.5rem); + + &__pageName { + margin-right: 0.4375em; + text-transform: capitalize; + text-decoration: none; + } + &__runHash { + margin-left: 0.4375em; + text-transform: lowercase; + } + } + span { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 100%; + } + } + .StatusLabel { + margin-left: $space-xs; + } + } +} diff --git a/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.tsx b/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.tsx new file mode 100644 index 00000000..59cd4f6d --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentHeader/ExperimentHeader.tsx @@ -0,0 +1,134 @@ +import React from 'react'; +import classNames from 'classnames'; +import { NavLink, useRouteMatch } from 'react-router-dom'; +import moment from 'moment'; + +import { Skeleton } from '@material-ui/lab'; +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon, Text } from 'components/kit'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { DATE_WITH_SECONDS } from 'config/dates/dates'; + +import ExperimentNavigationPopover from '../ExperimentNavigationPopover'; + +import { IExperimentHeaderProps } from '.'; + +import './ExperimentHeader.scss'; + +function ExperimentHeader({ + isExperimentLoading, + experimentData, + isExperimentsLoading, + experimentsData, + experimentId, + getExperimentsData, +}: IExperimentHeaderProps): React.FunctionComponentElement { + const { url } = useRouteMatch(); + + return ( + +
+
+
+ ( +
+ {!isExperimentLoading ? ( + <> +
+ +
+ + {`${experimentData?.name || 'default'}`} + +
+
+ + +
+ + ) : ( +
+ + +
+ )} +
+ )} + component={ + + } + /> +
+ {!isExperimentLoading ? ( + <> + + + {`${moment( + (experimentData?.creation_time || 0) * 1000, + ).format(DATE_WITH_SECONDS)}`} + + + ) : ( + + )} +
+
+
+ + + +
+
+
+
+ ); +} +export default ExperimentHeader; diff --git a/src/src/pages/Experiment/components/ExperimentHeader/index.ts b/src/src/pages/Experiment/components/ExperimentHeader/index.ts new file mode 100644 index 00000000..f4b50871 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentHeader/index.ts @@ -0,0 +1,4 @@ +import ExperimentHeader from './ExperimentHeader'; + +export * from './ExperimentHeader.d'; +export default ExperimentHeader; diff --git a/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.d.ts b/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.d.ts new file mode 100644 index 00000000..53c3cda2 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.d.ts @@ -0,0 +1,8 @@ +import { IExperimentData } from 'modules/core/api/experimentsApi/types'; + +export interface IExperimentNavigationPopoverProps { + experimentsData: IExperimentData[] | null; + experimentId: string; + isExperimentsLoading: boolean; + getExperimentsData: () => void; +} diff --git a/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.scss b/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.scss new file mode 100644 index 00000000..f1876222 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.scss @@ -0,0 +1,116 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentNavigationPopover { + height: 20rem; + width: 28rem; + &__contentContainer { + height: calc(100% - 2.25rem); + display: flex; + &__experimentsListContainer { + background: $white; + width: 100%; + height: 100%; + position: relative; + padding: $space-xxs $space-xs 0 $space-xs; + &::before { + content: ''; + position: absolute; + background: linear-gradient( + 180deg, + rgba(248, 250, 253, 0) 0%, + #f8fafd 75.52% + ); + height: $space-xs; + width: 100%; + bottom: 0; + left: 0; + z-index: 1; + } + &__experimentList { + overflow-y: auto; + height: 100%; + .experimentBox { + position: relative; + width: 100%; + text-decoration: none; + height: auto; + padding: $space-xs; + display: flex; + align-items: flex-start; + cursor: pointer; + text-decoration: unset; + margin-bottom: $space-xxxxs; + position: relative; + flex-direction: column; + border-radius: 0.25rem; + + &:hover { + background: $cuddle-20; + } + &__experimentName { + width: 100%; + word-break: break-all; + margin-bottom: 0.375rem; + @include monospaceFontFamily(); + } + &__date { + display: flex; + align-items: center; + @include monospaceFontFamily(14); + i { + margin-right: $space-xxs; + } + } + &.selected { + background: $primary-color-10; + &:hover { + border-radius: 0.3125rem 0 0 0.3125rem; + } + } + &:last-child { + margin-bottom: 0; + } + } + } + } + } + &__headerContainer { + background: $primary-color-5; + width: 100%; + height: 2.25rem; + display: flex; + border-bottom: $border-main; + i { + transform: rotate(90deg); + align-items: center; + display: flex; + } + &__titleContainer { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + &:first-child { + border-right: $border-main; + } + } + } + + &__loaderContainer { + height: 100%; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + } + .MuiPaper-root { + width: 37.5rem; + background: $white; + border: $border-main; + box-sizing: border-box; + box-shadow: 0 0.25rem 0.375rem rgba(144, 175, 218, 0.2); + border-radius: 0.3125rem 0.3125rem 0 0; + height: 20rem; + } +} diff --git a/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.tsx b/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.tsx new file mode 100644 index 00000000..0000174a --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNavigationPopover/ExperimentNavigationPopover.tsx @@ -0,0 +1,92 @@ +import React from 'react'; +import classNames from 'classnames'; +import moment from 'moment'; +import { NavLink, useLocation } from 'react-router-dom'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { Icon, Spinner, Text } from 'components/kit'; + +import { DATE_WITH_SECONDS } from 'config/dates/dates'; + +import { IExperimentNavigationPopoverProps } from '.'; + +import './ExperimentNavigationPopover.scss'; + +function ExperimentNavigationPopover({ + experimentsData, + experimentId, + isExperimentsLoading, + getExperimentsData, +}: IExperimentNavigationPopoverProps): React.FunctionComponentElement { + const { pathname } = useLocation(); + + React.useEffect(() => { + if (!experimentsData) { + getExperimentsData(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + +
+
+
+ + Experiments + +
+
+
+
+
+ {!isExperimentsLoading ? ( + experimentsData?.map((experiment) => ( + + + {experiment?.name ?? 'default'} + +
+ + + {`${moment(experiment.creation_time * 1000).format( + DATE_WITH_SECONDS, + )}`} + +
+
+ )) + ) : ( +
+ +
+ )} +
+
+
+
+
+ ); +} +export default ExperimentNavigationPopover; diff --git a/src/src/pages/Experiment/components/ExperimentNavigationPopover/index.ts b/src/src/pages/Experiment/components/ExperimentNavigationPopover/index.ts new file mode 100644 index 00000000..002308eb --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNavigationPopover/index.ts @@ -0,0 +1,4 @@ +import ExperimentNavigationPopover from './ExperimentNavigationPopover'; + +export * from './ExperimentNavigationPopover.d'; +export default ExperimentNavigationPopover; diff --git a/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesEngine.ts b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesEngine.ts new file mode 100644 index 00000000..4b95e83f --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesEngine.ts @@ -0,0 +1,68 @@ +import { notificationContainerStore } from 'components/NotificationContainer'; + +import { + createExperimentNote, + getExperimentNote, + GetExperimentNoteResult, + updateExperimentNote, +} from 'modules/core/api/experimentsApi'; +import createResource from 'modules/core/utils/createResource'; + +function createExperimentNotesEngine() { + const { fetchData, state, destroy } = createResource( + (experimentId: string) => getExperimentNote(experimentId), + ); + + return { + fetchExperimentNote: (experimentId: string) => fetchData(experimentId), + createExperimentNote: (experimentId: string, content: string) => + createExperimentNote(experimentId, { content }) + .then((res) => { + state.setState((prev: any) => ({ + ...prev, + data: [{ content, ...res }], + })); + notificationContainerStore.onNotificationAdd({ + id: Date.now(), + messages: ['Note successfully created'], + severity: 'success', + }); + }) + .catch((err) => + notificationContainerStore.onNotificationAdd({ + id: Date.now(), + messages: [err.message || 'Something went wrong'], + severity: 'error', + }), + ), + updateExperimentNote: ( + experimentId: string, + noteId: string, + content: string, + ) => { + return updateExperimentNote(experimentId, noteId, { content }) + .then((res) => { + state.setState((prev: any) => ({ + ...prev, + data: [{ ...prev.data[0], updated_at: res.updated_at }], + })); + notificationContainerStore.onNotificationAdd({ + id: Date.now(), + messages: ['Note successfully updated'], + severity: 'success', + }); + }) + .catch((err) => { + notificationContainerStore.onNotificationAdd({ + id: Date.now(), + messages: [err.message || 'Something went wrong'], + severity: 'error', + }); + }); + }, + experimentNoteState: state, + destroy, + }; +} + +export default createExperimentNotesEngine(); diff --git a/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.d.ts b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.d.ts new file mode 100644 index 00000000..b70a08fd --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.d.ts @@ -0,0 +1,3 @@ +export interface IExperimentNotesTabProps { + experimentId: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.scss b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.scss new file mode 100644 index 00000000..3ca937e9 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.scss @@ -0,0 +1,136 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentNotesTab { + .isLoading { + .ProseMirror { + opacity: 0; + } + } + padding: 1.5rem 0; + height: 100%; + &__Editor { + height: 100%; + position: relative; + &__actionPanel { + display: flex; + background-color: $cuddle-20; + justify-content: space-between; + padding: $space-xs $space-lg; + border-radius: $border-radius-lg $border-radius-lg 0 0; + border: $border-grey; + &__info { + display: flex; + align-items: center; + &-field { + display: flex; + align-items: center; + i { + margin-right: $space-sm; + } + &:first-child { + margin-right: $space-unit; + } + } + } + &__saveBtn { + &.Mui-disabled { + color: $white !important; + } + } + } + &__container { + justify-content: start !important; + height: calc(100% - 44px); + & > div:first-child { + height: 100%; + border-radius: 0 0 $border-radius-lg $border-radius-lg; + border: $border-grey; + border-top: 0; + } + } + .ProseMirror { + font-size: $text-lg; + padding: $space-unit 2rem; + padding-left: toRem(48px); + font-family: 'Inter', sans-serif; + font-weight: $font-500; + height: 100%; + opacity: 1; + color: $pico; + transition: opacity 0.18s ease-out; + overflow: auto; + .block-menu-trigger { + margin-left: toRem(-27px); + &:hover { + color: $pico-80; + } + } + code { + font-size: 100%; + } + input { + background-color: unset; + } + a { + color: $denim; + } + &-selectednode { + outline: $border-main-active !important; + } + hr { + &::before { + border-top: 0.0625rem solid #bdcee8; + } + } + .page-break { + &::before { + border-top: 0.0625rem dashed #bdcee8; + } + } + .heading-actions { + display: none; + } + h1, + h2, + h3, + h4 { + &::before { + content: unset !important; + display: none !important; + } + } + mark { + background-color: $mark-color; + color: $pico; + } + h1 { + font-size: $text-xxxl; + } + } + } + &__spinnerWrapper { + position: absolute; + height: 100%; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + top: 0; + left: 0; + } +} +#block-menu-container { + box-shadow: 0 0.25rem 0.375rem rgb(144 175 218 / 20%); + border: 0.0625rem solid #e8f1fc; + svg { + fill: $pico-80; + } +} + +#notes-toolbar-popover { + box-shadow: 0 0.25rem 0.375rem rgb(144 175 218 / 20%); + border: $border-grey-light; + &::before { + content: unset !important; + } +} diff --git a/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.tsx b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.tsx new file mode 100644 index 00000000..1f13495a --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNotesTab/ExperimentNotesTab.tsx @@ -0,0 +1,147 @@ +import React from 'react'; +import moment from 'moment'; +import Editor from 'rich-markdown-editor'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import { Button, Icon, Spinner, Text } from 'components/kit'; +import RouteLeavingGuard from 'components/RouteLeavingGuard'; + +import { YEAR_MONTH_DAY_DATE_FORMAT } from 'config/dates/dates'; +import { RichEditorThemeColors } from 'config/colors/colors'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import NoteTooltip from 'pages/RunDetail/RunDetailNotesTab/NoteTooltip'; + +import * as analytics from 'services/analytics'; + +import useExperimentNotes from './useExperimentNotes'; + +import { IExperimentNotesTabProps } from '.'; + +import './ExperimentNotesTab.scss'; + +function ExperimentNotesTab( + props: IExperimentNotesTabProps, +): React.FunctionComponentElement { + const { isLoading, noteData, onNoteCreate, onNoteUpdate } = + useExperimentNotes(props.experimentId)!; + const [value, setValue] = React.useState(''); + const [saveDisabled, setSaveDisabled] = React.useState(true); + const [theme, setTheme] = React.useState(null); + const editorRef = React.useRef(null); + + React.useEffect(() => { + if (editorRef.current) { + setValue(noteData?.id ? noteData?.content : ''); + setTheme({ + ...editorRef.current?.theme(), + ...RichEditorThemeColors, + }); + } + }, [noteData]); + + // CRUD handlers + const onNoteSave = React.useCallback((): void => { + setSaveDisabled(true); + if (noteData?.id) { + onNoteUpdate({ + content: editorRef.current.value(), + }).catch(() => setSaveDisabled(false)); + } else { + onNoteCreate({ + content: editorRef.current.value(), + }).catch(() => setSaveDisabled(false)); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [noteData?.id, props.experimentId]); + + const onNoteChange = React.useCallback( + (currentVal: () => string): void => { + const isSaveDisabled: boolean = value === currentVal(); + if (saveDisabled !== isSaveDisabled) { + setSaveDisabled(isSaveDisabled); + } + }, + [saveDisabled, value], + ); + + React.useEffect(() => { + analytics.pageView(ANALYTICS_EVENT_KEYS.experiment.tabs.notes.tabView); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( +
+ +
+
+
+ {noteData?.created_at && ( + +
+ + + {`${moment + .utc(noteData?.created_at) + .local() + .format(YEAR_MONTH_DAY_DATE_FORMAT)}`} + +
+
+ )} + {noteData?.updated_at && ( + +
+ + + {`${moment + .utc(noteData?.updated_at) + .local() + .format(YEAR_MONTH_DAY_DATE_FORMAT)}`} + +
+
+ )} +
+ +
+ +
+
+
+ { + return {children}; + }} + onChange={onNoteChange} + /> + {isLoading && ( +
+ +
+ )} +
+
+ ); +} +export default React.memo(ExperimentNotesTab); diff --git a/src/src/pages/Experiment/components/ExperimentNotesTab/index.ts b/src/src/pages/Experiment/components/ExperimentNotesTab/index.ts new file mode 100644 index 00000000..4de4e8b5 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNotesTab/index.ts @@ -0,0 +1,8 @@ +import ExperimentNotesTab from './ExperimentNotesTab'; +import experimentNotesEngine from './ExperimentNotesEngine'; + +export { experimentNotesEngine }; + +export * from './ExperimentNotesTab.d'; + +export default ExperimentNotesTab; diff --git a/src/src/pages/Experiment/components/ExperimentNotesTab/useExperimentNotes.tsx b/src/src/pages/Experiment/components/ExperimentNotesTab/useExperimentNotes.tsx new file mode 100644 index 00000000..00e687af --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentNotesTab/useExperimentNotes.tsx @@ -0,0 +1,44 @@ +import React from 'react'; + +import experimentNotesEngine from './ExperimentNotesEngine'; + +function useExperimentNotes(experimentId: string) { + const { current: engine } = React.useRef(experimentNotesEngine); + + const experimentNoteState = engine.experimentNoteState((state) => state); + React.useEffect(() => { + if (!experimentNoteState?.data?.[0]) { + engine.fetchExperimentNote(experimentId); + } + if (experimentNoteState?.data) { + engine.destroy(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [experimentId]); + + React.useEffect(() => { + return () => engine.destroy(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + function onNoteCreate(note: { content: string }) { + return engine.createExperimentNote(experimentId, note.content); + } + + function onNoteUpdate(note: { content: string }) { + return engine.updateExperimentNote( + experimentId, + `${experimentNoteState?.data?.[0]?.id}`, + note.content, + ); + } + + return { + noteData: experimentNoteState?.data?.[0], + isLoading: experimentNoteState.loading, + onNoteCreate, + onNoteUpdate, + }; +} + +export default useExperimentNotes; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.d.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.d.ts new file mode 100644 index 00000000..ceebed1a --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.d.ts @@ -0,0 +1,4 @@ +export interface IExperimentContributionsProps { + experimentId: string; + experimentName: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.scss b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.scss new file mode 100644 index 00000000..32cc2460 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.scss @@ -0,0 +1,48 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentContributions { + margin: 1.75rem 0; + &__HeatMap { + display: flex; + overflow: hidden; + @media only screen and (max-width: 1212px) { + justify-content: flex-end; + } + } + &__Statistics__card { + background: linear-gradient(97.73deg, #8c32af 0%, #6bace5 100%); + opacity: 0.8; + border-radius: $border-radius-main; + width: 13.125em; + height: toRem(80px); + color: $white; + position: relative; + span { + display: block; + } + + &:after { + content: url('../../../../../../src/assets/experiments.svg'); + position: absolute; + right: 0; + top: 0; + opacity: 0.4; + } + + &:last-child { + margin-top: $space-xxs; + background: linear-gradient(98.46deg, #1473e6 0%, #09c6f9 100%); + &:after { + content: url('../../../../../../src/assets/runs.svg'); + } + } + } + + &__loader { + margin-top: $space-xs; + } + + h2 { + margin-bottom: $space-unit; + } +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.tsx new file mode 100644 index 00000000..432240ea --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributions.tsx @@ -0,0 +1,58 @@ +import React from 'react'; + +import HeatMap from 'components/HeatMap/HeatMap'; +import { Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import { trackEvent } from 'services/analytics'; + +import useExperimentContributions from './useExperimentContributions'; + +import { IExperimentContributionsProps } from '.'; + +import './ExperimentContributions.scss'; + +function ExperimentContributions({ + experimentId, + experimentName, +}: IExperimentContributionsProps): React.FunctionComponentElement { + const { experimentContributionsState } = + useExperimentContributions(experimentId); + + function shiftDate(date: any, numDays: any) { + const newDate = new Date(date); + newDate.setDate(newDate.getDate() + numDays); + return newDate; + } + + let today = new Date(); + + return ( + +
+ + Contributions + +
+ { + trackEvent(ANALYTICS_EVENT_KEYS.dashboard.activityCellClick); + }} + additionalQuery={` and run.experiment == "${experimentName}"`} + data={Object.keys( + experimentContributionsState.data?.activity_map ?? {}, + ).map((k) => [ + new Date(k), + experimentContributionsState.data?.activity_map[k], + ])} + /> +
+
+
+ ); +} +export default React.memo(ExperimentContributions); diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributionsStore.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributionsStore.ts new file mode 100644 index 00000000..a5e7fd81 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/ExperimentContributionsStore.ts @@ -0,0 +1,20 @@ +import { + GetExperimentContributionsResult, + getExperimentContributions, +} from 'modules/core/api/experimentsApi'; +import createResource from 'modules/core/utils/createResource'; + +function experimentContributionsEngine() { + const { fetchData, state, destroy } = + createResource( + getExperimentContributions, + ); + return { + fetchExperimentContributions: (experimentId: string) => + fetchData(experimentId), + experimentContributionsState: state, + destroy, + }; +} + +export default experimentContributionsEngine(); diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/index.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/index.ts new file mode 100644 index 00000000..fce0a473 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/index.ts @@ -0,0 +1,8 @@ +import ExperimentContributions from './ExperimentContributions'; +import experimentContributionsEngine from './ExperimentContributionsStore'; + +export * from './ExperimentContributions.d'; + +export { experimentContributionsEngine }; + +export default ExperimentContributions; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/useExperimentContributions.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/useExperimentContributions.tsx new file mode 100644 index 00000000..0c672136 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions/useExperimentContributions.tsx @@ -0,0 +1,32 @@ +import React from 'react'; + +import { GetExperimentContributionsResult } from 'modules/core/api/experimentsApi'; +import { IResourceState } from 'modules/core/utils/createResource'; + +import experimentContributionsEngine from './ExperimentContributionsStore'; + +function useExperimentContributions(experimentId: string) { + const { current: engine } = React.useRef(experimentContributionsEngine); + const experimentContributionsState: IResourceState = + engine.experimentContributionsState((state) => state); + + React.useEffect(() => { + if (!experimentContributionsState.data) { + engine.fetchExperimentContributions(experimentId); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [experimentContributionsState.data]); + + React.useEffect(() => { + return () => { + engine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return { + experimentContributionsState, + }; +} + +export default useExperimentContributions; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.d.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.d.ts new file mode 100644 index 00000000..733dede2 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.d.ts @@ -0,0 +1,4 @@ +export interface IExperimentContributionsFeedProps { + experimentName: string; + experimentId: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.tsx new file mode 100644 index 00000000..00094154 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeed.tsx @@ -0,0 +1,17 @@ +import React from 'react'; + +import ContributionsFeed from 'components/ContributionsFeed'; + +import useExperimentContributionsFeed from './useExperimentContributionsFeed'; + +import { IExperimentContributionsFeedProps } from '.'; + +function ExperimentContributionsFeed({ + experimentId, + experimentName, +}: IExperimentContributionsFeedProps): React.FunctionComponentElement | null { + const props = useExperimentContributionsFeed(experimentId, experimentName); + return ; +} + +export default React.memo(ExperimentContributionsFeed); diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeedStore.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeedStore.ts new file mode 100644 index 00000000..7844e25e --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/ExperimentContributionsFeedStore.ts @@ -0,0 +1,26 @@ +import { + createSearchExperimentRunsRequest, + ExperimentRun, +} from 'modules/core/api/experimentsApi'; +import createResource from 'modules/core/utils/createResource'; + +import { RequestOptions } from 'services/NetworkService'; + +function createExperimentContributionsFeedEngine() { + let { call } = createSearchExperimentRunsRequest(); + + const { fetchData, state, destroy } = createResource( + async (experimentId: string, queryParams: RequestOptions['query_params']) => + await call(experimentId, queryParams), + ); + return { + fetchExperimentContributionsFeed: ( + experimentId: string, + queryParams: RequestOptions['query_params'], + ) => fetchData({ experimentId, queryParams }), + experimentContributionsFeedState: state, + destroy, + }; +} + +export default createExperimentContributionsFeedEngine(); diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/index.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/index.ts new file mode 100644 index 00000000..a67a3a40 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/index.ts @@ -0,0 +1,9 @@ +import ExperimentContributionsFeed from './ExperimentContributionsFeed'; +import experimentContributionsFeedEngine from './ExperimentContributionsFeedStore'; +import useExperimentContributionsFeed from './useExperimentContributionsFeed'; + +export * from './ExperimentContributionsFeed.d'; + +export { experimentContributionsFeedEngine, useExperimentContributionsFeed }; + +export default ExperimentContributionsFeed; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/useExperimentContributionsFeed.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/useExperimentContributionsFeed.tsx new file mode 100644 index 00000000..05dde410 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentContributionsFeed/useExperimentContributionsFeed.tsx @@ -0,0 +1,125 @@ +import React from 'react'; +import moment from 'moment'; +import _ from 'lodash-es'; + +import { + TIMELINE_DAY_FORMAT, + TIMELINE_MONTH_FORMAT, + TIMELINE_TIME_FORMAT, +} from 'config/dates/dates'; + +import { IResourceState } from 'modules/core/utils/createResource'; +import { ExperimentRun } from 'modules/core/api/experimentsApi'; + +import experimentContributionsEngine from '../ExperimentContributions/ExperimentContributionsStore'; + +import experimentContributionsFeedEngine from './ExperimentContributionsFeedStore'; + +function useExperimentContributionsFeed( + experimentId: string, + experimentName: string, +) { + const [data, setData] = React.useState([]); + const { current: engine } = React.useRef(experimentContributionsFeedEngine); + const contributionsFeedStore: IResourceState = + engine.experimentContributionsFeedState((state) => state); + + const { current: contributionsEngine } = React.useRef( + experimentContributionsEngine, + ); + const experimentContributionsState = + contributionsEngine.experimentContributionsState((state) => state); + + React.useEffect(() => { + if (_.isEmpty(contributionsFeedStore.data)) { + engine.fetchExperimentContributionsFeed(experimentId, { + limit: 25, + }); + } + return () => engine.destroy(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useEffect(() => { + if (contributionsFeedStore.data?.length) { + let newData = [...data, ...contributionsFeedStore.data]; + setData(newData); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [contributionsFeedStore.data]); + + const memoizedData = React.useMemo(() => { + // get existing month list from the contributionsFeedStore data + const feedData: { [key: string]: any } = {}; + if (data.length) { + const monthList = data?.reduce( + (acc: { [key: string]: any }, run: ExperimentRun) => { + const month = moment(run.creation_time * 1000).format( + TIMELINE_MONTH_FORMAT, + ); + if (!acc.includes(month) && !run.archived) { + acc.push(month); + } + return acc; + }, + [], + ); + // create a list of objects with month and contributions + + monthList.forEach((month: string) => { + feedData[month] = {}; + }); + + // add contributions to the month list + data?.forEach((run: ExperimentRun) => { + if (!run.archived) { + // get the month + const month = moment(run.creation_time * 1000).format( + TIMELINE_MONTH_FORMAT, + ); + + // get the day of the month + const day = moment(run.creation_time * 1000).format( + TIMELINE_DAY_FORMAT, + ); + + // create a contribution object + const contribution = { + name: run.name, + date: moment(run.creation_time * 1000).format(TIMELINE_TIME_FORMAT), + hash: run.run_id, + creation_time: run.creation_time, + experiment: experimentName, + experimentId: experimentId, + }; + if (feedData[month]?.[day]?.length) { + feedData[month][day].push(contribution); + } else { + feedData[month][day] = [contribution]; + } + } + }); + } + return feedData; + }, [data, experimentName, experimentId]); + + function loadMore(): void { + if (contributionsFeedStore.data && !contributionsFeedStore.loading) { + engine.fetchExperimentContributionsFeed(experimentId, { + limit: 25, + offset: data[data.length - 1].run_id, + }); + } + } + + return { + isLoading: contributionsFeedStore.loading, + data: memoizedData, + totalRunsCount: experimentContributionsState.data?.num_runs, + archivedRunsCount: experimentContributionsState.data?.num_archived_runs, + fetchedCount: data.length, + loadMore, + }; +} + +export default useExperimentContributionsFeed; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.d.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.d.ts new file mode 100644 index 00000000..29565105 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.d.ts @@ -0,0 +1,9 @@ +import React from 'react'; + +export interface IExperimentOverviewSidebarProps { + sidebarRef: HTMLElement | any; + overviewSectionRef: React.RefObject; + setContainerHeight: (height: number | string) => void; + overviewSectionContentRef: any; + description: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.scss b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.scss new file mode 100644 index 00000000..554693c5 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.scss @@ -0,0 +1,88 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentOverviewSidebar { + width: $run-overview-sidebar-width; + min-width: $run-overview-sidebar-width; + overflow-y: auto; + overflow-x: hidden; + padding: $space-xs; + padding: $space-unit * 2 $space-xs $space-xs; + position: sticky; + top: 0; + h3 { + margin-bottom: $space-sm; + } + &__wrapper { + height: -moz-fit-content; + height: fit-content; + } + &__section { + margin: 0 $space-unit $space-lg; + &__descriptionBox { + padding-top: $space-md; + &__header { + display: flex; + justify-content: space-between; + a { + text-decoration: unset; + } + i { + color: $pico-50; + } + h3 { + margin-top: $space-xxxs; + } + } + &__description { + display: flex; + max-height: 4.5rem; + overflow: hidden; + position: relative; + word-break: break-all; + flex-direction: column; + .dots { + background: $cuddle-10; + position: absolute; + bottom: 0; + right: 0; + height: 0.775rem; + display: flex; + justify-content: center; + align-items: center; + width: 4.5rem; + display: flex; + justify-content: flex-end; + padding-right: $space-xxxs; + cursor: pointer; + } + &.showAll { + max-height: 100%; + } + &.hasMore { + &:after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + height: toRem(10px); + width: 100%; + z-index: 1; + } + } + } + &__seeMoreButtonBox { + width: 100%; + justify-content: flex-start; + align-items: center; + display: flex; + padding-top: $space-xxxxs; + .Text { + cursor: pointer; + &:hover { + text-decoration: underline; + } + } + } + } + } +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.tsx new file mode 100644 index 00000000..e6385fab --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/ExperimentOverviewSidebar.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import classNames from 'classnames'; +import { NavLink, useRouteMatch } from 'react-router-dom'; + +import { Text, Button, Icon } from 'components/kit'; + +import { IExperimentOverviewSidebarProps } from '.'; + +import './ExperimentOverviewSidebar.scss'; + +const CLOSED_DESCRIPTION_BOX_MAX_HEIGHT = 72; +const SIDEBAR_TOP_SPACE = 40; + +function ExperimentOverviewSidebar({ + sidebarRef, + overviewSectionRef, + setContainerHeight, + overviewSectionContentRef, + description, +}: IExperimentOverviewSidebarProps): React.FunctionComponentElement { + const { url } = useRouteMatch(); + const descriptionBoxRef = React.useRef(null); + const [seeMoreDescription, setSeeMoreDescription] = + React.useState(false); + const [descriptionHeight, setDescriptionHeight] = React.useState(0); + + function onContainerScroll(e: any) { + overviewSectionRef?.current?.scrollTo(0, e.target.scrollTop); + } + + function onSeeMoreButtonClick() { + setSeeMoreDescription(!seeMoreDescription); + } + + React.useEffect(() => { + setDescriptionHeight(descriptionBoxRef?.current?.offsetHeight); + }, [descriptionBoxRef?.current?.offsetHeight, seeMoreDescription]); + + React.useEffect(() => { + if ( + overviewSectionContentRef?.current?.offsetHeight > + sidebarRef?.current?.childNodes[0].offsetHeight + ) { + setContainerHeight('100%'); + } else { + setContainerHeight( + sidebarRef?.current?.childNodes[0].offsetHeight + SIDEBAR_TOP_SPACE, + ); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [descriptionHeight]); + + return ( +
+
+
+
+ + Description + + + + +
+ +
= CLOSED_DESCRIPTION_BOX_MAX_HEIGHT && + !seeMoreDescription, + }, + )} + ref={descriptionBoxRef} + > + {description || 'No description'} +
+ {descriptionHeight >= CLOSED_DESCRIPTION_BOX_MAX_HEIGHT && ( +
+ + {seeMoreDescription ? 'See less' : 'See more'} + +
+ )} +
+
+
+ ); +} +export default ExperimentOverviewSidebar; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/index.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/index.ts new file mode 100644 index 00000000..be99de25 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewSidebar/index.ts @@ -0,0 +1,5 @@ +import ExperimentOverviewSidebar from './ExperimentOverviewSidebar'; + +export * from './ExperimentOverviewSidebar.d'; + +export default ExperimentOverviewSidebar; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.d.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.d.ts new file mode 100644 index 00000000..69dca48e --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.d.ts @@ -0,0 +1,5 @@ +export interface IExperimentOverviewTabProps { + experimentName: string; + experimentId: string; + description: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.scss b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.scss new file mode 100644 index 00000000..1800de45 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.scss @@ -0,0 +1,33 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentOverviewTab { + display: flex; + height: 100%; + justify-content: center; + overflow-y: auto; + padding: 0 $space-unit; + &__content { + flex: 1 100%; + max-width: calc( + #{$container-max-width-without-paddings} - #{$run-overview-sidebar-width} + ); + height: 100%; + &__section { + margin: $space-lg 0; + background: $white; + padding: $space-lg; + border: $border-grey; + border-radius: $border-radius-lg; + display: inline-block; + width: 100%; + } + } +} + +@media screen and (max-width: 1500px) { + .ExperimentOverviewTab { + &__content { + max-width: calc(100% - #{$run-overview-sidebar-width}); + } + } +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.tsx new file mode 100644 index 00000000..a332be16 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentOverviewTab.tsx @@ -0,0 +1,67 @@ +import React from 'react'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import ExperimentContributions from './ExperimentContributions'; +import ExperimentOverviewSidebar from './ExperimentOverviewSidebar'; +import ExperimentStatistics from './ExperimentStatistics'; +import ExperimentContributionsFeed from './ExperimentContributionsFeed'; + +import { IExperimentOverviewTabProps } from '.'; + +import './ExperimentOverviewTab.scss'; + +function ExperimentOverviewTab( + props: IExperimentOverviewTabProps, +): React.FunctionComponentElement { + const sidebarRef = React.useRef(null); + const overviewSectionRef = React.useRef(null); + const overviewSectionContentRef = React.useRef(null); + const [containerHeight, setContainerHeight] = React.useState( + 0, + ); + + React.useEffect(() => { + analytics.pageView(ANALYTICS_EVENT_KEYS.experiment.tabs.overview.tabView); + }, []); + + function onContainerScroll(e: any) { + sidebarRef?.current?.scrollTo(0, e.target.scrollTop); + } + + return ( +
+
+
+ + + +
+
+ +
+ ); +} +export default ExperimentOverviewTab; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.d.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.d.ts new file mode 100644 index 00000000..6e63a4a0 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.d.ts @@ -0,0 +1,3 @@ +export interface IExperimentStatisticsProps { + experimentName: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.scss b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.scss new file mode 100644 index 00000000..3d85f8b2 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.scss @@ -0,0 +1,17 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentStatistics { + &__trackedSequences { + margin-top: $space-lg; + } + &__cards { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: $space-unit; + margin-top: $space-sm; + } + &__bar { + margin-top: $space-sm; + } +} diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.tsx b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.tsx new file mode 100644 index 00000000..a2f1f725 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/ExperimentStatistics.tsx @@ -0,0 +1,191 @@ +import * as React from 'react'; + +import { Text } from 'components/kit'; +import StatisticsCard from 'components/StatisticsCard'; +import StatisticsBar from 'components/StatisticsBar'; + +import { IProjectStatistic } from 'pages/Dashboard/components/ProjectStatistics'; + +import { encode } from 'utils/encoder/encoder'; + +import experimentContributionsEngine from '../ExperimentContributions/ExperimentContributionsStore'; + +import { IExperimentStatisticsProps } from '.'; + +import './ExperimentStatistics.scss'; + +function ExperimentStatistics({ experimentName }: IExperimentStatisticsProps) { + const [hoveredState, setHoveredState] = React.useState({ + source: '', + id: '', + }); + const { current: expContributionsEngine } = React.useRef( + experimentContributionsEngine, + ); + + const contributionsState = + expContributionsEngine.experimentContributionsState((state) => state); + + const { totalRunsCount, archivedRuns } = React.useMemo( + () => ({ + totalRunsCount: contributionsState.data?.num_runs || 0, + archivedRuns: contributionsState.data?.num_archived_runs || 0, + }), + [contributionsState], + ); + + const runsCountingMap: Record<'archived' | 'runs', IProjectStatistic> = + React.useMemo( + () => ({ + runs: { + label: 'runs', + icon: 'runs', + count: totalRunsCount - archivedRuns, + iconBgColor: '#1473E6', + navLink: `/runs?select=${encode({ + query: `run.experiment == '${experimentName}'`, + })}`, + }, + archived: { + label: 'archived', + icon: 'archive', + count: archivedRuns, + iconBgColor: '#606986', + navLink: `/runs?select=${encode({ + query: `run.archived == True and run.experiment == '${experimentName}'`, + })}`, + }, + }), + [totalRunsCount, archivedRuns, experimentName], + ); + + const statisticsMap: Record = React.useMemo( + () => ({ + active: { + label: 'Active', + count: contributionsState.data?.num_active_runs || 0, + icon: 'runs', + iconBgColor: '#18AB6D', + navLink: `/runs?select=${encode({ + query: `run.active == True and run.experiment == '${experimentName}'`, + })}`, + }, + // @TODO implement failed runs + // failed: { + // label: 'Failed', + // count: 0, + // icon: 'runs', + // iconBgColor: '#e64e48', + // navLink: `/runs?select=${encode({ + // query: `run.failed == True and run.experiment == '${experimentName}'`, + // })}`, + // }, + finished: { + label: 'Finished', + icon: 'runs', + count: totalRunsCount - (contributionsState.data?.num_active_runs || 0), + iconBgColor: '#83899e', + navLink: `/runs?select=${encode({ + query: `run.active == False and run.experiment == '${experimentName}'`, + })}`, + }, + }), + [contributionsState, experimentName, totalRunsCount], + ); + + const statisticsBarData = React.useMemo( + () => + Object.values(statisticsMap).map( + ({ label, iconBgColor = '#000', count }) => ({ + highlighted: hoveredState.id === label, + label, + color: iconBgColor, + percent: totalRunsCount === 0 ? 0 : (count / totalRunsCount) * 100, + }), + ), + [statisticsMap, totalRunsCount, hoveredState], + ); + + const onMouseOver = React.useCallback((id = '', source = '') => { + setHoveredState({ source, id }); + }, []); + + const onMouseLeave = React.useCallback(() => { + setHoveredState({ source: '', id: '' }); + }, []); + + return ( +
+ + Total runs: {totalRunsCount} + +
+ {Object.values(runsCountingMap).map( + ({ label, icon, count, iconBgColor, navLink }) => ( + + ), + )} +
+ + Runs status + +
+ {Object.values(statisticsMap).map( + ({ label, icon, count, iconBgColor, navLink }) => ( + + ), + )} +
+
+ +
+
+ ); +} + +ExperimentStatistics.displayName = 'ExperimentStatistics'; + +export default React.memo(ExperimentStatistics); diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/index.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/index.ts new file mode 100644 index 00000000..9ef9fdb0 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/ExperimentStatistics/index.ts @@ -0,0 +1,5 @@ +import ExperimentStatistics from './ExperimentStatistics'; + +export * from './ExperimentStatistics.d'; + +export default ExperimentStatistics; diff --git a/src/src/pages/Experiment/components/ExperimentOverviewTab/index.ts b/src/src/pages/Experiment/components/ExperimentOverviewTab/index.ts new file mode 100644 index 00000000..d9b9cca3 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentOverviewTab/index.ts @@ -0,0 +1,5 @@ +import ExperimentOverviewTab from './ExperimentOverviewTab'; + +export * from './ExperimentOverviewTab.d'; + +export default ExperimentOverviewTab; diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsStore.ts b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsStore.ts new file mode 100644 index 00000000..8be246b7 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsStore.ts @@ -0,0 +1,25 @@ +import { createSearchRunRequest } from 'modules/core/api/runsApi'; +import createResource from 'modules/core/utils/createResource'; + +import { RequestOptions } from 'services/NetworkService'; + +import { IRun } from 'types/services/models/metrics/runModel'; + +import { parseStream } from 'utils/encoder/streamEncoding'; + +function createExperimentRunsEngine() { + const { call } = createSearchRunRequest(); + + const { fetchData, state, destroy } = createResource[]>( + async (queryParams: RequestOptions['query_params']) => + parseStream(await call(queryParams)), + ); + return { + fetchExperimentRuns: (queryParams: RequestOptions['query_params']) => + fetchData(queryParams), + experimentRunsState: state, + destroy, + }; +} + +export default createExperimentRunsEngine(); diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.d.ts b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.d.ts new file mode 100644 index 00000000..ac27d26d --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.d.ts @@ -0,0 +1,4 @@ +export interface IExperimentRunsTabProps { + experimentName: string; + experimentId: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.scss b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.scss new file mode 100644 index 00000000..d337917a --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.scss @@ -0,0 +1,15 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentRunsTab { + width: 100%; + height: 100%; + padding: $space-lg 0; + &__content { + height: 100%; + background: $white; + padding: $space-lg; + border: $border-grey; + border-radius: $border-radius-lg; + width: 100%; + } +} diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.tsx b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.tsx new file mode 100644 index 00000000..beaa6b2d --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTab.tsx @@ -0,0 +1,29 @@ +import React, { memo } from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import ExperimentRunsTable from './ExperimentRunsTable'; + +import { IExperimentRunsTabProps } from '.'; + +import './ExperimentRunsTab.scss'; + +function ExperimentRunsTab({ + experimentName, + experimentId, +}: IExperimentRunsTabProps): React.FunctionComponentElement { + return ( + +
+
+ +
+
+
+ ); +} + +export default memo(ExperimentRunsTab); diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.d.ts b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.d.ts new file mode 100644 index 00000000..52f76f2f --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.d.ts @@ -0,0 +1,4 @@ +export interface IExperimentRunsTableProps { + experimentName: string; + experimentId: string; +} diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.scss b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.scss new file mode 100644 index 00000000..83e54cc2 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.scss @@ -0,0 +1,48 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentRunsTable { + height: 100%; + position: relative; + &__header { + display: flex; + align-items: center; + justify-content: space-between; + height: toRem(28px); + &__titleBox { + display: flex; + align-items: center; + &__title { + margin-right: $space-xxxs; + } + } + .CompareSelectedRunsPopover__trigger { + margin-right: 0 !important; + } + } + &__table { + height: calc(100% - 34px); + margin-top: $space-xxs; + border: $border-grey; + border-top: none; + width: 100%; + &--loading { + display: flex; + align-items: center; + justify-content: center; + } + &--empty { + border: none; + } + } +} + +.Infinite_Loader { + position: absolute; + width: 100%; + height: 100px; + bottom: 0; + display: flex; + justify-content: center; + align-items: center; + background-color: rgba(255, 255, 255, 0.3); +} diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.tsx b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.tsx new file mode 100644 index 00000000..c35cd5a2 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/ExperimentRunsTable.tsx @@ -0,0 +1,117 @@ +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import { Skeleton } from '@material-ui/lab'; + +import { Spinner, Text } from 'components/kit'; +import Table from 'components/Table/Table'; + +import { RowHeightSize } from 'config/table/tableConfigs'; + +import CompareSelectedRunsPopover from 'pages/Metrics/components/Table/CompareSelectedRunsPopover'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { IExperimentRunsTableProps, useExperimentRunsTable } from '.'; + +import './ExperimentRunsTable.scss'; + +function ExperimentRunsTable({ + experimentName, + experimentId, +}: IExperimentRunsTableProps) { + const { + tableRef, + tableColumns, + tableData, + loading, + selectedRows, + comparisonQuery, + onRowSelect, + loadMore, + isInfiniteLoading, + totalRunsCount, + } = useExperimentRunsTable(experimentName, experimentId); + + return ( +
+
+
+ + {_.isEmpty(selectedRows) + ? 'Experiment Runs' + : `Selected Runs (${Object.values(selectedRows).length})`} + + {_.isEmpty(selectedRows) ? ( + loading ? ( + + ) : ( + + {!_.isEmpty(tableData) + ? ` (${tableData?.length}/${totalRunsCount})` + : '(0)'} + + ) + ) : null} +
+ {tableData?.length > 0 ? ( +
+ +
+ ) : null} +
+
+ {_.isEmpty(tableData) && loading ? ( + + ) : ( +
+ )} + {isInfiniteLoading && ( +
+ +
+ )} + + + ); +} +export default ExperimentRunsTable; diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/index.ts b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/index.ts new file mode 100644 index 00000000..a72f052d --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/index.ts @@ -0,0 +1,6 @@ +import ExperimentRunsTable from './ExperimentRunsTable'; +import useExperimentRunsTable from './useExperimentRunsTable'; + +export { useExperimentRunsTable }; +export * from './ExperimentRunsTable.d'; +export default ExperimentRunsTable; diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/useExperimentRunsTable.tsx b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/useExperimentRunsTable.tsx new file mode 100644 index 00000000..d1fa1817 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/ExperimentRunsTable/useExperimentRunsTable.tsx @@ -0,0 +1,308 @@ +import React from 'react'; +import moment from 'moment'; +import _ from 'lodash-es'; + +import { Badge } from 'components/kit'; +import RunNameColumn from 'components/Table/RunNameColumn'; + +import { TABLE_DATE_FORMAT } from 'config/dates/dates'; + +import { IResourceState } from 'modules/core/utils/createResource'; + +import { experimentContributionsEngine } from 'pages/Experiment/components/ExperimentOverviewTab/ExperimentContributions'; + +import { IRun } from 'types/services/models/metrics/runModel'; + +import { getMetricHash } from 'utils/app/getMetricHash'; +import contextToString from 'utils/contextToString'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { formatValue } from 'utils/formatValue'; +import { processDurationTime } from 'utils/processDurationTime'; +import { decode, encode } from 'utils/encoder/encoder'; + +import experimentRunsEngine from '../ExperimentRunsStore'; + +function useExperimentRunsTable(experimentName: string, experimentId: string) { + const tableRef = React.useRef(null); + const dataRef = React.useRef(null); + const [data, setData] = React.useState([]); + const [isInfiniteLoading, setIsInfiniteLoading] = + React.useState(false); + const { current: engine } = React.useRef(experimentRunsEngine); + const { current: expContributionsEngine } = React.useRef( + experimentContributionsEngine, + ); + const contributionsState = + expContributionsEngine.experimentContributionsState((state) => state); + const experimentRunsState: IResourceState[]> = + engine.experimentRunsState((state) => state); + const [selectedRows, setSelectedRows] = React.useState< + Record + >({}); + const [comparisonQuery, setComparisonQuery] = React.useState(''); + + React.useEffect(() => { + if (_.isEmpty(experimentRunsState.data)) { + engine.fetchExperimentRuns({ + limit: 50, + exclude_params: true, + q: `run.experiment == '${experimentName}'`, + }); + } + return () => { + engine.destroy(); + expContributionsEngine.destroy(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useEffect(() => { + if (_.isEmpty(contributionsState.data)) { + expContributionsEngine.fetchExperimentContributions(experimentId); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [contributionsState.data]); + + React.useEffect(() => { + if (experimentRunsState.data) { + engine.destroy(); + } + if (contributionsState.data) { + expContributionsEngine.destroy(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [experimentId]); + + React.useEffect(() => { + if (experimentRunsState.data?.length) { + let newData = [...data, ...experimentRunsState.data]; + setData(newData); + dataRef.current = newData; + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [experimentRunsState.data]); + + const metricsColumns = React.useMemo(() => { + if (data) { + const metrics: any = []; + const systemMetrics: any = []; + const metricsValues: any = {}; + data.forEach(({ hash, traces }: IRun) => { + traces.metric.forEach((trace: any) => { + const metricHash = getMetricHash(trace.name, trace.context as any); + + if (metricsValues.hasOwnProperty(metricHash)) { + metricsValues[metricHash][hash] = [ + trace.values.last_step, + trace.values.last, + ]; + } else { + metricsValues[metricHash] = { + [hash]: [trace.values.last_step, trace.values.last], + }; + + const metricContext = contextToString( + trace.context as Record, + ) as string; + + const isSystem = isSystemMetric(trace.name); + const col = { + key: metricHash, + content: ( + + ), + topHeader: isSystem + ? formatSystemMetricName(trace.name) + : trace.name, + name: trace.name, + context: metricContext, + isSystem, + }; + + if (isSystem) { + systemMetrics.push(col); + } else { + metrics.push(col); + } + } + }); + }); + + return { + columns: _.orderBy(metrics, ['name', 'context'], ['asc', 'asc']).concat( + _.orderBy(systemMetrics, ['name', 'context'], ['asc', 'asc']), + ) as any, + values: metricsValues, + }; + } + + return { + columns: [], + values: [], + }; + }, [data]); + + // memoized table data + const tableData = React.useMemo(() => { + if (data) { + return data.map(({ props, hash }: IRun, index: number) => { + const key = encode({ + hash, + }); + let row: any = { + key, + selectKey: key, + index, + run: { + content: ( + + ), + }, + date: moment(props.creation_time * 1000).format(TABLE_DATE_FORMAT), + duration: processDurationTime( + props.creation_time * 1000, + props.end_time ? props.end_time * 1000 : Date.now(), + ), + }; + + metricsColumns.columns.forEach((col: any) => { + const [step, value] = metricsColumns.values[col.key][hash] ?? [ + null, + null, + ]; + row[col.key] = { + content: + step === null + ? '--' + : col.isSystem + ? formatValue(value) + : `step: ${step ?? '-'} / value: ${formatValue(value)}`, + }; + }); + return row; + }); + } + return []; + }, [data, metricsColumns]); + + // memoized table columns + const tableColumns = React.useMemo(() => { + const columns = [ + { + key: 'run', + content: Name, + topHeader: 'Run', + pin: 'left', + }, + { + key: 'date', + content: Date, + topHeader: 'Run', + }, + { + key: 'duration', + content: Duration, + topHeader: 'Run', + }, + ]; + return columns.concat(metricsColumns.columns); + }, [metricsColumns]); + + function loadMore(): void { + if (experimentRunsState.data && !experimentRunsState.loading) { + setIsInfiniteLoading(true); + engine + .fetchExperimentRuns({ + limit: 50, + exclude_params: true, + offset: dataRef.current[dataRef.current.length - 1]?.hash, + q: `run.experiment == '${experimentName}'`, + }) + .finally(() => setIsInfiniteLoading(false)); + } + } + + // Handler for row selection + const onRowSelect = React.useCallback( + ({ actionType, data }) => { + let selected: Record = { ...selectedRows }; + switch (actionType) { + case 'single': + if (selectedRows[data.key]) { + selected = _.omit(selectedRows, data.key); + } else { + selected[data.key] = true; + } + break; + case 'selectAll': + if (Array.isArray(data)) { + data.forEach((item: any) => { + if (!selectedRows[item.key]) { + selected[item.key] = true; + } + }); + } else { + Object.values(data) + .reduce((acc: any[], value: any) => { + return acc.concat(value.items); + }, []) + .forEach((item: any) => { + if (!selectedRows[item.selectKey]) { + selected[item.selectKey] = true; + } + }); + } + break; + case 'removeAll': + if (Array.isArray(data)) { + selected = {}; + } + break; + } + + setSelectedRows(selected); + + setComparisonQuery( + `run.hash in [${Object.keys(selected) + .map((key) => `"${JSON.parse(decode(key)).hash}"`) + .join(', ')}] and run.experiment == "${experimentName}"`, + ); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [selectedRows, tableData], + ); + + React.useEffect(() => { + tableRef.current?.updateData({ + newData: tableData, + newColumns: tableColumns, + }); + }, [tableData, tableColumns]); + + return { + data, + tableData, + tableColumns, + tableRef, + loading: experimentRunsState.loading, + isInfiniteLoading, + selectedRows, + comparisonQuery, + onRowSelect, + loadMore, + totalRunsCount: + (contributionsState?.data?.num_runs ?? 0) - + (contributionsState?.data?.num_archived_runs ?? 0), + }; +} + +export default useExperimentRunsTable; diff --git a/src/src/pages/Experiment/components/ExperimentRunsTab/index.ts b/src/src/pages/Experiment/components/ExperimentRunsTab/index.ts new file mode 100644 index 00000000..61a1fc5d --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentRunsTab/index.ts @@ -0,0 +1,6 @@ +import ExperimentRunsTab from './ExperimentRunsTab'; +import experimentRunsEngine from './ExperimentRunsStore'; + +export { experimentRunsEngine }; +export * from './ExperimentRunsTab.d'; +export default ExperimentRunsTab; diff --git a/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.d.ts b/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.d.ts new file mode 100644 index 00000000..e4d2f900 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.d.ts @@ -0,0 +1,5 @@ +export interface IExperimentSettingsTabProps { + experimentName: string; + description: string; + updateExperiment: (name: string, description: string) => void; +} diff --git a/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.scss b/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.scss new file mode 100644 index 00000000..b558b8d5 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.scss @@ -0,0 +1,8 @@ +@use 'src/styles/abstracts' as *; + +.ExperimentSettingsTab { + padding: $space-lg 0; + &__actionCardsCnt { + margin: 0 toRem(164px); + } +} diff --git a/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.tsx b/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.tsx new file mode 100644 index 00000000..2fd3b8cc --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentSettingsTab/ExperimentSettingsTab.tsx @@ -0,0 +1,43 @@ +import React, { memo } from 'react'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import NameAndDescriptionCard from 'components/NameAndDescriptionCard'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IExperimentSettingsTabProps } from '.'; + +import './ExperimentSettingsTab.scss'; + +function ExperimentSettingsTab({ + experimentName, + description, + updateExperiment, +}: IExperimentSettingsTabProps): React.FunctionComponentElement { + React.useEffect(() => { + analytics.pageView(ANALYTICS_EVENT_KEYS.experiment.tabs.settings.tabView); + }, []); + + function onSave(name: string, description: string) { + updateExperiment(name, description); + } + + return ( + +
+
+ +
+
+
+ ); +} + +export default memo(ExperimentSettingsTab); diff --git a/src/src/pages/Experiment/components/ExperimentSettingsTab/index.ts b/src/src/pages/Experiment/components/ExperimentSettingsTab/index.ts new file mode 100644 index 00000000..a0a6d843 --- /dev/null +++ b/src/src/pages/Experiment/components/ExperimentSettingsTab/index.ts @@ -0,0 +1,5 @@ +import ExperimentSettingsTab from './ExperimentSettingsTab'; + +export * from './ExperimentSettingsTab.d'; + +export default ExperimentSettingsTab; diff --git a/src/src/pages/Experiment/useExperimentState.tsx b/src/src/pages/Experiment/useExperimentState.tsx new file mode 100644 index 00000000..b3931e8f --- /dev/null +++ b/src/src/pages/Experiment/useExperimentState.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +import { IResourceState } from 'modules/core/utils/createResource'; +import { IExperimentData } from 'modules/core/api/experimentsApi'; + +import experimentEngine from './ExperimentStore'; + +function useExperimentState(experimentId: string) { + const { current: engine } = React.useRef(experimentEngine); + const experimentState: IResourceState = + engine.experimentState((state) => state); + const experimentsState: IResourceState = + engine.experimentsState((state) => state); + + React.useEffect(() => { + return () => { + engine.destroyExperiment(); + engine.destroyExperiments(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useEffect(() => { + engine.fetchExperimentData(experimentId as any); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [experimentId]); + + return { + experimentState, + experimentsState, + getExperimentsData: engine.fetchExperimentsData, + updateExperiment: engine.updateExperiment, + }; +} + +export default useExperimentState; diff --git a/src/src/pages/FiguresExplorer/config.ts b/src/src/pages/FiguresExplorer/config.ts new file mode 100644 index 00000000..84362dcd --- /dev/null +++ b/src/src/pages/FiguresExplorer/config.ts @@ -0,0 +1,43 @@ +import produce from 'immer'; + +import { getDefaultHydration } from 'modules/BaseExplorer'; +import { GroupType, Order } from 'modules/core/pipeline'; +import { defaultHydration } from 'modules/BaseExplorer/getDefaultHydration'; +import { CaptionProperties } from 'modules/BaseExplorer/components/Controls'; + +import getFiguresExplorerStaticContent from './getStaticContent'; + +export const getFiguresDefaultConfig = (): typeof defaultHydration => { + const defaultConfig = getDefaultHydration(); + + const groupings = produce(defaultConfig.groupings, (draft: any) => { + draft[GroupType.COLUMN].defaultApplications.orders = [Order.ASC, Order.ASC]; + draft[GroupType.COLUMN].defaultApplications.fields = [ + 'run.hash', + 'figures.name', + ]; + draft[GroupType.ROW].defaultApplications.orders = [Order.DESC]; + draft[GroupType.ROW].defaultApplications.fields = ['record.step']; + }); + + const controls = produce(defaultConfig.controls, (draft: any) => { + draft.captionProperties = { + component: CaptionProperties, + state: { + initialState: { + displayBoxCaption: true, + selectedFields: ['run.name', 'figures.name', 'figures.context'], + }, + persist: 'url', + }, + }; + }); + + return { + ...defaultConfig, + groupings, + controls, + box: defaultConfig.box, + getStaticContent: getFiguresExplorerStaticContent, + }; +}; diff --git a/src/src/pages/FiguresExplorer/getStaticContent.tsx b/src/src/pages/FiguresExplorer/getStaticContent.tsx new file mode 100644 index 00000000..5af476b7 --- /dev/null +++ b/src/src/pages/FiguresExplorer/getStaticContent.tsx @@ -0,0 +1,52 @@ +import * as React from 'react'; + +import { DOCUMENTATIONS } from 'config/references'; + +import getBaseExplorerStaticContent, { + STATIC_CONTENT_TYPES, +} from 'modules/BaseExplorer/utils/getBaseExplorerStaticContent'; +import { StaticContentType } from 'modules/BaseExplorer/types'; + +function getFiguresExplorerStaticContent( + type: StaticContentType, +): React.ReactNode { + const illustrationContent = getFiguresExplorerIllustrationContent(type); + return getBaseExplorerStaticContent(type, illustrationContent); +} + +function getFiguresExplorerIllustrationContent( + type: StaticContentType, +): React.ReactNode { + const Never_Executed = ( + <> + It’s super easy to search Aim experiments. Just start typing your query in + the search bar above. +
+ Look up + + search docs + + to learn more. + + ); + const Failed = 'Incorrect Query'; + const Insufficient_Resources = "You don't have any tracked figures"; + const Empty = 'No Results'; + const Empty_Bookmarks = "You don't have any saved bookmark"; + + const CONTENT = { + [STATIC_CONTENT_TYPES.Never_Executed]: Never_Executed, + [STATIC_CONTENT_TYPES.Failed]: Failed, + [STATIC_CONTENT_TYPES.Insufficient_Resources]: Insufficient_Resources, + [STATIC_CONTENT_TYPES.Empty]: Empty, + [STATIC_CONTENT_TYPES.Empty_Bookmarks]: Empty_Bookmarks, + }; + return CONTENT[type] || null; +} + +export default getFiguresExplorerStaticContent; diff --git a/src/src/pages/FiguresExplorer/index.tsx b/src/src/pages/FiguresExplorer/index.tsx new file mode 100644 index 00000000..641c8679 --- /dev/null +++ b/src/src/pages/FiguresExplorer/index.tsx @@ -0,0 +1,35 @@ +import renderer from 'modules/BaseExplorer'; +import Figures from 'modules/BaseExplorer/components/Figures'; + +import { AimObjectDepths, SequenceTypesEnum } from 'types/core/enums'; + +import { getFiguresDefaultConfig } from './config'; + +const defaultConfig = getFiguresDefaultConfig(); + +const FiguresExplorer = renderer( + { + name: 'Figures Explorer', + sequenceName: SequenceTypesEnum.Figures, + basePath: 'figures', + persist: true, + adapter: { + objectDepth: AimObjectDepths.Step, + }, + groupings: defaultConfig.groupings, + visualizations: { + vis1: { + component: defaultConfig.Visualizer, + controls: defaultConfig.controls, + box: { + ...defaultConfig.box, + component: Figures, + }, + }, + }, + getStaticContent: defaultConfig.getStaticContent, + }, + __DEV__, +); + +export default FiguresExplorer; diff --git a/src/src/pages/ImagesExplore/ImagesExplore.scss b/src/src/pages/ImagesExplore/ImagesExplore.scss new file mode 100644 index 00000000..415194c5 --- /dev/null +++ b/src/src/pages/ImagesExplore/ImagesExplore.scss @@ -0,0 +1,65 @@ +@use 'src/styles/abstracts' as *; +.ImagesExplore { + &__container { + background-color: #ffffff; + min-width: 50rem; + height: 100%; + .ImagesExplore__visualization { + display: flex; + position: relative; + flex-direction: column; + flex: 1 100%; + max-height: calc(100% - #{toRem(136px)}); + .ProgressBar { + padding-bottom: toRem(136px); + } + } + .ImagesExplore__section { + height: 100vh; + } + .ImagesExplore__loader { + flex-direction: column; + justify-content: space-between; + } + .ImagesExplore__fullHeight { + height: 100%; + } + .ImagesExplore__section__appBarContainer { + display: flex; + flex-direction: column; + justify-content: center; + } + .ImagesExplore__table__container { + flex: 0.5 1 0; + min-height: 11rem; + &.fullHeight { + flex: 1 100% !important; + } + &.hide { + display: none; + } + } + .ImagesExplore__ResizePanel { + &__hide { + display: none; + } + } + .ImagesExplore__imagesWrapper__container { + min-height: 14.5rem; + flex: 0.5 1 0; + overflow: auto; + &.fullHeight { + flex: 1 100% !important; + } + &.hide { + display: none; + } + } + } + &__SelectForm__Grouping__container { + display: flex; + border-bottom: $border-main; + min-height: 6rem; + max-height: 6rem; + } +} diff --git a/src/src/pages/ImagesExplore/ImagesExplore.tsx b/src/src/pages/ImagesExplore/ImagesExplore.tsx new file mode 100644 index 00000000..ed1b87ae --- /dev/null +++ b/src/src/pages/ImagesExplore/ImagesExplore.tsx @@ -0,0 +1,583 @@ +/* eslint-disable react-hooks/rules-of-hooks */ +import React, { useState } from 'react'; +import { useHistory, useRouteMatch } from 'react-router-dom'; +import _ from 'lodash-es'; +import classNames from 'classnames'; +import { useResizeObserver, useModel, usePanelResize } from 'hooks'; + +import NotificationContainer from 'components/NotificationContainer/NotificationContainer'; +import Table from 'components/Table/Table'; +import ResizePanel from 'components/ResizePanel/ResizePanel'; +import MediaPanel from 'components/MediaPanel'; +import { MediaTypeEnum } from 'components/MediaPanel/config'; +import Grouping from 'components/Grouping/Grouping'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import RangePanel from 'components/RangePanel'; +import ProgressBar from 'components/ProgressBar/ProgressBar'; +import IllustrationBlock from 'components/IllustrationBlock/IllustrationBlock'; + +import pageTitlesEnum from 'config/pageTitles/pageTitles'; +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import GroupingPopovers, { + GroupNameEnum, +} from 'config/grouping/GroupingPopovers'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { + IllustrationsEnum, + Request_Illustrations, +} from 'config/illustrationConfig/illustrationConfig'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import SelectForm from 'pages/ImagesExplore/components/SelectForm/SelectForm'; +import Controls from 'pages/ImagesExplore/components/Controls/Controls'; + +import imagesExploreAppModel from 'services/models/imagesExplore/imagesExploreAppModel'; +import * as analytics from 'services/analytics'; +import { AppNameEnum } from 'services/models/explorer'; + +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; +import { IApiRequest } from 'types/services/services'; +import { IModel, State } from 'types/services/models/model'; + +import exceptionHandler from 'utils/app/exceptionHandler'; +import getStateFromUrl from 'utils/getStateFromUrl'; +import { ChartTypeEnum } from 'utils/d3'; +import { SortField, SortFields } from 'utils/getSortedFields'; + +import ImagesExploreAppBar from './components/ImagesExploreAppBar/ImagesExploreAppBar'; + +import './ImagesExplore.scss'; + +function ImagesExplore(): React.FunctionComponentElement { + const route = useRouteMatch(); + const history = useHistory(); + const imagesExploreData = useModel(imagesExploreAppModel); + const imagesWrapperRef = React.useRef(null); + const tableElemRef = React.useRef(null); + const wrapperElemRef = React.useRef(null); + const resizeElemRef = React.useRef(null); + const [offsetHeight, setOffsetHeight] = useState( + imagesWrapperRef?.current?.offsetHeight, + ); + const [isProgressBarVisible, setIsProgressBarVisible] = + React.useState(false); + const imagesRequestRef = React.useRef(null); + + const [offsetWidth, setOffsetWidth] = useState( + imagesWrapperRef?.current?.offsetWidth, + ); + + function handleSearch() { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.images.imagesPanel.clickApplyButton, + ); + imagesRequestRef.current = imagesExploreAppModel.getImagesData(true); + imagesRequestRef.current.call(); + } + + useResizeObserver(() => { + if (imagesWrapperRef?.current?.offsetHeight !== offsetHeight) { + setOffsetHeight(imagesWrapperRef?.current?.offsetHeight); + } + if (imagesWrapperRef?.current?.offsetWidth !== offsetWidth) { + setOffsetWidth(imagesWrapperRef?.current?.offsetWidth); + } + }, imagesWrapperRef); + + React.useEffect(() => { + setOffsetWidth(imagesWrapperRef?.current?.offsetWidth); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [imagesWrapperRef?.current?.offsetWidth]); + + // eslint-disable-next-line react-hooks/rules-of-hooks + const memoizedImagesSortFields = React.useMemo(() => { + if (_.isEmpty(imagesExploreData?.groupingSelectOptions)) { + return { sortFieldsDict: {}, sortFields: [] }; + } + const grouping = imagesExploreData?.config?.grouping; + const group: string[] = [...(grouping?.row || [])]; + //ToDo reverse mode + const groupFields = + // grouping?.reverseMode?.row + // ? imagesExploreData?.groupingSelectOptions.filter( + // (option: IGroupingSelectOption) => !group.includes(option.value), + // ) + // : + imagesExploreData?.groupingSelectOptions.filter( + (option: IGroupingSelectOption) => group.includes(option.value), + ); + let sortGroupFields = groupFields.reduce( + (acc: SortFields, field: SortField) => { + const resultField = imagesExploreData?.config?.images?.sortFieldsDict[ + field.value + ] || { ...field, order: 'asc' }; + acc.push({ ...resultField, readonly: true }); + return acc; + }, + [], + ); + sortGroupFields = sortGroupFields.concat( + imagesExploreData?.config?.images?.sortFields + .filter((field: SortField) => { + //ToDo reverse mode + + // if (grouping?.reverseMode?.row) { + // return group.includes(field.value); + // } else { + return !group.includes(field.value); + // } + }) + .map((field: SortField) => ({ ...field, readonly: false })), + ); + + return { + sortFieldsDict: sortGroupFields.reduce( + (acc: { [key: string]: SortField }, field: SortField) => { + acc[field.value] = field; + return acc; + }, + {}, + ), + sortFields: sortGroupFields, + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + imagesExploreData?.config?.grouping, + imagesExploreData?.config?.images?.sortFields, + imagesExploreData?.groupingSelectOptions, + ]); + + const panelResizing = usePanelResize( + wrapperElemRef, + imagesWrapperRef, + tableElemRef, + resizeElemRef, + imagesExploreData?.config?.table || {}, + imagesExploreAppModel.onTableResizeEnd, + ); + + React.useEffect(() => { + imagesExploreAppModel.initialize(route.params.appId); + let appRequestRef: IApiRequest; + let imagesRequestRef: IApiRequest; + if (route.params.appId) { + appRequestRef = imagesExploreAppModel.getAppConfigData( + route.params.appId, + ); + appRequestRef + .call((detail: any) => { + exceptionHandler({ + detail, + model: imagesExploreAppModel as IModel, + }); + }) + .then(() => { + imagesExploreAppModel.setDefaultAppConfigData(false); + imagesRequestRef = imagesExploreAppModel.getImagesData(); + imagesRequestRef.call((detail: any) => { + exceptionHandler({ + detail, + model: imagesExploreAppModel, + }); + }); + }); + } else { + imagesExploreAppModel.setDefaultAppConfigData(); + imagesRequestRef = imagesExploreAppModel.getImagesData(); + imagesRequestRef.call((detail: any) => { + exceptionHandler({ detail, model: imagesExploreAppModel }); + }); + } + + analytics.pageView(ANALYTICS_EVENT_KEYS.images.pageView); + + const unListenHistory = history.listen(() => { + if (!!imagesExploreData?.config) { + if ( + (imagesExploreData.config.grouping !== getStateFromUrl('grouping') || + imagesExploreData.config.images !== getStateFromUrl('images') || + imagesExploreData.config.select !== getStateFromUrl('select')) && + history.location.pathname === `/${AppNameEnum.IMAGES}` + ) { + imagesExploreAppModel.setDefaultAppConfigData(); + imagesExploreAppModel.updateModelData(); + } + } + }); + return () => { + imagesExploreAppModel.destroy(); + imagesRequestRef?.abort(); + unListenHistory(); + if (appRequestRef) { + appRequestRef.abort(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + +
+
+
+ +
+ + g.groupName === GroupNameEnum.ROW, + )} + isDisabled={isProgressBarVisible} + groupingData={imagesExploreData?.config?.grouping} + groupingSelectOptions={imagesExploreData?.groupingSelectOptions} + onGroupingSelectChange={ + imagesExploreAppModel.onGroupingSelectChange + } + onGroupingModeChange={ + imagesExploreAppModel.onGroupingModeChange + } + onGroupingPaletteChange={() => {}} + onGroupingReset={() => {}} + onGroupingApplyChange={ + imagesExploreAppModel.onGroupingApplyChange + } + onGroupingPersistenceChange={() => {}} + onShuffleChange={() => {}} + /> +
+
+ + {_.isEmpty(imagesExploreData?.tableData) && + _.isEmpty(imagesExploreData?.imagesData) ? ( + + ) : ( + <> +
+ {imagesExploreData?.config?.table.resizeMode === + ResizeModeEnum.MaxHeight ? null : ( + + } + tooltipType={ChartTypeEnum.ImageSet} + actionPanelSize={44} + actionPanel={ + imagesExploreData?.config?.images?.stepRange && + imagesExploreData?.config?.images?.indexRange && + imagesExploreAppModel.showRangePanel() && + !_.isEmpty(imagesExploreData?.imagesData) && ( + + ) + } + /> + )} +
+ +
+ {imagesExploreData?.config?.table.resizeMode === + ResizeModeEnum.Hide ? null : ( + +
+ + )} + + + )} + + + + {imagesExploreData?.notifyData?.length > 0 && ( + + )} + + + ); +} + +export default ImagesExplore; diff --git a/src/src/pages/ImagesExplore/components/Controls/Controls.scss b/src/src/pages/ImagesExplore/components/Controls/Controls.scss new file mode 100644 index 00000000..0759858f --- /dev/null +++ b/src/src/pages/ImagesExplore/components/Controls/Controls.scss @@ -0,0 +1,86 @@ +@use 'src/styles/abstracts' as *; + +.Controls__container { + padding: 0.75rem 0; + display: flex; + flex-direction: column; + align-items: center; + overflow: auto; + + & > div { + margin-bottom: 0.375rem; + + &:last-child { + margin-bottom: 0; + } + } +} + +.Controls__icon { + color: $pico-70; + font-size: 1.125rem; + &.active { + color: $primary-color; + } +} + +.Controls__anchor { + height: 2.25rem; + width: 2.25rem; + display: flex; + cursor: pointer; + position: relative; + align-items: center; + justify-content: center; + transition: background-color 0.18s ease-out; + border: 0.0625rem solid transparent; + border-radius: $border-radius-main; + + &.active { + background-color: $primary-color-10; + + &.outlined { + border: $border-main-active; + } + } + + &.disabled { + cursor: initial; + i { + color: $pico-50; + } + &:hover { + background-color: transparent; + } + } + + &:hover { + background-color: $pico-5; + + .icon-arrow-left { + opacity: 1; + } + } +} + +.Controls__anchor__arrow { + width: 0.6875rem; + height: 100%; + position: absolute; + left: -0.75rem; + display: flex; + align-items: center; + justify-content: center; + + .icon-arrow-left { + transition: all 0.18s ease-out; + color: $pico-70; + } +} + +.Controls__anchor__arrow--opened { + .icon-arrow-left { + transform: rotate(180deg); + color: $primary-color; + } +} diff --git a/src/src/pages/ImagesExplore/components/Controls/Controls.tsx b/src/src/pages/ImagesExplore/components/Controls/Controls.tsx new file mode 100644 index 00000000..0282f6d5 --- /dev/null +++ b/src/src/pages/ImagesExplore/components/Controls/Controls.tsx @@ -0,0 +1,181 @@ +import React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import { Tooltip } from '@material-ui/core'; + +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import TooltipContentPopover from 'components/TooltipContentPopover/TooltipContentPopover'; +import { Icon } from 'components/kit'; +import ImagePropertiesPopover from 'components/ImagePropertiesPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import SortPopover from 'pages/Metrics/components/Table/SortPopover/SortPopover'; + +import { IControlProps } from 'types/pages/imagesExplore/components/Controls/Controls'; + +import './Controls.scss'; + +function Controls( + props: IControlProps, +): React.FunctionComponentElement { + const imagePropertiesChanged: boolean = React.useMemo(() => { + const { alignmentType, mediaItemSize, imageRendering } = + props.additionalProperties; + return ( + alignmentType !== CONTROLS_DEFAULT_CONFIG.images.alignmentType || + mediaItemSize !== CONTROLS_DEFAULT_CONFIG.images.mediaItemSize || + imageRendering !== CONTROLS_DEFAULT_CONFIG.images.imageRendering + ); + }, [props.additionalProperties]); + + const tooltipChanged: boolean = React.useMemo(() => { + return ( + props.tooltip?.appearance !== + CONTROLS_DEFAULT_CONFIG.images.tooltip.appearance || + props.tooltip?.selectedFields?.length !== + CONTROLS_DEFAULT_CONFIG.images.tooltip.selectedFields.length + ); + }, [props.tooltip]); + + const sortFieldsChanged: boolean = React.useMemo(() => { + return ( + props.sortFields.length !== + CONTROLS_DEFAULT_CONFIG.images.sortFields.length + ); + }, [props.sortFields]); + + return ( + +
+
+ ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+ ( + +
+ +
+
+ )} + component={ + + } + /> +
+ +
+ +
+
+
+ ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+
+ ); +} + +export default Controls; diff --git a/src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.scss b/src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.scss new file mode 100644 index 00000000..599bc05b --- /dev/null +++ b/src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.scss @@ -0,0 +1,36 @@ +@use 'src/styles/abstracts' as *; + +.ImagesExploreAppBar { + &__item { + &__bookmark { + margin-right: $space-xxxs; + padding: 0 $space-xs !important; + &__Text { + margin-right: 0.625rem; + } + &__Icon { + color: $text-color; + } + } + } + &__menu { + border-left: $border-main; + padding: 0 $space-xxxs; + height: 100%; + display: flex; + align-items: center; + span { + cursor: pointer; + } + } + &__popover { + width: 16rem; + padding: $space-xs; + display: flex; + flex-direction: column; + a { + text-decoration: none; + color: inherit; + } + } +} diff --git a/src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.tsx b/src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.tsx new file mode 100644 index 00000000..9d7775ec --- /dev/null +++ b/src/src/pages/ImagesExplore/components/ImagesExploreAppBar/ImagesExploreAppBar.tsx @@ -0,0 +1,150 @@ +import React from 'react'; +import { useRouteMatch } from 'react-router-dom'; + +import { MenuItem } from '@material-ui/core'; + +import BookmarkForm from 'components/BookmarkForm/BookmarkForm'; +import AppBar from 'components/AppBar/AppBar'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import { Icon, Button, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import ConfirmModal from 'components/ConfirmModal/ConfirmModal'; + +import { DOCUMENTATIONS } from 'config/references'; + +import './ImagesExploreAppBar.scss'; + +function ImagesExploreAppBar({ + onBookmarkCreate, + onBookmarkUpdate, + onResetConfigData, + title, + disabled, +}: any): React.FunctionComponentElement { + const [popover, setPopover] = React.useState(''); + const route = useRouteMatch(); + + function handleBookmarkClick(value: string): void { + setPopover(value); + } + + function handleClosePopover(): void { + setPopover(''); + } + + function handleBookmarkUpdate(): void { + onBookmarkUpdate(route.params.appId); + handleClosePopover(); + } + + return ( + + + {route.params.appId ? ( + + ( + + )} + component={ +
+ handleBookmarkClick('create')}> + Create Bookmark + + handleBookmarkClick('update')}> + Update Bookmark + +
+ } + /> +
+ ) : ( + + )} +
+ + ( + + )} + component={ +
+ + Reset Controls to System Defaults + + + Explorer Documentation + +
+ } + /> +
+
+ + + + } + title='Update bookmark' + statusType='success' + confirmBtnText='Update' + /> +
+
+ ); +} + +export default React.memo(ImagesExploreAppBar); diff --git a/src/src/pages/ImagesExplore/components/ImagesExploreTableGrid/ImagesExploreTableGrid.tsx b/src/src/pages/ImagesExplore/components/ImagesExploreTableGrid/ImagesExploreTableGrid.tsx new file mode 100644 index 00000000..781eb694 --- /dev/null +++ b/src/src/pages/ImagesExplore/components/ImagesExploreTableGrid/ImagesExploreTableGrid.tsx @@ -0,0 +1,494 @@ +import moment from 'moment'; +import _ from 'lodash-es'; +import * as React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import TableSortIcons from 'components/Table/TableSortIcons'; +import { Badge, JsonViewPopover } from 'components/kit'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import GroupedColumnHeader from 'components/Table/GroupedColumnHeader'; +import RunNameColumn from 'components/Table/RunNameColumn'; +import AttachedTagsList from 'components/AttachedTagsList/AttachedTagsList'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import COLORS from 'config/colors/colors'; +import { TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { TABLE_DEFAULT_CONFIG } from 'config/table/tableConfigs'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { IOnGroupingSelectChangeParams } from 'types/services/models/metrics/metricsAppModel'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import contextToString from 'utils/contextToString'; +import { formatValue } from 'utils/formatValue'; +import { SortActionTypes, SortField } from 'utils/getSortedFields'; +import getColumnOptions from 'utils/getColumnOptions'; + +function getImagesExploreTableColumns( + paramColumns: string[] = [], + groupingSelectOptions: IGroupingSelectOption[], + groupFields: { [key: string]: unknown } | null, + order: { left: string[]; middle: string[]; right: string[] }, + hiddenColumns: string[], + sortFields?: any[], + onSort?: ({ sortFields, order, index, actionType }: any) => void, + grouping?: { [key: string]: string[] }, + onGroupingToggle?: (params: IOnGroupingSelectChangeParams) => void, +): ITableColumn[] { + let columns: ITableColumn[] = [ + { + key: 'experiment', + content: Name, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment') + ? 'left' + : order?.middle?.includes('experiment') + ? null + : order?.right?.includes('experiment') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.IMAGES!, + 'run.props.experiment.name', + ), + }, + { + key: 'experiment_description', + content: Description, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment_description') + ? 'left' + : order?.middle?.includes('experiment_description') + ? null + : order?.right?.includes('experiment_description') + ? 'right' + : null, + }, + { + key: 'hash', + content: Hash, + topHeader: 'Run', + pin: order?.left?.includes('hash') + ? 'left' + : order?.middle?.includes('hash') + ? null + : order?.right?.includes('hash') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.IMAGES!, + 'run.hash', + ), + }, + { + key: 'run', + content: Name, + topHeader: 'Run', + pin: order?.left?.includes('run') + ? 'left' + : order?.middle?.includes('run') + ? null + : order?.right?.includes('run') + ? 'right' + : 'left', + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.IMAGES!, + 'run.props.name', + ), + }, + + { + key: 'description', + content: Description, + topHeader: 'Run', + pin: order?.left?.includes('description') + ? 'left' + : order?.middle?.includes('description') + ? null + : order?.right?.includes('description') + ? 'right' + : null, + }, + { + key: 'date', + content: Date, + topHeader: 'Run', + pin: order?.left?.includes('date') + ? 'left' + : order?.middle?.includes('date') + ? null + : order?.right?.includes('date') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.IMAGES!, + 'run.props.creation_time', + ), + }, + { + key: 'duration', + content: Duration, + topHeader: 'Run', + pin: order?.left?.includes('date') + ? 'left' + : order?.middle?.includes('date') + ? null + : order?.right?.includes('date') + ? 'right' + : null, + }, + { + key: 'tags', + content: Tags, + topHeader: 'Run', + pin: order?.left?.includes('tags') + ? 'left' + : order?.right?.includes('tags') + ? 'right' + : null, + }, + { + key: 'name', + content: Name, + topHeader: 'Images', + pin: order?.left?.includes('name') + ? 'left' + : order?.right?.includes('name') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.IMAGES!, + 'name', + ), + }, + { + key: 'context', + content: Context, + topHeader: 'Images', + pin: order?.left?.includes('context') + ? 'left' + : order?.right?.includes('context') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.IMAGES!, + 'context', + ), + }, + { + key: 'actions', + content: '', + topHeader: '', + pin: 'right', + }, + ].concat( + paramColumns.map((param) => { + const paramKey = `run.params.${param}`; + const sortItemIndex: number = + sortFields?.findIndex((value: SortField) => value.value === paramKey) ?? + -1; + return { + key: param, + content: ( + + + {param} + {onSort && ( + + onSort({ + sortFields, + index: sortItemIndex, + field: + sortItemIndex === -1 + ? groupingSelectOptions.find( + (value) => value.value === paramKey, + ) + : sortFields?.[sortItemIndex], + actionType: + sortFields?.[sortItemIndex]?.order === 'desc' + ? SortActionTypes.DELETE + : SortActionTypes.ORDER_TABLE_TRIGGER, + }) + } + sort={ + !_.isNil(sortFields?.[sortItemIndex]) + ? sortFields?.[sortItemIndex]?.order + : null + } + /> + )} + + + ), + topHeader: 'Run Params', + pin: order?.left?.includes(param) + ? 'left' + : order?.right?.includes(param) + ? 'right' + : null, + }; + }), + ); + + columns = columns.map((col) => ({ + ...col, + isHidden: + !TABLE_DEFAULT_CONFIG.images.nonHidableColumns.has(col.key) && + hiddenColumns.includes(col.key), + })); + + const columnsOrder = order?.left.concat(order.middle).concat(order.right); + columns.sort((a, b) => { + if (a.key === '#') { + return -1; + } else if (a.key === 'actions') { + return 1; + } else if (b.key === 'actions') { + return -1; + } + if (!columnsOrder.includes(a.key) && !columnsOrder.includes(b.key)) { + return 0; + } else if (!columnsOrder.includes(a.key)) { + return 1; + } else if (!columnsOrder.includes(b.key)) { + return -1; + } + return columnsOrder.indexOf(a.key) - columnsOrder.indexOf(b.key); + }); + + if (groupFields) { + columns = [ + { + key: '#', + content: '', + topHeader: 'Group', + pin: 'left', + }, + { + key: 'groups', + content: ( + +
+ {Object.keys(groupFields).map((field) => { + let name: string = field.replace('run.params.', ''); + name = name.replace( + 'run.props.experiment.name', + 'run.props.experiment', + ); + name = name.replace('run.props', 'run'); + return ( + +
{name}
+
+ ); + })} +
+
+ ), + pin: order?.left?.includes('groups') + ? 'left' + : order?.right?.includes('groups') + ? 'right' + : null, + topHeader: 'Group Config', + }, + ...columns, + ]; + } + return columns; +} + +const TagsColumn = (props: { + runHash: string; + tags: ITagInfo[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + headerRenderer: () => React.ReactNode; + addTagButtonSize: 'xxSmall' | 'xSmall'; +}) => { + return ; +}; + +function imagesExploreTableRowRenderer( + rowData: any, + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void, + actions?: { [key: string]: (e: any) => void }, + groupHeaderRow = false, + columns: string[] = [], +) { + if (groupHeaderRow) { + const row: { [key: string]: any } = {}; + for (let i = 0; i < columns.length; i++) { + const col = columns[i]; + if (col === 'context') { + row[col] = { + content: + rowData.context.length > 1 ? ( + + ) : ( + + ), + }; + } else if (['step', 'epoch'].includes(col)) { + row[col] = + rowData[col] === null + ? '-' + : Array.isArray(rowData[col]) + ? '' + : rowData[col]; + } else if (col === 'time') { + row[col] = + rowData.time === null + ? '-' + : Array.isArray(rowData.time) + ? '' + : moment(rowData.time).format(TABLE_DATE_FORMAT); + } else if (col === 'groups') { + row.groups = { + content: ( + +
+ {Object.keys(rowData[col]).map((item, index) => { + const value: string | { [key: string]: unknown } = + rowData[col][item]; + return _.isObject(value) ? ( + + ( + + + {contextToString(value)} + + + )} + component={} + /> + + ) : ( + +
{formatValue(value)}
+
+ ); + })} +
+
+ ), + }; + } else if (Array.isArray(rowData[col])) { + row[col] = { + content: , + }; + } + } + + return _.merge({}, rowData, row); + } else { + const row = { + experiment: { + content: ( + + ), + }, + run: { + content: ( + + ), + }, + metric: rowData.metric, + context: { + content: + rowData.context.length > 1 ? ( + + ) : ( + + ), + }, + value: rowData.value, + step: rowData.step, + epoch: rowData.epoch, + tags: { + content: ( + <>} + addTagButtonSize='xxSmall' + /> + ), + }, + time: + rowData.time === null + ? '-' + : moment(rowData.time).format(TABLE_DATE_FORMAT), + actions: { + //@TODO add hide sequence functionality + content: ( + // + <> + ), + }, + }; + + return _.merge({}, rowData, row); + } +} + +export { getImagesExploreTableColumns, imagesExploreTableRowRenderer }; diff --git a/src/src/pages/ImagesExplore/components/SelectForm/SelectForm.scss b/src/src/pages/ImagesExplore/components/SelectForm/SelectForm.scss new file mode 100644 index 00000000..379e1a41 --- /dev/null +++ b/src/src/pages/ImagesExplore/components/SelectForm/SelectForm.scss @@ -0,0 +1,124 @@ +@use 'src/styles/abstracts' as *; + +.SelectForm { + flex: 1; + padding: 0.725rem 1.5em; + display: flex; + + &__container__metrics { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + padding-right: 1rem; + /* TODO [GA]: Override MUI default styles in a nice way */ + .MuiBox-root { + justify-content: flex-start; + } + } + &__container__search { + width: 103px; + display: flex; + justify-content: space-between; + flex-direction: column; + } + &__Popper { + border: $border-main; + width: 40%; + border-radius: $radius-main; + z-index: 6; + color: #586069; + background-color: #ffffff; + .MuiAutocomplete-paper { + box-shadow: unset; + margin: unset; + } + } + &__metric__select { + width: 100%; + + input { + padding: 0.5rem; + font-size: $text-md; + border-bottom: $border-main; + } + } + &__TextField { + position: relative; + } + &__textarea { + flex: 1; + .MuiOutlinedInput-multiline.MuiOutlinedInput-marginDense { + padding-top: toRem(7.5px); + padding-bottom: toRem(7.5px); + } + } + &__search__button { + width: 100%; + } + &__search__actions { + display: flex; + justify-content: space-between; + + button { + border: $border-main; + &:nth-child(2) { + margin: 0 0.25rem; + } + &.active { + border: $border-main-active; + background-color: $primary-color-5; + } + } + } + &__clearAll { + height: 24px; + width: 24px; + background: #e8f1fc; + border-radius: 6px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + position: relative; + &.disabled { + opacity: 0.5; + } + &:after { + content: ''; + position: absolute; + width: 20px; + height: 34px; + background: rgba(255, 255, 255, 0.5); + background: linear-gradient( + 90deg, + rgba(255, 255, 255, 0) 0%, + rgba(255, 255, 255, 1) 92% + ); + left: -20px; + top: -5px; + border-radius: 0; + color: white; + pointer-events: none; + } + + i { + color: #1473e6; + font-size: 10px; + } + } + &__tags { + display: flex; + align-items: center; + overflow: auto; + max-width: calc(100vw - 33rem); + min-width: 12rem; + + .Badge { + margin-right: 0.5rem; + &:last-child { + margin-right: 20px; + } + } + } +} diff --git a/src/src/pages/ImagesExplore/components/SelectForm/SelectForm.tsx b/src/src/pages/ImagesExplore/components/SelectForm/SelectForm.tsx new file mode 100644 index 00000000..24200c5f --- /dev/null +++ b/src/src/pages/ImagesExplore/components/SelectForm/SelectForm.tsx @@ -0,0 +1,384 @@ +import React from 'react'; +import classNames from 'classnames'; + +import { + Box, + Checkbox, + Divider, + InputBase, + Popper, + Tooltip, +} from '@material-ui/core'; +import Autocomplete from '@material-ui/lab/Autocomplete'; +import { + CheckBox as CheckBoxIcon, + CheckBoxOutlineBlank, +} from '@material-ui/icons'; + +import { Icon, Badge, Button, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import AutocompleteInput from 'components/AutocompleteInput'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import imagesExploreAppModel from 'services/models/imagesExplore/imagesExploreAppModel'; +import { trackEvent } from 'services/analytics'; + +import { ISelectFormProps } from 'types/pages/imagesExplore/components/SelectForm/SelectForm'; +import { ISelectOption } from 'types/services/models/explorer/createAppModel'; + +import './SelectForm.scss'; + +function SelectForm({ + requestIsPending, + isDisabled = false, + selectedImagesData, + searchButtonDisabled, + selectFormData, + onImagesExploreSelectChange, + onSelectRunQueryChange, + toggleSelectAdvancedMode, + onSelectAdvancedQueryChange, + onSearchQueryCopy, +}: ISelectFormProps): React.FunctionComponentElement { + const [anchorEl, setAnchorEl] = React.useState(null); + const [searchValue, setSearchValue] = React.useState(''); + const searchMetricsRef = React.useRef(null); + const autocompleteRef: any = React.useRef>(null); + const advancedAutocompleteRef: any = + React.useRef>(null); + React.useEffect(() => { + return () => { + searchMetricsRef.current?.abort(); + }; + }, []); + + function handleSearch(e?: React.ChangeEvent): void { + e?.preventDefault(); + if (requestIsPending || searchButtonDisabled) { + return; + } + let query = selectedImagesData?.advancedMode + ? advancedAutocompleteRef?.current?.getValue() + : autocompleteRef?.current?.getValue(); + if (selectedImagesData?.advancedMode) { + onSelectAdvancedQueryChange(query ?? ''); + } else { + onSelectRunQueryChange(query ?? ''); + } + searchMetricsRef.current = imagesExploreAppModel.getImagesData( + true, + true, + query ?? '', + ); + searchMetricsRef.current.call(); + + trackEvent(ANALYTICS_EVENT_KEYS.images.searchClick); + } + + function handleRequestAbort(e: React.SyntheticEvent): void { + e.preventDefault(); + if (!requestIsPending) { + return; + } + searchMetricsRef.current?.abort(); + imagesExploreAppModel.abortRequest(); + } + + function onSelect( + event: React.ChangeEvent<{}>, + value: ISelectOption[], + ): void { + if (event.type === 'click') { + const lookup = value.reduce( + (acc: { [key: string]: number }, curr: ISelectOption) => { + acc[curr.key] = ++acc[curr.key] || 0; + return acc; + }, + {}, + ); + onImagesExploreSelectChange( + value.filter((option: ISelectOption) => lookup[option.key] === 0), + ); + } + } + + function handleDelete(field: string): void { + let fieldData = [...selectedImagesData?.options].filter( + (opt: ISelectOption) => opt.key !== field, + ); + onImagesExploreSelectChange(fieldData); + } + + function toggleEditMode(): void { + toggleSelectAdvancedMode(); + } + + function handleClick(event: React.ChangeEvent) { + setAnchorEl(event.currentTarget); + } + + function handleClose(event: any, reason: any) { + if (reason === 'toggleInput') { + return; + } + if (anchorEl) { + anchorEl.focus(); + } + setAnchorEl(null); + setSearchValue(''); + } + + function handleResetSelectForm(): void { + onImagesExploreSelectChange([]); + onSelectRunQueryChange(''); + } + + function handleSearchInputChange( + e: React.ChangeEvent, + ): void { + setSearchValue(e.target.value); + } + + const options = React.useMemo(() => { + return ( + selectFormData?.options?.filter( + (option) => option.label.indexOf(searchValue) !== -1, + ) ?? [] + ); + }, [searchValue, selectFormData?.options]); + + const open: boolean = !!anchorEl; + const id = open ? 'select-metric' : undefined; + + return ( + +
+
+ + + {selectedImagesData?.advancedMode ? ( +
+ +
+ ) : ( + + + + + option.group} + getOptionLabel={(option) => option.label} + renderTags={() => null} + disableClearable={true} + ListboxProps={{ + style: { + height: 400, + }, + }} + renderInput={(params) => ( + + )} + renderOption={(option) => { + let selected: boolean = + !!selectedImagesData?.options.find( + (item: ISelectOption) => item.key === option.key, + )?.key; + return ( +
+ } + checkedIcon={} + checked={selected} + size='small' + /> + + {option.label} + +
+ ); + }} + /> +
+ + {selectedImagesData?.options.length === 0 && ( + + No images are selected + + )} + + {selectedImagesData?.options?.map( + (tag: ISelectOption) => { + return ( + + ); + }, + )} + +
+ {selectedImagesData?.options.length > 1 && ( + + + + )} +
+ )} +
+
+ {selectedImagesData?.advancedMode ? null : ( + +
+ +
+
+ )} +
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+
+
+
+ ); +} + +export default React.memo(SelectForm); diff --git a/src/src/pages/Metrics/Metrics.scss b/src/src/pages/Metrics/Metrics.scss new file mode 100644 index 00000000..94ad5cca --- /dev/null +++ b/src/src/pages/Metrics/Metrics.scss @@ -0,0 +1,93 @@ +@use 'src/styles/abstracts' as *; + +.Metrics__section { + height: 100vh; + overflow: hidden; + .Metrics__loader { + flex-direction: column; + justify-content: space-between; + } + .Metrics__visualization { + display: flex; + position: relative; + flex-direction: column; + flex: 1 100%; + max-height: calc(100% - #{toRem(136px)}); + .ProgressBar { + padding-bottom: toRem(136px); + } + } +} + +.Metrics__container { + background-color: #ffffff; + min-width: 50rem; + .Metrics__fullHeight { + height: 100%; + } + .Metrics__section__appBarContainer { + display: flex; + flex-direction: column; + } + .Metrics__chart__container { + flex: 0.5 1 0; + min-height: 11.25rem; + &.fullHeight { + flex: 1 100% !important; + } + &.hide { + display: none; + } + } + .Metrics__ResizePanel { + &.hide { + display: none; + } + } + .Metrics__table__container { + flex: 0.5 1 0; + min-height: 11rem; + &.fullHeight { + flex: 1 100% !important; + } + &.hide { + display: none; + } + } +} + +.Metrics__SelectForm__Grouping__container { + display: flex; + border-bottom: $border-main; + min-height: 6rem; + max-height: 6rem; +} + +.Metrics__table__aggregationColumn__cell { + display: flex; + flex: 1; + justify-content: space-between; + width: calc(100% + 28px); + span { + display: inline-block; + width: 100%; + min-width: 120px; + justify-content: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + &:nth-of-type(2) { + padding: 0 $space-xs; + margin: 0 $space-xs; + border-left: $border-separator; + border-right: $border-separator; + } + + &:nth-of-type(4) { + padding: 0 $space-xs; + margin: 0 $space-xs; + border-left: $border-separator; + } + } +} diff --git a/src/src/pages/Metrics/Metrics.tsx b/src/src/pages/Metrics/Metrics.tsx new file mode 100644 index 00000000..43b622d0 --- /dev/null +++ b/src/src/pages/Metrics/Metrics.tsx @@ -0,0 +1,312 @@ +import React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import Table from 'components/Table/Table'; +import ChartPanel from 'components/ChartPanel/ChartPanel'; +import NotificationContainer from 'components/NotificationContainer/NotificationContainer'; +import IllustrationBlock from 'components/IllustrationBlock/IllustrationBlock'; +import ResizePanel from 'components/ResizePanel/ResizePanel'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import Grouping from 'components/Grouping/Grouping'; +import ProgressBar from 'components/ProgressBar/ProgressBar'; + +import pageTitlesEnum from 'config/pageTitles/pageTitles'; +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { + RowHeightSize, + VisualizationElementEnum, +} from 'config/table/tableConfigs'; +import GroupingPopovers, { + GroupNameEnum, +} from 'config/grouping/GroupingPopovers'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { + IllustrationsEnum, + Request_Illustrations, +} from 'config/illustrationConfig/illustrationConfig'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { ILine } from 'types/components/LineChart/LineChart'; +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +import { ChartTypeEnum, CurveEnum } from 'utils/d3'; + +import MetricsBar from './components/MetricsBar/MetricsBar'; +import Controls from './components/Controls/Controls'; +import SelectForm from './components/SelectForm/SelectForm'; + +import './Metrics.scss'; + +function Metrics( + props: IMetricProps, +): React.FunctionComponentElement { + const [isProgressBarVisible, setIsProgressBarVisible] = + React.useState(false); + const chartProps = React.useMemo(() => { + return (props.lineChartData || []).map((chartData: ILine[]) => ({ + axesScaleType: props.axesScaleType, + axesScaleRange: props.axesScaleRange, + curveInterpolation: props.smoothing.isApplied + ? props.smoothing.curveInterpolation + : CurveEnum.Linear, + ignoreOutliers: props.ignoreOutliers, + highlightMode: props.highlightMode, + aggregatedData: props.aggregatedData?.filter( + (data) => data.chartIndex === chartData[0]?.chartIndex, + ), + zoom: props.zoom, + chartTitle: props.chartTitleData[chartData[0]?.chartIndex!], + aggregationConfig: props.aggregationConfig, + alignmentConfig: props.alignmentConfig, + onZoomChange: props.onZoomChange, + })); + }, [ + props.lineChartData, + props.axesScaleType, + props.smoothing.curveInterpolation, + props.smoothing.isApplied, + props.ignoreOutliers, + props.highlightMode, + props.zoom, + props.chartTitleData, + props.aggregatedData, + props.aggregationConfig, + props.alignmentConfig, + props.onZoomChange, + props.axesScaleRange, + ]); + + return ( + +
+
+
+ +
+ + + p.groupName === GroupNameEnum.COLOR || + p.groupName === GroupNameEnum.STROKE || + p.groupName === GroupNameEnum.CHART, + )} + isDisabled={isProgressBarVisible} + groupingData={props.groupingData} + groupingSelectOptions={props.groupingSelectOptions} + onGroupingSelectChange={props.onGroupingSelectChange} + onGroupingModeChange={props.onGroupingModeChange} + onGroupingPaletteChange={props.onGroupingPaletteChange} + onGroupingReset={props.onGroupingReset} + onGroupingApplyChange={props.onGroupingApplyChange} + onGroupingPersistenceChange={props.onGroupingPersistenceChange} + onShuffleChange={props.onShuffleChange} + /> +
+
+ + {_.isEmpty(props.tableData) && _.isEmpty(props.lineChartData) ? ( + + ) : ( + <> +
+ {props.resizeMode === ResizeModeEnum.MaxHeight ? null : ( + + } + /> + )} +
+ +
+ {props.resizeMode === ResizeModeEnum.Hide ? null : ( + +
+ + )} + + + )} + + + + {props.notifyData?.length > 0 && ( + + )} + + + ); +} + +export default React.memo(Metrics); diff --git a/src/src/pages/Metrics/MetricsContainer.tsx b/src/src/pages/Metrics/MetricsContainer.tsx new file mode 100644 index 00000000..5dedc51c --- /dev/null +++ b/src/src/pages/Metrics/MetricsContainer.tsx @@ -0,0 +1,220 @@ +import React from 'react'; +import { useHistory, useRouteMatch } from 'react-router-dom'; +import { useResizeObserver, useModel, usePanelResize } from 'hooks'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import metricAppModel from 'services/models/metrics/metricsAppModel'; +import * as analytics from 'services/analytics'; +import { AppNameEnum } from 'services/models/explorer'; + +import { ITableRef } from 'types/components/Table/Table'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { IMetricAppModelState } from 'types/services/models/metrics/metricsAppModel'; +import { IApiRequest } from 'types/services/services'; + +import setComponentRefs from 'utils/app/setComponentRefs'; +import getStateFromUrl from 'utils/getStateFromUrl'; +import exceptionHandler from 'utils/app/exceptionHandler'; + +import Metrics from './Metrics'; + +function MetricsContainer(): React.FunctionComponentElement { + const tableRef = React.useRef(null); + const chartPanelRef = React.useRef(null); + const tableElemRef = React.useRef(null); + const chartElemRef = React.useRef(null); + const wrapperElemRef = React.useRef(null); + const resizeElemRef = React.useRef(null); + const route = useRouteMatch(); + const history = useHistory(); + const metricsData = useModel>(metricAppModel); + const [chartPanelOffsetHeight, setChartPanelOffsetHeight] = React.useState( + chartElemRef?.current?.offsetHeight, + ); + + const panelResizing = usePanelResize( + wrapperElemRef, + chartElemRef, + tableElemRef, + resizeElemRef, + metricsData?.config?.table || undefined, + metricAppModel.onTableResizeEnd, + ); + + useResizeObserver(() => { + if (chartElemRef?.current?.offsetHeight !== chartPanelOffsetHeight) { + setChartPanelOffsetHeight(chartElemRef?.current?.offsetHeight); + } + }, chartElemRef); + + React.useEffect(() => { + if (tableRef.current && chartPanelRef.current) { + setComponentRefs({ + model: metricAppModel, + refElement: { + tableRef, + chartPanelRef, + }, + }); + } + }, [metricsData?.rawData]); + + React.useEffect(() => { + metricAppModel.initialize(route.params.appId); + let appRequestRef: IApiRequest; + let metricsRequestRef: IApiRequest; + if (route.params.appId) { + appRequestRef = metricAppModel.getAppConfigData(route.params.appId); + appRequestRef + .call((detail: any) => { + exceptionHandler({ detail, model: metricAppModel }); + }) + .then(() => { + metricAppModel.setDefaultAppConfigData(false); + metricsRequestRef = metricAppModel.getMetricsData(); + metricsRequestRef.call((detail: any) => { + exceptionHandler({ detail, model: metricAppModel }); + }); + }); + } else { + metricAppModel.setDefaultAppConfigData(); + metricsRequestRef = metricAppModel.getMetricsData(); + metricsRequestRef.call((detail: any) => { + exceptionHandler({ detail, model: metricAppModel }); + }); + } + analytics.pageView(ANALYTICS_EVENT_KEYS.metrics.pageView); + + const unListenHistory = history.listen(() => { + if (!!metricsData?.config) { + if ( + (metricsData.config.grouping !== getStateFromUrl('grouping') || + metricsData.config.chart !== getStateFromUrl('chart') || + metricsData.config.select !== getStateFromUrl('select')) && + history.location.pathname === `/${AppNameEnum.METRICS}` + ) { + metricAppModel.setDefaultAppConfigData(); + metricAppModel.updateModelData(); + } + } + }); + return () => { + metricAppModel.destroy(); + metricsRequestRef?.abort(); + unListenHistory(); + if (appRequestRef) { + appRequestRef.abort(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + return ( + + + + ); +} + +export default MetricsContainer; diff --git a/src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.scss b/src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.scss new file mode 100644 index 00000000..6949b266 --- /dev/null +++ b/src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.scss @@ -0,0 +1,61 @@ +@use 'src/styles/abstracts' as *; + +.ColorPopoverAdvanced { + width: 25rem; + + &__Switcher__button__container { + height: 1.75rem; + display: flex; + align-items: center; + .ColorPopoverAdvanced__span { + margin-left: 0.875rem; + } + } + &__persistence { + padding: 1rem; + border-bottom: $border-main; + } + + &__persistence__p { + margin: 0.5rem 0 1rem 0; + } + + &__preferred__colors { + padding: 1rem; + h3 { + margin-bottom: 0.5rem; + } + .ColorPopoverAdvanced__span { + flex: 1; + } + } + + &__paletteColors__container { + display: flex; + border-radius: $border-radius-md; + width: 10.5rem; + border: 0.0625rem solid transparent; + height: 2rem; + overflow: hidden; + transition: all 0.18s ease-out; + padding: 0.1875rem; + + &.active { + border: 0.0625rem solid $primary-color; + } + } + + &__paletteColors__colorItem { + display: inline-block; + flex: 1; + height: 100%; + + &:first-child { + border-radius: 0.25rem 0 0 0.25rem; + } + + &:last-child { + border-radius: 0 0.25rem 0.25rem 0; + } + } +} diff --git a/src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.tsx b/src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.tsx new file mode 100644 index 00000000..d0cf23e7 --- /dev/null +++ b/src/src/pages/Metrics/components/ColorPopoverAdvanced/ColorPopoverAdvanced.tsx @@ -0,0 +1,118 @@ +import React from 'react'; + +import { Box, Radio } from '@material-ui/core'; + +import { Button, Switcher, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import COLORS from 'config/colors/colors'; + +import { IGroupingPopoverAdvancedProps } from 'types/components/GroupingPopover/GroupingPopover'; + +import './ColorPopoverAdvanced.scss'; + +function ColorPopoverAdvanced({ + onPersistenceChange, + onGroupingPaletteChange, + onShuffleChange, + persistence, + paletteIndex, + groupingData, +}: IGroupingPopoverAdvancedProps): React.FunctionComponentElement { + function onPaletteChange(e: React.ChangeEvent) { + let { value } = e.target; + if (onGroupingPaletteChange) { + onGroupingPaletteChange(parseInt(value)); + } + } + function isShuffleDisabled(): boolean { + //ToDo reverse mode + // if (groupingData?.reverseMode.color || groupingData?.color.length) { + if (groupingData?.color.length) { + return false; + } + return true; + } + + return ( + +
+
+ + colors persistence + + + Enable persistent coloring mode so that each item always has the + same color regardless of its order. + +
+
+ onPersistenceChange('color')} + checked={persistence} + size='large' + variant='contained' + /> + + Enable + +
+ {persistence && ( + + )} +
+
+
+ + Preferred color palette + +
+ {COLORS.map((options, index) => ( + + + + + {index === 0 ? '8 distinct colors' : '24 colors'}{' '} + +
+ {options.map((color) => ( + + ))} +
+
+
+ ))} +
+
+
+
+ ); +} + +export default ColorPopoverAdvanced; diff --git a/src/src/pages/Metrics/components/Controls/Controls.scss b/src/src/pages/Metrics/components/Controls/Controls.scss new file mode 100644 index 00000000..18486b90 --- /dev/null +++ b/src/src/pages/Metrics/components/Controls/Controls.scss @@ -0,0 +1,86 @@ +@use 'src/styles/abstracts' as *; + +.Controls__container { + padding: 0.75rem 0; + display: flex; + flex-direction: column; + align-items: center; + overflow: auto; + + & > div { + margin-bottom: 0.375rem; + + &:last-child { + margin-bottom: 0; + } + } +} + +.Controls__icon { + color: $pico-70; + font-size: 1.125rem; + &.active { + color: $primary-color; + } +} + +.Controls__anchor { + height: 2.25rem; + width: 2.25rem; + display: flex; + cursor: pointer; + position: relative; + align-items: center; + justify-content: center; + transition: background-color 0.18s ease-out; + border: 0.0625rem solid transparent; + border-radius: $border-radius-main; + + &.active { + background-color: $primary-color-10; + + &.outlined { + border: $border-main-active; + } + } + + &.disabled { + cursor: initial; + i { + color: $pico-50; + } + &:hover { + background-color: transparent; + } + } + + &:hover { + background-color: $pico-5; + + .icon-arrow-left { + opacity: 1; + } + } +} + +.Controls__anchor__arrow { + width: 0.6875rem; + height: 100%; + position: absolute; + left: -0.75rem; + display: flex; + align-items: center; + justify-content: center; + + &.opened { + .icon-arrow-left { + transform: rotate(180deg); + color: $primary-color; + } + } + + .icon-arrow-left { + transition: all 0.18s ease-out; + color: $pico-70; + } +} diff --git a/src/src/pages/Metrics/components/Controls/Controls.tsx b/src/src/pages/Metrics/components/Controls/Controls.tsx new file mode 100644 index 00000000..65430fa3 --- /dev/null +++ b/src/src/pages/Metrics/components/Controls/Controls.tsx @@ -0,0 +1,486 @@ +import React from 'react'; +import classNames from 'classnames'; +import _ from 'lodash-es'; + +import { Tooltip } from '@material-ui/core'; + +import AggregationPopover from 'components/AggregationPopover/AggregationPopover'; +import SmootheningPopover from 'components/SmoothingPopover/SmoothingPopover'; +import ZoomInPopover from 'components/ZoomInPopover/ZoomInPopover'; +import ZoomOutPopover from 'components/ZoomOutPopover/ZoomOutPopover'; +import HighlightModePopover from 'components/HighlightModesPopover/HighlightModesPopover'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import AxesScalePopover from 'components/AxesScalePopover/AxesScalePopover'; +import AlignmentPopover from 'components/AxesPropsPopover/AxesPropsPopover'; +import TooltipContentPopover from 'components/TooltipContentPopover/TooltipContentPopover'; +import { Icon } from 'components/kit'; +import ExportPreview from 'components/ExportPreview'; +import ChartGrid from 'components/ChartPanel/ChartGrid'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import ChartLegends from 'components/ChartPanel/ChartLegends'; + +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import { IControlProps } from 'types/pages/metrics/components/Controls/Controls'; + +import './Controls.scss'; + +function Controls( + props: IControlProps, +): React.FunctionComponentElement { + const [openExportModal, setOpenExportModal] = React.useState(false); + + const highlightModeChanged: boolean = React.useMemo(() => { + return ( + props.highlightMode !== CONTROLS_DEFAULT_CONFIG.metrics.highlightMode + ); + }, [props.highlightMode]); + + const axesScaleChanged: boolean = React.useMemo(() => { + return ( + props.axesScaleType.xAxis !== + CONTROLS_DEFAULT_CONFIG.metrics.axesScaleType.xAxis || + props.axesScaleType.yAxis !== + CONTROLS_DEFAULT_CONFIG.metrics.axesScaleType.yAxis + ); + }, [props.axesScaleType]); + + const alignmentChanged: boolean = React.useMemo(() => { + return ( + props.alignmentConfig.metric !== + CONTROLS_DEFAULT_CONFIG.metrics.alignmentConfig.metric || + props.alignmentConfig.type !== + CONTROLS_DEFAULT_CONFIG.metrics.alignmentConfig.type || + props.densityType !== CONTROLS_DEFAULT_CONFIG.metrics.densityType + ); + }, [props.alignmentConfig, props.densityType]); + + const axesRangeChanged: boolean = React.useMemo(() => { + return !_.isEqual( + props.axesScaleRange, + CONTROLS_DEFAULT_CONFIG.metrics.axesScaleRange, + ); + }, [props.axesScaleRange]); + + const tooltipChanged: boolean = React.useMemo(() => { + return ( + props.tooltip?.appearance !== + CONTROLS_DEFAULT_CONFIG.metrics.tooltip.appearance || + props.tooltip.selectedFields?.length !== + CONTROLS_DEFAULT_CONFIG.metrics.tooltip.selectedFields.length + ); + }, [props.tooltip]); + + const onToggleExportPreview = React.useCallback((): void => { + setOpenExportModal((state) => !state); + }, [setOpenExportModal]); + + return ( + +
+
+ + ( + +
{ + if (props.aggregationConfig.isEnabled) { + props.onAggregationConfigChange({ + isApplied: !props.aggregationConfig?.isApplied, + }); + } + }} + > + {props.aggregationConfig.isEnabled ? ( + + + + ) : null} + +
+
+ )} + component={ + + } + /> +
+
+
+ + ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+
+ + ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+
+ + ( + +
{ + props.onSmoothingChange({ + isApplied: !props.smoothing?.isApplied, + }); + }} + > + + + + +
+
+ )} + component={ + + } + /> +
+
+ +
+ +
+
+
+ + ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+
+ + ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+
+ + +
{ + if (!_.isEmpty(props.legendsData)) { + props.onLegendsChange({ display: !props.legends?.display }); + } + }} + > + +
+
+
+
+
+ + ( + +
{ + if (props.zoom) { + props.onZoomChange?.({ active: !props.zoom.active }); + } + }} + > + + + + +
+
+ )} + component={ + + } + /> +
+
+
+ + ( + +
{ + if (props.zoom?.history.length) { + props.onZoomChange?.({ + history: [...props.zoom.history].slice(0, -1), + }); + } + }} + > + {props.zoom?.history.length ? ( + + + + ) : null} + +
+
+ )} + component={ + + } + /> +
+
+ + {/* TODO add ability to open modals in ControlPopover component and change the name of the ControlPopover to more general*/} + +
+ +
+
+ {openExportModal && ( + + ) : null + } + > + + + )} +
+
+
+ ); +} + +export default Controls; diff --git a/src/src/pages/Metrics/components/MetricsBar/MetricsBar.scss b/src/src/pages/Metrics/components/MetricsBar/MetricsBar.scss new file mode 100644 index 00000000..69332811 --- /dev/null +++ b/src/src/pages/Metrics/components/MetricsBar/MetricsBar.scss @@ -0,0 +1,35 @@ +@use 'src/styles/abstracts' as *; + +.MetricsBar { + &__item__bookmark { + margin-right: $space-xxxs; + padding: 0 $space-xs !important; + &__Text { + margin-right: 0.625rem; + } + + &__Icon { + color: $text-color; + } + } + &__menu { + border-left: $border-main; + padding: 0 $space-xxxs; + height: 100%; + display: flex; + align-items: center; + span { + cursor: pointer; + } + } + &__popover { + width: 16rem; + padding: $space-xs; + display: flex; + flex-direction: column; + a { + text-decoration: none; + color: inherit; + } + } +} diff --git a/src/src/pages/Metrics/components/MetricsBar/MetricsBar.tsx b/src/src/pages/Metrics/components/MetricsBar/MetricsBar.tsx new file mode 100644 index 00000000..cb3bd1a5 --- /dev/null +++ b/src/src/pages/Metrics/components/MetricsBar/MetricsBar.tsx @@ -0,0 +1,155 @@ +import React from 'react'; +import { useRouteMatch } from 'react-router-dom'; + +import { MenuItem } from '@material-ui/core'; + +import BookmarkForm from 'components/BookmarkForm/BookmarkForm'; +import AppBar from 'components/AppBar/AppBar'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import LiveUpdateSettings from 'components/LiveUpdateSettings/LiveUpdateSettings'; +import { Button, Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import ConfirmModal from 'components/ConfirmModal/ConfirmModal'; + +import { DOCUMENTATIONS } from 'config/references'; + +import { IMetricsBarProps } from 'types/pages/metrics/components/MetricsBar/MetricsBar'; + +import './MetricsBar.scss'; + +function MetricsBar({ + title, + explorerName = 'METRICS', + liveUpdateConfig, + disabled, + onBookmarkCreate, + onBookmarkUpdate, + onResetConfigData, + onLiveUpdateConfigChange, +}: IMetricsBarProps): React.FunctionComponentElement { + const [popover, setPopover] = React.useState(''); + + const route = useRouteMatch(); + + function handleBookmarkClick(value: string): void { + setPopover(value); + } + + function handleClosePopover(): void { + setPopover(''); + } + + function handleBookmarkUpdate(): void { + onBookmarkUpdate(route.params.appId); + handleClosePopover(); + } + + return ( + + + + {route.params.appId ? ( + + ( + + )} + component={ +
+ handleBookmarkClick('create')}> + Create Bookmark + + handleBookmarkClick('update')}> + Update Bookmark + +
+ } + /> +
+ ) : ( + + )} +
+ + ( + + )} + component={ +
+ + Reset Controls to System Defaults + + + Explorer Documentation + +
+ } + /> +
+
+ + + + } + title='Update bookmark' + statusType='success' + confirmBtnText='Update' + /> +
+
+ ); +} + +export default React.memo(MetricsBar); diff --git a/src/src/pages/Metrics/components/MetricsTableGrid/MetricsTableGrid.tsx b/src/src/pages/Metrics/components/MetricsTableGrid/MetricsTableGrid.tsx new file mode 100644 index 00000000..46b911ac --- /dev/null +++ b/src/src/pages/Metrics/components/MetricsTableGrid/MetricsTableGrid.tsx @@ -0,0 +1,589 @@ +import moment from 'moment'; +import _ from 'lodash-es'; +import * as React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import TableSortIcons from 'components/Table/TableSortIcons'; +import { Badge, Button, Icon } from 'components/kit'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import JsonViewPopover from 'components/kit/JsonViewPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import RunNameColumn from 'components/Table/RunNameColumn'; +import GroupedColumnHeader from 'components/Table/GroupedColumnHeader'; +import AttachedTagsList from 'components/AttachedTagsList/AttachedTagsList'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import COLORS from 'config/colors/colors'; +import { TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { TABLE_DEFAULT_CONFIG } from 'config/table/tableConfigs'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { IOnGroupingSelectChangeParams } from 'types/services/models/metrics/metricsAppModel'; +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { + AggregationAreaMethods, + AggregationLineMethods, +} from 'utils/aggregateGroupData'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import contextToString from 'utils/contextToString'; +import { formatValue } from 'utils/formatValue'; +import { SortActionTypes, SortField, SortFields } from 'utils/getSortedFields'; +import getColumnOptions from 'utils/getColumnOptions'; + +function getMetricsTableColumns( + paramColumns: string[] = [], + groupingSelectOptions: IGroupingSelectOption[], + groupFields: { [key: string]: unknown } | null, + order: { left: string[]; middle: string[]; right: string[] }, + hiddenColumns: string[], + aggregationMethods?: { + area: AggregationAreaMethods; + line: AggregationLineMethods; + }, + sortFields?: SortFields, + onSort?: ({ sortFields, order, index, actionType }: any) => void, + grouping?: { [key: string]: string[] }, + onGroupingToggle?: (params: IOnGroupingSelectChangeParams) => void, +): ITableColumn[] { + let columns: ITableColumn[] = [ + { + key: 'experiment', + content: Name, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment') + ? 'left' + : order?.middle?.includes('experiment') + ? null + : order?.right?.includes('experiment') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + 'run.props.experiment.name', + ), + }, + { + key: 'experiment_description', + content: Description, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment_description') + ? 'left' + : order?.right?.includes('experiment_description') + ? 'right' + : null, + }, + { + key: 'hash', + content: Hash, + topHeader: 'Run', + pin: order?.left?.includes('hash') + ? 'left' + : order?.middle?.includes('hash') + ? null + : order?.right?.includes('hash') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + 'run.hash', + ), + }, + { + key: 'run', + content: Name, + topHeader: 'Run', + pin: order?.left?.includes('run') + ? 'left' + : order?.middle?.includes('run') + ? null + : order?.right?.includes('run') + ? 'right' + : 'left', + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + 'run.props.name', + ), + }, + + { + key: 'description', + content: Description, + topHeader: 'Run', + pin: order?.left?.includes('description') + ? 'left' + : order?.right?.includes('description') + ? 'right' + : null, + }, + { + key: 'date', + content: Date, + topHeader: 'Run', + pin: order?.left?.includes('date') + ? 'left' + : order?.right?.includes('date') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + 'run.props.creation_time', + ), + }, + { + key: 'duration', + content: Duration, + topHeader: 'Run', + pin: order?.left?.includes('duration') + ? 'left' + : order?.right?.includes('duration') + ? 'right' + : null, + }, + { + key: 'tags', + content: Tags, + topHeader: 'Run', + pin: order?.left?.includes('tags') + ? 'left' + : order?.right?.includes('tags') + ? 'right' + : null, + }, + { + key: 'metric', + content: Name, + topHeader: 'Metric', + pin: order?.left?.includes('metric') + ? 'left' + : order?.right?.includes('metric') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + 'name', + ), + }, + { + key: 'context', + content: Context, + topHeader: 'Metric', + pin: order?.left?.includes('context') + ? 'left' + : order?.right?.includes('context') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + 'context', + ), + }, + { + key: 'value', + content: groupFields ? ( +
+ Group Min + + {aggregationMethods!.line === AggregationLineMethods.MEAN + ? 'Mean' + : aggregationMethods!.line === AggregationLineMethods.MEDIAN + ? 'Median' + : aggregationMethods!.line === AggregationLineMethods.MIN + ? 'Min' + : 'Max'} + + Group Max + {aggregationMethods!.area === AggregationAreaMethods.STD_DEV && ( + Std. Dev. + )} + {aggregationMethods!.area === AggregationAreaMethods.STD_ERR && ( + Std. Err. + )} +
+ ) : ( + Value + ), + topHeader: groupFields ? 'Value' : 'Metric', + pin: order?.left?.includes('value') + ? 'left' + : order?.right?.includes('value') + ? 'right' + : null, + }, + { + key: 'step', + content: Step, + topHeader: 'Metric', + pin: order?.left?.includes('step') + ? 'left' + : order?.right?.includes('step') + ? 'right' + : null, + }, + { + key: 'epoch', + content: Epoch, + topHeader: 'Metric', + pin: order?.left?.includes('epoch') + ? 'left' + : order?.right?.includes('epoch') + ? 'right' + : null, + }, + { + key: 'time', + content: Time, + topHeader: 'Metric', + pin: order?.left?.includes('time') + ? 'left' + : order?.right?.includes('time') + ? 'right' + : null, + }, + { + key: 'actions', + content: '', + topHeader: '', + pin: 'right', + }, + ].concat( + paramColumns.map((param) => { + const paramKey = `run.params.${param}`; + const sortItemIndex: number = + sortFields?.findIndex((value: SortField) => value.value === paramKey) ?? + -1; + return { + key: param, + content: ( + + {param} + {onSort && ( + + onSort({ + sortFields, + index: sortItemIndex, + field: + sortItemIndex === -1 + ? groupingSelectOptions.find( + (value) => value.value === paramKey, + ) + : sortFields?.[sortItemIndex], + actionType: + sortFields?.[sortItemIndex]?.order === 'desc' + ? SortActionTypes.DELETE + : SortActionTypes.ORDER_TABLE_TRIGGER, + }) + } + sort={ + !_.isNil(sortFields?.[sortItemIndex]) + ? sortFields?.[sortItemIndex]?.order ?? null + : null + } + /> + )} + + ), + topHeader: 'Run Params', + pin: order?.left?.includes(param) + ? 'left' + : order?.right?.includes(param) + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + AppNameEnum.METRICS!, + paramKey, + ), + }; + }), + ); + + const columnsOrder = order?.left.concat(order.middle).concat(order.right); + columns.sort((a, b) => { + if (a.key === '#') { + return -1; + } else if (a.key === 'actions') { + return 1; + } else if (b.key === 'actions') { + return -1; + } + if (!columnsOrder.includes(a.key) && !columnsOrder.includes(b.key)) { + return 0; + } else if (!columnsOrder.includes(a.key)) { + return 1; + } else if (!columnsOrder.includes(b.key)) { + return -1; + } + return columnsOrder.indexOf(a.key) - columnsOrder.indexOf(b.key); + }); + + if (groupFields) { + columns = [ + { + key: '#', + content: '', + topHeader: 'Group', + pin: 'left', + }, + { + key: 'groups', + content: ( +
+ {Object.keys(groupFields).map((field) => { + let name: string = field.replace('run.params.', ''); + name = name.replace( + 'run.props.experiment.name', + 'run.props.experiment', + ); + name = name.replace('run.props', 'run'); + return ( + + {name} + + ); + })} +
+ ), + pin: order?.left?.includes('groups') + ? 'left' + : order?.right?.includes('groups') + ? 'right' + : null, + topHeader: 'Group Config', + }, + ...columns, + ]; + } + columns = columns.map((col) => ({ + ...col, + isHidden: + !TABLE_DEFAULT_CONFIG.metrics.nonHidableColumns.has(col.key) && + hiddenColumns.includes(col.key), + })); + return columns; +} + +const TagsColumn = (props: { + runHash: string; + tags: ITagInfo[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + headerRenderer: () => React.ReactNode; + addTagButtonSize: 'xxSmall' | 'xSmall'; +}) => { + return ; +}; + +function metricsTableRowRenderer( + rowData: any, + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void, + actions?: { [key: string]: (e: any) => void }, + groupHeaderRow = false, + columns: string[] = [], +) { + if (groupHeaderRow) { + const row: { [key: string]: any } = {}; + for (let i = 0; i < columns.length; i++) { + const col = columns[i]; + if (col === 'metric') { + let metricName: string = isSystemMetric(rowData[col]) + ? formatSystemMetricName(rowData[col]) + : rowData[col]; + row.metric = { + content: + Array.isArray(rowData.metric) && rowData.metric.length > 1 ? ( + + ) : ( + {metricName} + ), + }; + } else if (col === 'context') { + row[col] = { + content: + rowData.context.length > 1 ? ( + + ) : ( + + ), + }; + } else if (col === 'value') { + row.value = { + content: ( +
+ {rowData.aggregation.area.min} + {rowData.aggregation.line} + {rowData.aggregation.area.max} + {!_.isNil(rowData.aggregation.area.stdDevValue) && ( + + {rowData.aggregation.area.stdDevValue} + + )} + {!_.isNil(rowData.aggregation.area.stdErrValue) && ( + + {rowData.aggregation.area.stdErrValue} + + )} +
+ ), + }; + } else if (col === 'groups') { + row.groups = { + content: ( + +
+ {Object.keys(rowData[col]).map((item) => { + const value: string | { [key: string]: unknown } = + rowData[col][item]; + return _.isObject(value) ? ( + ( + + + {contextToString(value)} + + + )} + component={} + /> + ) : ( + +
{formatValue(value)}
+
+ ); + })} +
+
+ ), + }; + } else if (['step', 'epoch'].includes(col)) { + row[col] = + rowData[col] === null + ? '-' + : Array.isArray(rowData[col]) + ? '' + : rowData[col]; + } else if (col === 'time') { + row[col] = + rowData.time === null + ? '-' + : Array.isArray(rowData.time) + ? '' + : moment(rowData.time).format(TABLE_DATE_FORMAT); + } else if (Array.isArray(rowData[col])) { + row[col] = { + content: , + }; + } + } + + return _.merge({}, rowData, row); + } else { + const row = { + experiment: { + content: ( + + ), + }, + run: { + content: ( +
+ + )} + + + )} + + + + {notifyData?.length > 0 && ( + + )} + + ); +}; + +export default React.memo(Params); diff --git a/src/src/pages/Params/ParamsContainer.tsx b/src/src/pages/Params/ParamsContainer.tsx new file mode 100644 index 00000000..7c2f39a0 --- /dev/null +++ b/src/src/pages/Params/ParamsContainer.tsx @@ -0,0 +1,199 @@ +import React from 'react'; +import { useHistory, useRouteMatch } from 'react-router-dom'; +import { useResizeObserver, usePanelResize, useModel } from 'hooks'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import paramsAppModel from 'services/models/params/paramsAppModel'; +import * as analytics from 'services/analytics'; +import { AppNameEnum } from 'services/models/explorer'; + +import { IParamsAppModelState } from 'types/services/models/params/paramsAppModel'; +import { ITableRef } from 'types/components/Table/Table'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { IApiRequest } from 'types/services/services'; + +import getStateFromUrl from 'utils/getStateFromUrl'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import setComponentRefs from 'utils/app/setComponentRefs'; +import manageSystemMetricColumns from 'utils/app/manageSystemMetricColumns'; + +import Params from './Params'; + +function ParamsContainer(): React.FunctionComponentElement { + const tableRef = React.useRef(null); + const chartPanelRef = React.useRef(null); + const chartElemRef = React.useRef(null); + const tableElemRef = React.useRef(null); + const wrapperElemRef = React.useRef(null); + const resizeElemRef = React.useRef(null); + const paramsData = + useModel>(paramsAppModel); + const route = useRouteMatch(); + const history = useHistory(); + const [chartPanelOffsetHeight, setChartPanelOffsetHeight] = React.useState( + chartElemRef?.current?.offsetWidth, + ); + const panelResizing = usePanelResize( + wrapperElemRef, + chartElemRef, + tableElemRef, + resizeElemRef, + paramsData?.config?.table, + paramsAppModel.onTableResizeEnd, + ); + + useResizeObserver(() => { + if (chartElemRef?.current?.offsetHeight !== chartPanelOffsetHeight) { + setChartPanelOffsetHeight(chartElemRef?.current?.offsetHeight); + } + }, chartElemRef); + + React.useEffect(() => { + if (tableRef.current && chartPanelRef.current) { + setComponentRefs({ + model: paramsAppModel, + refElement: { + tableRef, + chartPanelRef, + }, + }); + } + if (paramsData?.rawData?.length > 0) { + manageSystemMetricColumns(paramsAppModel); + } + }, [paramsData?.rawData]); + + React.useEffect(() => { + paramsAppModel.initialize(route.params.appId); + let appRequestRef: IApiRequest; + let paramsRequestRef: IApiRequest; + if (route.params.appId) { + appRequestRef = paramsAppModel.getAppConfigData(route.params.appId); + appRequestRef + .call((detail: any) => { + exceptionHandler({ detail, model: paramsAppModel }); + }) + .then(() => { + paramsAppModel.setDefaultAppConfigData(false); + paramsRequestRef = paramsAppModel.getParamsData(); + paramsRequestRef.call((detail: any) => { + exceptionHandler({ detail, model: paramsAppModel }); + }); + }); + } else { + paramsAppModel.setDefaultAppConfigData(); + paramsRequestRef = paramsAppModel.getParamsData(); + paramsRequestRef.call((detail: any) => { + exceptionHandler({ detail, model: paramsAppModel }); + }); + } + + analytics.pageView(ANALYTICS_EVENT_KEYS.params.pageView); + + const unListenHistory = history.listen(() => { + if (!!paramsData?.config) { + if ( + (paramsData.config.grouping !== getStateFromUrl('grouping') || + paramsData.config.chart !== getStateFromUrl('chart') || + paramsData.config.select !== getStateFromUrl('select')) && + history.location.pathname === `/${AppNameEnum.PARAMS}` + ) { + paramsAppModel.setDefaultAppConfigData(); + paramsAppModel.updateModelData(); + } + } + }); + return () => { + paramsAppModel.destroy(); + paramsRequestRef?.abort(); + unListenHistory(); + if (appRequestRef) { + appRequestRef.abort(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + + ); +} + +export default ParamsContainer; diff --git a/src/src/pages/Params/components/Controls/Controls.scss b/src/src/pages/Params/components/Controls/Controls.scss new file mode 100644 index 00000000..4e948b9e --- /dev/null +++ b/src/src/pages/Params/components/Controls/Controls.scss @@ -0,0 +1,54 @@ +@use 'src/styles/abstracts' as *; + +.Params__Controls__container { + padding: 0.75rem 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + overflow: auto; + + & > div { + margin-bottom: 0.375rem; + + &:last-child { + margin-bottom: 0; + } + } +} + +.Params__Controls__icon { + color: $pico-70; + font-size: 1.125rem; + + &.active { + color: $primary-color; + } +} + +.Params__Controls__anchor { + height: 2.25rem; + width: 2.25rem; + display: flex; + cursor: pointer; + position: relative; + align-items: center; + justify-content: center; + transition: background-color 0.18s ease-out; + border: 0.0625rem solid transparent; + border-radius: $border-radius-main; + + &.active { + background-color: $primary-color-10; + &.outlined { + border: $border-main-active; + } + } + + &:hover { + background-color: $pico-5; + .icon-arrow-left { + opacity: 1; + } + } +} diff --git a/src/src/pages/Params/components/Controls/Controls.tsx b/src/src/pages/Params/components/Controls/Controls.tsx new file mode 100644 index 00000000..014e4e2a --- /dev/null +++ b/src/src/pages/Params/components/Controls/Controls.tsx @@ -0,0 +1,107 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import TooltipContentPopover from 'components/TooltipContentPopover/TooltipContentPopover'; +import { Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import { IControlProps } from 'types/pages/params/components/Controls/Controls'; + +import { CurveEnum } from 'utils/d3'; + +import './Controls.scss'; + +function Controls( + props: IControlProps, +): React.FunctionComponentElement { + const tooltipChanged: boolean = React.useMemo(() => { + return ( + props.tooltip?.appearance !== + CONTROLS_DEFAULT_CONFIG.params.tooltip.appearance || + props.tooltip?.selectedFields?.length !== + CONTROLS_DEFAULT_CONFIG.params.tooltip.selectedFields.length + ); + }, [props.tooltip]); + return ( + +
+ +
+ +
+
+ +
+ +
+
+
+ + ( + +
+ {/*TODO need to change icon */} + +
+
+ )} + component={ + + } + /> +
+
+
+
+ ); +} + +export default Controls; diff --git a/src/src/pages/Params/components/ParamsTableGrid/ParamsTableGrid.tsx b/src/src/pages/Params/components/ParamsTableGrid/ParamsTableGrid.tsx new file mode 100644 index 00000000..60dae1e3 --- /dev/null +++ b/src/src/pages/Params/components/ParamsTableGrid/ParamsTableGrid.tsx @@ -0,0 +1,526 @@ +import _ from 'lodash-es'; +import * as React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import { Badge, Button, Icon, JsonViewPopover } from 'components/kit'; +import TableSortIcons from 'components/Table/TableSortIcons'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import RunNameColumn from 'components/Table/RunNameColumn'; +import GroupedColumnHeader from 'components/Table/GroupedColumnHeader'; +import AttachedTagsList from 'components/AttachedTagsList/AttachedTagsList'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import COLORS from 'config/colors/colors'; +import { TABLE_DEFAULT_CONFIG } from 'config/table/tableConfigs'; +import { MetricsValueKeyEnum } from 'config/enums/tableEnums'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { IOnGroupingSelectChangeParams } from 'types/services/models/metrics/metricsAppModel'; +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import alphabeticalSortComparator from 'utils/alphabeticalSortComparator'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import contextToString from 'utils/contextToString'; +import { formatValue } from 'utils/formatValue'; +import { SortActionTypes, SortField } from 'utils/getSortedFields'; +import getColumnOptions from 'utils/getColumnOptions'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import { getMetricLabel } from 'utils/app/getMetricLabel'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +function getParamsTableColumns( + sortOptions: IGroupingSelectOption[], + metricsColumns: any, + paramColumns: string[] = [], + groupFields: { [key: string]: unknown } | null, + order: { left: string[]; middle: string[]; right: string[] }, + hiddenColumns: string[], + metricsValueKey: MetricsValueKeyEnum = MetricsValueKeyEnum.LAST, + sortFields?: any[], + onSort?: ({ sortFields, order, index, actionType }: any) => void, + grouping?: { [key: string]: string[] }, + onGroupingToggle?: (params: IOnGroupingSelectChangeParams) => void, + appName?: AppNameEnum, +): ITableColumn[] { + let columns: ITableColumn[] = [ + { + key: 'experiment', + content: Name, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment') + ? 'left' + : order?.middle?.includes('experiment') + ? null + : order?.right?.includes('experiment') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + appName!, + 'run.props.experiment.name', + ), + }, + { + key: 'experiment_description', + content: Description, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment_description') + ? 'left' + : order?.middle?.includes('experiment_description') + ? null + : order?.right?.includes('experiment_description') + ? 'right' + : null, + }, + { + key: 'hash', + content: Hash, + topHeader: 'Run', + pin: order?.left?.includes('hash') + ? 'left' + : order?.middle?.includes('hash') + ? null + : order?.right?.includes('hash') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + appName!, + 'run.hash', + ), + }, + { + key: 'run', + content: Name, + topHeader: 'Run', + pin: order?.left?.includes('run') + ? 'left' + : order?.middle?.includes('run') + ? null + : order?.right?.includes('run') + ? 'right' + : 'left', + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + appName!, + 'run.props.name', + ), + }, + + { + key: 'description', + content: Description, + topHeader: 'Run', + pin: order?.left?.includes('description') + ? 'left' + : order?.middle?.includes('description') + ? null + : order?.right?.includes('description') + ? 'right' + : null, + }, + { + key: 'date', + content: Date, + topHeader: 'Run', + pin: order?.left?.includes('date') + ? 'left' + : order?.middle?.includes('date') + ? null + : order?.right?.includes('date') + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + appName!, + 'run.props.experiment.name', + ), + }, + { + key: 'duration', + content: Duration, + topHeader: 'Run', + pin: order?.left?.includes('duration') + ? 'left' + : order?.right?.includes('duration') + ? 'right' + : null, + }, + { + key: 'tags', + content: Tags, + topHeader: 'Run', + pin: order?.left?.includes('tags') + ? 'left' + : order?.right?.includes('tags') + ? 'right' + : null, + }, + { + key: 'actions', + content: '', + topHeader: '', + pin: 'right', + }, + ].concat( + Object.keys(metricsColumns).reduce((acc: any, metricName: string) => { + const systemMetricsList: ITableColumn[] = []; + const isSystem = isSystemMetric(metricName); + const metricsList: ITableColumn[] = []; + Object.keys(metricsColumns[metricName]).forEach((metricContext) => { + const metricHash = getMetricHash(metricName, metricContext); + const metricLabel = getMetricLabel(metricName, metricContext); + + const sortValueKey = `metricsValues.${metricHash}.${metricsValueKey}`; + const sortItemIndex: number = + sortFields?.findIndex((value: SortField) => { + return value.value === sortValueKey; + }) ?? -1; + let column = { + key: metricHash, + label: metricLabel, + content: isSystem ? ( + + {formatSystemMetricName(metricName)} + {onSort && ( + + onSort({ + sortFields, + index: sortItemIndex, + field: + sortItemIndex === -1 + ? sortOptions.find( + (value) => value.value === sortValueKey, + ) + : (sortFields?.[sortItemIndex] as SortField), + actionType: + sortFields?.[sortItemIndex]?.order === 'desc' + ? SortActionTypes.DELETE + : SortActionTypes.ORDER_TABLE_TRIGGER, + }) + } + sort={ + !_.isNil(sortFields?.[sortItemIndex]) + ? sortFields?.[sortItemIndex]?.order + : null + } + /> + )} + + ) : ( +
+ + {onSort && ( + + onSort({ + sortFields, + index: sortItemIndex, + field: + sortItemIndex === -1 + ? sortOptions.find( + (value) => value.value === sortValueKey, + ) + : (sortFields?.[sortItemIndex] as SortField), + actionType: + sortFields?.[sortItemIndex]?.order === 'desc' + ? SortActionTypes.DELETE + : SortActionTypes.ORDER_TABLE_TRIGGER, + }) + } + sort={ + !_.isNil(sortFields?.[sortItemIndex]) + ? sortFields?.[sortItemIndex]?.order + : null + } + /> + )} +
+ ), + topHeader: isSystem ? 'System Metrics' : metricName, + pin: order?.left?.includes(metricHash) + ? 'left' + : order?.right?.includes(metricHash) + ? 'right' + : null, + }; + isSystem ? systemMetricsList.push(column) : metricsList.push(column); + }); + acc = [ + ...acc, + ...metricsList.sort(alphabeticalSortComparator({ orderBy: 'key' })), + ...systemMetricsList.sort( + alphabeticalSortComparator({ orderBy: 'key' }), + ), + ]; + return acc; + }, []), + paramColumns.map((param) => { + const paramKey = `run.params.${param}`; + const sortItemIndex: number = + sortFields?.findIndex((value: SortField) => value.value === paramKey) ?? + -1; + + return { + key: param, + label: param, + content: ( + + {param} + {onSort && ( + + onSort({ + sortFields, + index: sortItemIndex, + field: + sortItemIndex === -1 + ? sortOptions.find((value) => value.value === paramKey) + : sortFields?.[sortItemIndex], + actionType: + sortFields?.[sortItemIndex]?.order === 'desc' + ? SortActionTypes.DELETE + : SortActionTypes.ORDER_TABLE_TRIGGER, + }) + } + sort={ + !_.isNil(sortFields?.[sortItemIndex]) + ? sortFields?.[sortItemIndex].order + : null + } + /> + )} + + ), + topHeader: 'Run Params', + pin: order?.left?.includes(param) + ? 'left' + : order?.right?.includes(param) + ? 'right' + : null, + columnOptions: getColumnOptions( + grouping!, + onGroupingToggle!, + appName!, + paramKey, + ), + }; + }), + ); + + columns = columns.map((col) => ({ + ...col, + isHidden: + !TABLE_DEFAULT_CONFIG.params.nonHidableColumns.has(col.key) && + hiddenColumns.includes(col.key), + })); + + const columnsOrder = order?.left.concat(order.middle).concat(order.right); + columns.sort((a, b) => { + if (a.key === '#') { + return -1; + } else if (a.key === 'actions') { + return 1; + } else if (b.key === 'actions') { + return -1; + } + if (!columnsOrder.includes(a.key) && !columnsOrder.includes(b.key)) { + return 0; + } else if (!columnsOrder.includes(a.key)) { + return 1; + } else if (!columnsOrder.includes(b.key)) { + return -1; + } + return columnsOrder.indexOf(a.key) - columnsOrder.indexOf(b.key); + }); + if (groupFields) { + columns = [ + { + key: '#', + content: ( + + # + + ), + topHeader: 'Grouping', + pin: 'left', + }, + { + key: 'groups', + content: ( +
+ {Object.keys(groupFields).map((field) => { + let name: string = field.replace('run.params.', ''); + name = name.replace( + 'run.props.experiment.name', + 'run.props.experiment', + ); + name = name.replace('run.props', 'run'); + return ( + +
{name}
+
+ ); + })} +
+ ), + pin: order?.left?.includes('groups') + ? 'left' + : order?.right?.includes('groups') + ? 'right' + : null, + topHeader: 'Group Config', + }, + ...columns, + ]; + } + return columns; +} + +const TagsColumn = (props: { + runHash: string; + tags: ITagInfo[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + headerRenderer: () => React.ReactNode; + addTagButtonSize: 'xxSmall' | 'xSmall'; +}) => { + return ; +}; + +function paramsTableRowRenderer( + rowData: any, + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void, + actions?: { [key: string]: (e: any) => void }, + groupHeaderRow = false, + columns: string[] = [], +) { + if (groupHeaderRow) { + const row: { [key: string]: any } = {}; + for (let i = 0; i < columns.length; i++) { + const col = columns[i]; + if (col === 'groups') { + row.groups = { + content: ( + +
+ {Object.keys(rowData[col]).map((item) => { + const value: string | { [key: string]: unknown } = + rowData[col][item]; + return _.isObject(value) ? ( + ( + + + {contextToString(value)} + + + )} + component={} + /> + ) : ( + +
{formatValue(value)}
+
+ ); + })} +
+
+ ), + }; + } else if (Array.isArray(rowData[col])) { + row[col] = { + content: ( + + + + ), + }; + } + } + return _.merge({}, rowData, row); + } else { + const row = { + experiment: { + content: ( + + ), + }, + run: { + content: ( +
+ + {isInfiniteLoading && ( +
+ +
+ )} + + + ); +} + +export default RunsTable; diff --git a/src/src/pages/Runs/components/RunsBar/RunsBar.tsx b/src/src/pages/Runs/components/RunsBar/RunsBar.tsx new file mode 100644 index 00000000..b51d4d90 --- /dev/null +++ b/src/src/pages/Runs/components/RunsBar/RunsBar.tsx @@ -0,0 +1,63 @@ +import React from 'react'; + +import { MenuItem } from '@material-ui/core'; + +import AppBar from 'components/AppBar/AppBar'; +import LiveUpdateSettings from 'components/LiveUpdateSettings/LiveUpdateSettings'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import { Button, Icon } from 'components/kit'; +import ControlPopover from 'components/ControlPopover/ControlPopover'; + +import pageTitlesEnum from 'config/pageTitles/pageTitles'; +import { DOCUMENTATIONS } from 'config/references'; + +import 'pages/Metrics/components/MetricsBar/MetricsBar.scss'; + +function RunsBar(props: { + enabled: boolean; + delay: number; + onLiveUpdateConfigChange: () => void; + disabled: boolean; +}): React.FunctionComponentElement { + return ( + + + +
+ + ( + + )} + component={ + + } + /> + +
+
+
+ ); +} + +export default React.memo(RunsBar); diff --git a/src/src/pages/Runs/components/RunsTableGrid/RunsTableGrid.tsx b/src/src/pages/Runs/components/RunsTableGrid/RunsTableGrid.tsx new file mode 100644 index 00000000..5f69822f --- /dev/null +++ b/src/src/pages/Runs/components/RunsTableGrid/RunsTableGrid.tsx @@ -0,0 +1,262 @@ +import * as React from 'react'; +import { merge } from 'lodash-es'; + +import { Badge } from 'components/kit'; +import RunNameColumn from 'components/Table/RunNameColumn'; +import GroupedColumnHeader from 'components/Table/GroupedColumnHeader'; +import AttachedTagsList from 'components/AttachedTagsList/AttachedTagsList'; +import ExperimentNameBox from 'components/ExperimentNameBox'; + +import COLORS from 'config/colors/colors'; +import { TABLE_DEFAULT_CONFIG } from 'config/table/tableConfigs'; + +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import alphabeticalSortComparator from 'utils/alphabeticalSortComparator'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import { getMetricLabel } from 'utils/app/getMetricLabel'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +function getRunsTableColumns( + metricsColumns: any, + runColumns: string[] = [], + order: { left: string[]; middle: string[]; right: string[] }, + hiddenColumns: string[], +): ITableColumn[] { + let columns: ITableColumn[] = [ + { + key: 'experiment', + content: Name, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment') + ? 'left' + : order?.middle?.includes('experiment') + ? null + : order?.right?.includes('experiment') + ? 'right' + : null, + }, + { + key: 'experiment_description', + content: Description, + topHeader: 'Experiment', + pin: order?.left?.includes('experiment_description') + ? 'left' + : order?.middle?.includes('experiment_description') + ? null + : order?.right?.includes('experiment_description') + ? 'right' + : null, + }, + { + key: 'hash', + content: Hash, + topHeader: 'Run', + pin: order?.left?.includes('hash') + ? 'left' + : order?.middle?.includes('hash') + ? null + : order?.right?.includes('hash') + ? 'right' + : null, + }, + { + key: 'run', + content: Name, + topHeader: 'Run', + pin: order?.left?.includes('run') + ? 'left' + : order?.middle?.includes('run') + ? null + : order?.right?.includes('run') + ? 'right' + : 'left', + }, + { + key: 'description', + content: Description, + topHeader: 'Run', + pin: order?.left?.includes('description') + ? 'left' + : order?.middle?.includes('description') + ? null + : order?.right?.includes('description') + ? 'right' + : null, + }, + { + key: 'date', + content: Date, + topHeader: 'Run', + pin: order?.left?.includes('date') + ? 'left' + : order?.middle?.includes('date') + ? null + : order?.right?.includes('date') + ? 'right' + : null, + }, + { + key: 'duration', + content: Duration, + topHeader: 'Run', + pin: order?.left?.includes('date') + ? 'left' + : order?.right?.includes('date') + ? 'right' + : null, + }, + { + key: 'tags', + content: Tags, + topHeader: 'Run', + pin: order?.left?.includes('tags') + ? 'left' + : order?.right?.includes('tags') + ? 'right' + : null, + }, + ].concat( + Object.keys(metricsColumns).reduce((acc: any, metricName: string) => { + const systemMetricsList: ITableColumn[] = []; + const isSystem = isSystemMetric(metricName); + const metricsList: ITableColumn[] = []; + Object.keys(metricsColumns[metricName]).forEach((metricContext) => { + const metricHash = getMetricHash(metricName, metricContext); + const metricLabel = getMetricLabel(metricName, metricContext); + + let column = { + key: metricHash, + label: metricLabel, + content: isSystem ? ( + {formatSystemMetricName(metricName)} + ) : ( + + ), + topHeader: isSystem ? 'System Metrics' : metricName, + pin: order?.left?.includes(metricHash) + ? 'left' + : order?.right?.includes(metricHash) + ? 'right' + : null, + }; + isSystem ? systemMetricsList.push(column) : metricsList.push(column); + }); + acc = [ + ...acc, + ...metricsList.sort(alphabeticalSortComparator({ orderBy: 'key' })), + ...systemMetricsList.sort( + alphabeticalSortComparator({ orderBy: 'key' }), + ), + ]; + return acc; + }, []), + runColumns.map((param) => ({ + key: param, + content: {param}, + topHeader: 'Run Params', + pin: order?.left?.includes(param) + ? 'left' + : order?.right?.includes(param) + ? 'right' + : null, + })), + ); + + columns = columns.map((col) => ({ + ...col, + isHidden: + !TABLE_DEFAULT_CONFIG.runs.nonHidableColumns.has(col.key) && + hiddenColumns.includes(col.key), + })); + + const columnsOrder = order?.left.concat(order.middle).concat(order.right); + columns.sort((a, b) => { + if (!columnsOrder.includes(a.key) && !columnsOrder.includes(b.key)) { + return 0; + } else if (!columnsOrder.includes(a.key)) { + return 1; + } else if (!columnsOrder.includes(b.key)) { + return -1; + } + return columnsOrder.indexOf(a.key) - columnsOrder.indexOf(b.key); + }); + + return columns; +} + +const TagsColumn = (props: { + runHash: string; + tags: ITagInfo[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + headerRenderer: () => React.ReactNode; + addTagButtonSize: 'xxSmall' | 'xSmall'; +}) => { + return ; +}; + +function runsTableRowRenderer( + rowData: any, + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void, + groupHeaderRow = false, + columns: string[] = [], +) { + if (groupHeaderRow) { + const row: { [key: string]: any } = {}; + for (let i = 0; i < columns.length; i++) { + const col = columns[i]; + if (Array.isArray(rowData[col])) { + row[col] = { + content: , + }; + } + } + + return merge({}, rowData, row); + } else { + const row = { + experiment: { + content: ( + + ), + }, + run: { + content: ( + + ), + }, + tags: { + content: ( + <>} + addTagButtonSize='xxSmall' + /> + ), + }, + actions: { + content: null, + }, + }; + + return merge({}, rowData, row); + } +} + +export { getRunsTableColumns, runsTableRowRenderer }; diff --git a/src/src/pages/Runs/components/SearchBar/SearchBar.scss b/src/src/pages/Runs/components/SearchBar/SearchBar.scss new file mode 100644 index 00000000..70863ec7 --- /dev/null +++ b/src/src/pages/Runs/components/SearchBar/SearchBar.scss @@ -0,0 +1,12 @@ +@use 'src/styles/abstracts' as *; + +.Runs_Search_Bar { + display: flex; + border-bottom: $border-main; + padding: 1rem 1.5rem; + align-items: center; + + form { + width: 100%; + } +} diff --git a/src/src/pages/Runs/components/SearchBar/SearchBar.tsx b/src/src/pages/Runs/components/SearchBar/SearchBar.tsx new file mode 100644 index 00000000..38981c58 --- /dev/null +++ b/src/src/pages/Runs/components/SearchBar/SearchBar.tsx @@ -0,0 +1,94 @@ +import React from 'react'; + +import { Divider } from '@material-ui/core'; + +import { Button, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import AutocompleteInput from 'components/AutocompleteInput'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import runAppModel from 'services/models/runs/runsAppModel'; +import { trackEvent } from 'services/analytics'; + +import exceptionHandler from 'utils/app/exceptionHandler'; + +import './SearchBar.scss'; + +function SearchBar({ + selectFormData, + isRunsDataLoading, + searchValue, + onSearchInputChange, + isDisabled, +}: any) { + const searchRunsRef = React.useRef(null); + const autocompleteRef: any = React.useRef>(null); + React.useEffect(() => { + return () => { + searchRunsRef.current?.abort(); + }; + }, []); + + const handleRunSearch = React.useCallback(() => { + if (isRunsDataLoading) { + return; + } + const query = autocompleteRef?.current?.getValue(); + onSearchInputChange(query ?? ''); + searchRunsRef.current = runAppModel.getRunsData( + true, + true, + true, + query ?? '', + ); + searchRunsRef.current + .call((detail: any) => { + exceptionHandler({ detail, model: runAppModel }); + }) + .catch(); + trackEvent(ANALYTICS_EVENT_KEYS.runs.searchClick); + }, [isRunsDataLoading, onSearchInputChange]); + + function handleRequestAbort(e: React.SyntheticEvent): void { + e.preventDefault(); + if (!isRunsDataLoading) { + return; + } + searchRunsRef.current?.abort(); + runAppModel.abortRequest(); + } + return ( + +
+
+ + + + +
+
+ ); +} + +export default SearchBar; diff --git a/src/src/pages/Scatters/Scatters.scss b/src/src/pages/Scatters/Scatters.scss new file mode 100644 index 00000000..8726991f --- /dev/null +++ b/src/src/pages/Scatters/Scatters.scss @@ -0,0 +1,94 @@ +@use 'src/styles/abstracts' as *; + +.Scatters__section { + height: 100vh; + overflow: hidden; + .Scatters__loader { + flex-direction: column; + justify-content: space-between; + } + .Scatters__visualization { + display: flex; + position: relative; + flex-direction: column; + flex: 1 100%; + max-height: calc(100% - #{toRem(136px)}); + .ProgressBar { + padding-bottom: toRem(136px); + } + } +} + +.Scatters__container { + background-color: #ffffff; + min-width: 50rem; + .Scatters__fullHeight { + height: 100%; + } + .Scatters__section__appBarContainer { + display: flex; + flex-direction: column; + } + .Scatters__chart__container { + flex: 0.5 1 0; + min-height: 11.25rem; + &.fullHeight { + flex: 1 100% !important; + } + &.hide { + display: none; + } + } + .Scatters__ResizePanel { + &__hide { + display: none; + } + } + .Scatters__table__container { + flex: 0.5 1 0; + min-height: 11rem; + &.fullHeight { + flex: 1 100% !important; + } + &.hide { + display: none; + } + } +} + +.Scatters__SelectForm__Grouping__container { + display: flex; + border-bottom: $border-main; + min-height: 6rem; + max-height: 6rem; +} + +.Scatters__table__aggregationColumn__cell { + display: flex; + flex: 1; + + span { + display: inline-block; + width: toRem(120px); + min-width: 120px; + justify-content: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + &:nth-of-type(2) { + padding: 0 0.5rem; + margin: 0 0.5rem; + border-left: $border-separator; + border-right: $border-separator; + } + } +} + +.Table__cell--header { + .Scatters__table__aggregationColumn__cell { + span:last-of-type { + width: calc(120px - 1rem); + } + } +} diff --git a/src/src/pages/Scatters/Scatters.tsx b/src/src/pages/Scatters/Scatters.tsx new file mode 100644 index 00000000..d3e77e78 --- /dev/null +++ b/src/src/pages/Scatters/Scatters.tsx @@ -0,0 +1,253 @@ +import React from 'react'; +import _ from 'lodash-es'; +import classNames from 'classnames'; + +import Table from 'components/Table/Table'; +import ChartPanel from 'components/ChartPanel/ChartPanel'; +import NotificationContainer from 'components/NotificationContainer/NotificationContainer'; +import IllustrationBlock from 'components/IllustrationBlock/IllustrationBlock'; +import ResizePanel from 'components/ResizePanel/ResizePanel'; +import Grouping from 'components/Grouping/Grouping'; +import ProgressBar from 'components/ProgressBar/ProgressBar'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { + RowHeightSize, + VisualizationElementEnum, +} from 'config/table/tableConfigs'; +import GroupingPopovers, { + GroupNameEnum, +} from 'config/grouping/GroupingPopovers'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { + IllustrationsEnum, + Request_Illustrations, +} from 'config/illustrationConfig/illustrationConfig'; + +import AppBar from 'pages/Metrics/components/MetricsBar/MetricsBar'; +import Controls from 'pages/Scatters/components/Controls/Controls'; +import SelectForm from 'pages/Scatters/components/SelectForm/SelectForm'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { IScattersProps } from 'types/pages/scatters/Scatters'; + +import { ChartTypeEnum } from 'utils/d3'; + +import './Scatters.scss'; + +function Scatters( + props: IScattersProps, +): React.FunctionComponentElement { + const [isProgressBarVisible, setIsProgressBarVisible] = + React.useState(false); + const chartProps: any[] = React.useMemo(() => { + return (props.scatterPlotData || []).map((chartData: any) => ({ + chartTitle: props.chartTitleData[chartData.data[0]?.chartIndex], + trendlineOptions: props.trendlineOptions, + })); + }, [props.scatterPlotData, props.chartTitleData, props.trendlineOptions]); + + return ( + +
+
+
+ +
+ + + p.groupName === GroupNameEnum.COLOR || + p.groupName === GroupNameEnum.CHART, + )} + isDisabled={isProgressBarVisible} + groupingData={props.groupingData} + groupingSelectOptions={props.groupingSelectOptions} + onGroupingSelectChange={props.onGroupingSelectChange} + onGroupingModeChange={props.onGroupingModeChange} + onGroupingPaletteChange={props.onGroupingPaletteChange} + onGroupingReset={props.onGroupingReset} + onGroupingApplyChange={props.onGroupingApplyChange} + onGroupingPersistenceChange={props.onGroupingPersistenceChange} + onShuffleChange={props.onShuffleChange} + /> +
+
+ + {_.isEmpty(props.tableData) && + _.isEmpty(props.scatterPlotData) ? ( + + ) : ( + <> +
+ {props.resizeMode === ResizeModeEnum.MaxHeight ? null : ( + + } + /> + )} +
+ +
+ {props.resizeMode === ResizeModeEnum.Hide ? null : ( + +
+ + )} + + + )} + + + + {props.notifyData?.length > 0 && ( + + )} + + + ); +} + +export default React.memo(Scatters); diff --git a/src/src/pages/Scatters/ScattersContainer.tsx b/src/src/pages/Scatters/ScattersContainer.tsx new file mode 100644 index 00000000..8e62270f --- /dev/null +++ b/src/src/pages/Scatters/ScattersContainer.tsx @@ -0,0 +1,206 @@ +import React from 'react'; +import { useHistory, useRouteMatch } from 'react-router-dom'; +import { useModel, usePanelResize, useResizeObserver } from 'hooks'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import scattersAppModel from 'services/models/scatters/scattersAppModel'; +import projectsModel from 'services/models/projects/projectsModel'; +import * as analytics from 'services/analytics'; +import { AppNameEnum } from 'services/models/explorer'; + +import { ITableRef } from 'types/components/Table/Table'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { IProjectsModelState } from 'types/services/models/projects/projectsModel'; +import { IScatterAppModelState } from 'types/services/models/scatter/scatterAppModel'; +import { IApiRequest } from 'types/services/services'; + +import setComponentRefs from 'utils/app/setComponentRefs'; +import getStateFromUrl from 'utils/getStateFromUrl'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import manageSystemMetricColumns from 'utils/app/manageSystemMetricColumns'; + +import Scatters from './Scatters'; + +function ScattersContainer(): React.FunctionComponentElement { + const tableRef = React.useRef(null); + const chartPanelRef = React.useRef(null); + const tableElemRef = React.useRef(null); + const chartElemRef = React.useRef(null); + const wrapperElemRef = React.useRef(null); + const resizeElemRef = React.useRef(null); + const route = useRouteMatch(); + const history = useHistory(); + const scattersData = + useModel>(scattersAppModel); + const [chartPanelOffsetHeight, setChartPanelOffsetHeight] = React.useState( + chartElemRef?.current?.offsetWidth, + ); + const projectsData = useModel>(projectsModel); + const panelResizing = usePanelResize( + wrapperElemRef, + chartElemRef, + tableElemRef, + resizeElemRef, + scattersData?.config?.table, + scattersAppModel.onTableResizeEnd, + ); + + useResizeObserver(() => { + if (chartElemRef?.current?.offsetHeight !== chartPanelOffsetHeight) { + setChartPanelOffsetHeight(chartElemRef?.current?.offsetHeight); + } + }, chartElemRef); + + React.useEffect(() => { + if (tableRef.current && chartPanelRef.current) { + setComponentRefs({ + model: scattersAppModel, + refElement: { + tableRef, + chartPanelRef, + }, + }); + } + if (scattersData?.rawData?.length > 0) { + manageSystemMetricColumns(scattersAppModel); + } + }, [scattersData?.rawData]); + + React.useEffect(() => { + scattersAppModel.initialize(route.params.appId); + let appRequestRef: IApiRequest; + if (route.params.appId) { + appRequestRef = scattersAppModel.getAppConfigData(route.params.appId); + appRequestRef + .call((detail: any) => { + exceptionHandler({ detail, model: scattersAppModel }); + }) + .then(() => { + scattersAppModel.setDefaultAppConfigData(false); + scattersAppModel.getScattersData().call((detail: any) => { + exceptionHandler({ detail, model: scattersAppModel }); + }); + }); + } else { + scattersAppModel.setDefaultAppConfigData(); + } + const scattersRequestRef = scattersAppModel.getScattersData(); + scattersRequestRef.call((detail: any) => { + exceptionHandler({ detail, model: scattersAppModel }); + }); + analytics.pageView(ANALYTICS_EVENT_KEYS.scatters.pageView); + + const unListenHistory = history.listen(() => { + if (!!scattersData?.config) { + if ( + (scattersData.config.grouping !== getStateFromUrl('grouping') || + scattersData.config.chart !== getStateFromUrl('chart') || + scattersData.config.select !== getStateFromUrl('select')) && + history.location.pathname === `/${AppNameEnum.SCATTERS}` + ) { + scattersAppModel.setDefaultAppConfigData(); + scattersAppModel.updateModelData(); + } + } + }); + return () => { + scattersAppModel.destroy(); + scattersRequestRef.abort(); + unListenHistory(); + if (appRequestRef) { + appRequestRef.abort(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + + + + ); +} + +export default ScattersContainer; diff --git a/src/src/pages/Scatters/components/Controls/Controls.scss b/src/src/pages/Scatters/components/Controls/Controls.scss new file mode 100644 index 00000000..0759858f --- /dev/null +++ b/src/src/pages/Scatters/components/Controls/Controls.scss @@ -0,0 +1,86 @@ +@use 'src/styles/abstracts' as *; + +.Controls__container { + padding: 0.75rem 0; + display: flex; + flex-direction: column; + align-items: center; + overflow: auto; + + & > div { + margin-bottom: 0.375rem; + + &:last-child { + margin-bottom: 0; + } + } +} + +.Controls__icon { + color: $pico-70; + font-size: 1.125rem; + &.active { + color: $primary-color; + } +} + +.Controls__anchor { + height: 2.25rem; + width: 2.25rem; + display: flex; + cursor: pointer; + position: relative; + align-items: center; + justify-content: center; + transition: background-color 0.18s ease-out; + border: 0.0625rem solid transparent; + border-radius: $border-radius-main; + + &.active { + background-color: $primary-color-10; + + &.outlined { + border: $border-main-active; + } + } + + &.disabled { + cursor: initial; + i { + color: $pico-50; + } + &:hover { + background-color: transparent; + } + } + + &:hover { + background-color: $pico-5; + + .icon-arrow-left { + opacity: 1; + } + } +} + +.Controls__anchor__arrow { + width: 0.6875rem; + height: 100%; + position: absolute; + left: -0.75rem; + display: flex; + align-items: center; + justify-content: center; + + .icon-arrow-left { + transition: all 0.18s ease-out; + color: $pico-70; + } +} + +.Controls__anchor__arrow--opened { + .icon-arrow-left { + transform: rotate(180deg); + color: $primary-color; + } +} diff --git a/src/src/pages/Scatters/components/Controls/Controls.tsx b/src/src/pages/Scatters/components/Controls/Controls.tsx new file mode 100644 index 00000000..5d8f55f6 --- /dev/null +++ b/src/src/pages/Scatters/components/Controls/Controls.tsx @@ -0,0 +1,154 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; + +import ControlPopover from 'components/ControlPopover/ControlPopover'; +import TooltipContentPopover from 'components/TooltipContentPopover/TooltipContentPopover'; +import { Icon } from 'components/kit'; +import TrendlineOptionsPopover from 'components/TrendlineOptionsPopover'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import ExportPreview from 'components/ExportPreview'; +import ChartGrid from 'components/ChartPanel/ChartGrid'; + +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import { IControlProps } from 'types/pages/scatters/components/Controls/Controls'; + +import './Controls.scss'; + +function Controls( + props: IControlProps, +): React.FunctionComponentElement { + const [openExportModal, setOpenExportModal] = React.useState(false); + + const tooltipChanged: boolean = React.useMemo(() => { + return ( + props.tooltip?.appearance !== + CONTROLS_DEFAULT_CONFIG.scatters.tooltip.appearance || + props.tooltip?.selectedFields?.length !== + CONTROLS_DEFAULT_CONFIG.scatters.tooltip.selectedFields.length + ); + }, [props.tooltip]); + + const onToggleExportPreview = React.useCallback((): void => { + setOpenExportModal((state) => !state); + }, [setOpenExportModal]); + + return ( + +
+ +
+ ( + +
{ + props.onChangeTrendlineOptions({ + isApplied: !props.trendlineOptions?.isApplied, + }); + }} + > + + + + +
+
+ )} + component={ + + } + /> +
+
+ +
+ ( + +
+ +
+
+ )} + component={ + + } + /> +
+
+ + {/* TODO add ability to open modals in ControlPopover component and change the name of the ControlPopover to more general*/} + +
+ +
+
+ {openExportModal && ( + + + + )} +
+
+
+ ); +} + +export default Controls; diff --git a/src/src/pages/Scatters/components/SelectForm/SelectForm.scss b/src/src/pages/Scatters/components/SelectForm/SelectForm.scss new file mode 100644 index 00000000..d5a1f7db --- /dev/null +++ b/src/src/pages/Scatters/components/SelectForm/SelectForm.scss @@ -0,0 +1,127 @@ +@use 'src/styles/abstracts' as *; + +.Scatters__SelectForm { + flex: 1; + padding: 0.725rem 1.5em; + display: flex; + flex-direction: column; + justify-content: space-between; + + &__container__options { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + /* TODO [GA]: Override MUI default styles in a nice way */ + .MuiBox-root { + justify-content: flex-start; + } + } + + &__container__search { + width: 103px; + display: flex; + justify-content: space-between; + flex-direction: column; + } + + &__Popper { + border: $border-main; + width: 40%; + border-radius: $radius-main; + z-index: 1; + color: #586069; + background-color: #ffffff; + .MuiAutocomplete-paper { + box-shadow: unset; + margin: unset; + } + } + + &__option__select { + width: 100%; + + input { + font-family: monospace; + padding: 0.5rem; + font-size: $text-md; + border-bottom: $border-main; + } + } + + &__TextField { + position: relative; + } + + &__textarea { + flex: 1; + .MuiOutlinedInput-multiline.MuiOutlinedInput-marginDense { + padding-top: toRem(7.5px); + padding-bottom: toRem(7.5px); + } + textarea { + font-family: monospace; + } + } + + &__search__button { + width: 100%; + } + + &__search__actions { + display: flex; + justify-content: space-between; + + button { + border: $border-main; + &:nth-child(2) { + margin: 0 0.25rem; + } + &.active { + border: $border-main-active; + background-color: $primary-color-5; + } + } + } + + &__clearAll { + height: 24px; + width: 24px; + background: #e8f1fc; + border-radius: 6px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + position: relative; + &.disabled { + opacity: 0.5; + } + &:after { + content: ''; + position: absolute; + width: 20px; + height: 34px; + background: rgba(255, 255, 255, 0.5); + background: linear-gradient( + 90deg, + rgba(255, 255, 255, 0) 0%, + rgba(255, 255, 255, 1) 92% + ); + left: -20px; + top: -5px; + border-radius: 0; + color: white; + pointer-events: none; + } + + i { + color: #1473e6; + font-size: 10px; + } + } + + .Dropdown { + flex: 1; + } +} diff --git a/src/src/pages/Scatters/components/SelectForm/SelectForm.tsx b/src/src/pages/Scatters/components/SelectForm/SelectForm.tsx new file mode 100644 index 00000000..2f4053de --- /dev/null +++ b/src/src/pages/Scatters/components/SelectForm/SelectForm.tsx @@ -0,0 +1,196 @@ +import React from 'react'; + +import { Box, Divider } from '@material-ui/core'; + +import { Button, Dropdown, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import AutocompleteInput from 'components/AutocompleteInput'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import scattersAppModel from 'services/models/scatters/scattersAppModel'; +import { trackEvent } from 'services/analytics'; + +import { ISelectFormProps } from 'types/pages/scatters/components/SelectForm/SelectForm'; + +import exceptionHandler from 'utils/app/exceptionHandler'; + +import './SelectForm.scss'; + +function SelectForm({ + requestIsPending, + isDisabled = false, + selectedOptionsData, + selectFormData, + onSelectOptionsChange, + onSelectRunQueryChange, +}: ISelectFormProps): React.FunctionComponentElement { + const [open, setOpen] = React.useState({ + x: false, + y: false, + }); + const searchRef = React.useRef(null); + const autocompleteRef: any = React.useRef>(null); + + React.useEffect(() => { + return () => { + searchRef.current?.abort(); + }; + }, []); + + function handleParamsSearch() { + if (requestIsPending) { + return; + } + let query = autocompleteRef?.current?.getValue(); + onSelectRunQueryChange(query ?? ''); + searchRef.current = scattersAppModel.getScattersData(true, query ?? ''); + searchRef.current.call((detail: any) => { + exceptionHandler({ detail, model: scattersAppModel }); + }); + trackEvent(ANALYTICS_EVENT_KEYS.scatters.searchClick); + } + + function handleRequestAbort(e: React.SyntheticEvent): void { + e.preventDefault(); + if (!requestIsPending) { + return; + } + searchRef.current?.abort(); + scattersAppModel.abortRequest(); + } + + const dropDownOptions: { value: string; label: string }[] = + React.useMemo(() => { + let data: { value: string; label: string }[] = []; + if (selectFormData.options) { + for (let option of selectFormData.options) { + data.push({ value: option.key, label: option.label }); + } + } + return data; + }, [selectFormData.options]); + + function onChange( + type: 'x' | 'y', + option: { value: string; label: string } | null, + ): void { + if (option) { + const selectedOptions = selectedOptionsData?.options; + if (type === 'y') { + onSelectOptionsChange([ + selectFormData.options.find((o) => o.key === option.value), + selectedOptions.length === 2 ? selectedOptions[1] : null, + ]); + } else if (type === 'x') { + onSelectOptionsChange([ + selectedOptions[0] || null, + selectFormData.options.find((o) => o.key === option.value), + ]); + } + } + } + + return ( + +
+ + +
+ + + + onChange('x', option)} + value={selectedOptionsData?.options[1]?.key || null} + options={dropDownOptions} + onMenuOpen={() => setOpen({ y: false, x: true })} + onMenuClose={() => setOpen({ y: false, x: false })} + open={open.x} + withPortal + label='X axis' + icon={{ name: 'x-axis' }} + isDisabled={isDisabled} + /> + + + + onChange('y', option)} + value={selectedOptionsData?.options[0]?.key || null} + options={dropDownOptions} + onMenuOpen={() => setOpen({ y: true, x: false })} + onMenuClose={() => setOpen({ y: false, x: false })} + open={open.y} + withPortal + label='Y axis' + icon={{ name: 'y-axis' }} + isDisabled={isDisabled} + /> + + + +
+
+ +
+ +
+
+ +
+ +
+
+
+
+ ); +} + +export default React.memo(SelectForm); diff --git a/src/src/pages/Tags/TagDelete.tsx b/src/src/pages/Tags/TagDelete.tsx new file mode 100644 index 00000000..5b5282ff --- /dev/null +++ b/src/src/pages/Tags/TagDelete.tsx @@ -0,0 +1,106 @@ +import React, { memo } from 'react'; +import * as yup from 'yup'; +import { isEmpty, noop } from 'lodash-es'; +import { useFormik } from 'formik'; + +import { TextField } from '@material-ui/core'; + +import ConfirmModal from 'components/ConfirmModal/ConfirmModal'; +import { Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import tagsAppModel from 'services/models/tags/tagsAppModel'; + +import './Tags.scss'; + +function TagDelete({ + tagInfo, + tagHash, + onDeleteModalToggle, + onTagDetailOverlayToggle, + isTagDetailOverLayOpened, + modalIsOpen, +}: any): React.FunctionComponentElement { + const formik = useFormik({ + initialValues: { name: '' }, + onSubmit: noop, + validationSchema: yup.object({ + name: yup.string().test('name', 'Name does not match', function (name) { + return name === tagInfo.name; + }), + }), + }); + const { + values, + errors, + touched, + setFieldValue, + setFieldTouched, + submitForm, + validateForm, + } = formik; + const { name } = values; + + function onChange(e: React.ChangeEvent) { + setFieldValue('name', e?.target?.value, true).then(() => { + setFieldTouched('name', true); + }); + } + + function onTagHide() { + submitForm().then(() => + validateForm(values).then((errors) => { + if (isEmpty(errors)) { + tagsAppModel.deleteTag(tagHash).then(() => { + tagsAppModel.getTagsData().call(); + isTagDetailOverLayOpened && onTagDetailOverlayToggle(); + onCancel(); + }); + } + }), + ); + } + + function onCancel(): void { + setFieldValue('name', ''); + setFieldTouched('name', false); + onDeleteModalToggle(); + } + + return ( + + } + title='Delete tag' + statusType='error' + confirmBtnText='Delete' + > + + {`Please type "${tagInfo?.name}" to confirm:`} + + + + + ); +} + +export default memo(TagDelete); diff --git a/src/src/pages/Tags/TagDetail.tsx b/src/src/pages/Tags/TagDetail.tsx new file mode 100644 index 00000000..ffc4251f --- /dev/null +++ b/src/src/pages/Tags/TagDetail.tsx @@ -0,0 +1,92 @@ +import React, { memo, useEffect } from 'react'; +import { isEmpty } from 'lodash-es'; + +import BusyLoaderWrapper from 'components/BusyLoaderWrapper/BusyLoaderWrapper'; +import IllustrationBlock from 'components/IllustrationBlock/IllustrationBlock'; +import { Badge, Button, Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import tagsAppModel from 'services/models/tags/tagsAppModel'; + +import { ITagDetailProps } from 'types/pages/tags/Tags'; + +import TagRunsTable from './TagRunsTable'; + +import './Tags.scss'; + +function TagDetail({ + id, + onSoftDeleteModalToggle, + onUpdateModalToggle, + onDeleteModalToggle, + isTagInfoDataLoading, + tagInfo, + isRunsDataLoading, + tagRuns, +}: ITagDetailProps): React.FunctionComponentElement { + useEffect(() => { + const tagRequestRef = tagsAppModel.getTagById(id); + const tagRunsRequestRef = tagsAppModel.getTagRuns(id); + tagRunsRequestRef.call(); + tagRequestRef.call(); + return () => { + tagRunsRequestRef.abort(); + tagRequestRef.abort(); + }; + }, [id]); + + return ( + +
+
+ + {tagInfo && ( + + )} + +
+ {!tagInfo?.archived && ( + + )} + {tagInfo?.archived ? ( + + ) : ( + + )} + +
+
+ + + {!isEmpty(tagRuns) ? ( + + ) : ( + + )} + +
+
+ ); +} + +export default memo(TagDetail); diff --git a/src/src/pages/Tags/TagRunsTable.tsx b/src/src/pages/Tags/TagRunsTable.tsx new file mode 100644 index 00000000..943dc1bf --- /dev/null +++ b/src/src/pages/Tags/TagRunsTable.tsx @@ -0,0 +1,120 @@ +import React, { memo, useEffect, useRef } from 'react'; +import { NavLink } from 'react-router-dom'; +import moment from 'moment'; +import _ from 'lodash-es'; + +import { Tooltip } from '@material-ui/core'; + +import Table from 'components/Table/Table'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; +import StatusLabel from 'components/StatusLabel'; + +import { TABLE_DATE_FORMAT } from 'config/dates/dates'; + +import { ITagRun } from 'types/pages/tags/Tags'; + +import { processDurationTime } from 'utils/processDurationTime'; + +function TagRunsTable({ + runsList, +}: { + runsList: ITagRun[]; +}): React.FunctionComponentElement { + const tableRef = useRef({}); + const tableColumns = [ + { + dataKey: 'name', + key: 'name', + title: 'Name', + width: 0, + flexGrow: 1, + cellRenderer: function cellRenderer({ + cellData, + }: { + cellData: { name: string; id: string; active: boolean }; + }) { + return ( + <> + +
+ +
+
+ +
+ +

{cellData.name}

+
+
+
+ + ); + }, + }, + { + dataKey: 'date', + key: 'date', + title: 'Date', + width: 200, + cellRenderer: function cellRenderer({ cellData }: { cellData: string }) { + return

{cellData}

; + }, + }, + { + dataKey: 'duration', + key: 'duration', + title: 'Duration', + width: 200, + cellRenderer: function cellRenderer({ cellData }: { cellData: string }) { + return

{cellData}

; + }, + }, + ]; + + useEffect(() => { + if (runsList) { + tableRef?.current?.updateData({ + // eslint-disable-next-line react/prop-types + newData: runsList.map((run: ITagRun) => ({ + name: { + name: run.name, + id: run.run_id, + active: _.isNil(run.end_time), + }, + date: moment(run.creation_time * 1000).format(TABLE_DATE_FORMAT), + duration: processDurationTime( + run.creation_time * 1000, + run.end_time ? run.end_time * 1000 : Date.now(), + ), + key: run.run_id, + })), + newColumns: tableColumns, + }); + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [runsList]); + + return ( + +
+
+ + + ); +} + +export default memo(TagRunsTable); diff --git a/src/src/pages/Tags/TagSoftDelete.tsx b/src/src/pages/Tags/TagSoftDelete.tsx new file mode 100644 index 00000000..10ed8bb1 --- /dev/null +++ b/src/src/pages/Tags/TagSoftDelete.tsx @@ -0,0 +1,64 @@ +import React, { memo, useRef } from 'react'; + +import ConfirmModal from 'components/ConfirmModal/ConfirmModal'; +import { Icon } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import tagsAppModel from 'services/models/tags/tagsAppModel'; + +import { ITagSoftDeleteProps } from 'types/pages/tags/Tags'; + +import './Tags.scss'; + +function TagSoftDelete({ + tagInfo, + tagHash, + onSoftDeleteModalToggle, + onTagDetailOverlayToggle, + isTagDetailOverLayOpened, + modalIsOpen, +}: ITagSoftDeleteProps): React.FunctionComponentElement { + const archivedRef = useRef({ archived: tagInfo?.archived }); + + function onTagHide() { + tagsAppModel.archiveTag(tagHash, !tagInfo?.archived).then(() => { + tagsAppModel.getTagsData().call(); + onSoftDeleteModalToggle(); + isTagDetailOverLayOpened && onTagDetailOverlayToggle(); + }); + } + + function onTagShow() { + tagsAppModel.archiveTag(tagHash, !tagInfo?.archived).then(() => { + tagsAppModel.getTagsData().call(); + onSoftDeleteModalToggle(); + isTagDetailOverLayOpened && onTagDetailOverlayToggle(); + }); + } + + return ( + + + } + title='Hide tag' + confirmBtnText={archivedRef.current?.archived ? 'Bring back' : 'Hide'} + /> + + ); +} + +export default memo(TagSoftDelete); diff --git a/src/src/pages/Tags/Tags.scss b/src/src/pages/Tags/Tags.scss new file mode 100644 index 00000000..3b47038f --- /dev/null +++ b/src/src/pages/Tags/Tags.scss @@ -0,0 +1,374 @@ +@use 'src/styles/abstracts' as *; + +.Tags { + height: 100vh; + overflow: hidden; + &__tabPanel { + height: calc(100% - 50px); + position: relative; + padding-bottom: 1.5rem; + & > div { + height: 100%; + position: relative; + } + } + &__tabsContainer { + border-radius: 0; + padding-left: 1.25rem; + box-shadow: none; + border: $border-grey; + &__tabs { + .MuiTab-textColorInherit { + opacity: 1; + font-weight: $font-500; + font-size: $text-md; + text-transform: none; + &.MuiInputBase-input { + font-weight: $font-600; + } + } + .Mui-selected { + font-weight: $font-600; + color: $pico; + } + } + .PrivateTabIndicator-root-5 { + height: 0.1875rem; + } + } + &__TagList { + position: relative; + height: 100%; + border-left: $border-grey; + border-right: $border-grey; + box-shadow: 0 toRem(1px) toRem(1px) $cuddle-50; + border-radius: 0 0 toRem(6px) toRem(6px); + .BaseTable { + &__body { + & > div { + width: 100% !important; + .BaseTable__row { + width: 100% !important; + } + } + } + &__row { + &-cell { + border-right: unset; + } + } + &__header-cell { + border-right: unset; + } + } + &__tagListBusyLoader { + padding-top: 100px; + } + &__header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.25rem; + background: #ffffff; + border-bottom: $border-grey; + .MuiInputBase-root { + height: 2rem; + padding-left: 0.8125rem; + border-radius: $border-radius-main; + i { + padding-right: 0.5625rem; + } + .MuiInputBase-input { + font-weight: $font-500; + font-size: $text-md; + color: #414b6d; + &::placeholder { + font-weight: $font-500; + font-size: $text-md; + color: #606986; + opacity: 1; + } + } + } + &__createButton { + text-transform: none; + width: 126px; + padding: 4px 10px 4px 13px; + i { + padding-right: 0.5rem; + } + .MuiButton-label { + font-weight: $font-500; + font-size: $text-md; + justify-content: flex-start; + } + } + } + &__tagListBox { + height: calc(100vh - 147px); + position: relative; + overflow: hidden; + border-radius: 0 0 toRem(6px) toRem(6px); + &__titleBox { + position: relative; + margin-left: 15px; + display: flex; + align-items: center; + justify-content: flex-start; + height: 40px; + background-color: $white; + &::before { + content: ''; + width: 34px; + height: 3px; + background: $primary-color; + position: absolute; + left: 0; + bottom: 0; + } + &__title { + font-weight: $font-600; + font-size: $text-md; + } + } + } + &__modalContainer { + width: 350px; + &__titleBox { + height: 40px; + border-bottom: 1px solid #f2f5fa; + display: flex; + justify-content: center; + align-items: center; + } + } + &__overLayContainer { + .MuiDrawer-paper { + width: 800px; + box-shadow: -5px 0px 10px rgba(28, 40, 82, 0.1); + top: 50px; + height: calc(100% - 40px); + } + .MuiBackdrop-root { + background-color: transparent; + } + } + } +} + +.TagsTable { + height: calc(100% - 40px); + width: 100%; + position: relative; + &__commentCell { + max-width: 600px; + word-break: break-word; + z-index: 99900; + &__actionsContainer { + right: 0; + top: 0; + height: 100%; + position: absolute; + align-items: center; + display: flex; + width: 160px; + justify-content: flex-end; + padding-right: 20px; + background: linear-gradient( + 90deg, + rgba(236, 243, 252, 0) 0%, + #ecf3fc 26.41%, + #ecf3fc 60.3% + ); + } + } + &__runDuration { + font-weight: $font-500; + color: $text-color; + font-size: $text-lg; + @include monospaceFontFamily(14); + } + &__runCreatedDate { + font-weight: $font-500; + color: $text-color; + font-size: $text-lg; + @include monospaceFontFamily(14); + } + &__runName { + font-weight: $font-500; + color: $primary-color; + text-decoration: none; + font-size: $text-lg; + @include monospaceFontFamily(14); + } + .BaseTable { + .BaseTable__table-main .BaseTable__row-cell:first-child { + padding-left: $space-unit; + } + &__body { + & > div { + width: 100% !important; + .BaseTable__row { + width: 100% !important; + } + } + } + &__table-main { + outline: none; + } + &__header { + &-row { + background: #ebf0f8; + border-bottom: none; + } + &-cell { + border-right: $border-grey; + border-bottom: $border-grey; + padding: 0 15px; + &:last-child { + border-right: none; + } + } + } + &__row { + border-bottom: none; + &--hovered { + background: #e8f1fc; + } + &-cell { + border-right: $border-grey; + border-bottom: $border-grey; + padding-left: 15px; + padding-right: 15px; + position: relative; + &:last-child { + white-space: unset; + border-right: none; + } + a { + text-decoration: none; + } + .MuiButton-root { + text-transform: none; + } + } + } + } + + &__runsCell { + display: flex; + align-items: center; + &--iconBox { + font-size: 1rem; + color: $primary-color; + margin-right: $space-xs; + } + } +} + +.TagDetail { + height: 100%; + &__headerContainer { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 20px 0 13px; + height: 40px; + border-bottom: $border-grey; + &__headerActionsBox { + display: flex; + align-items: center; + i { + font-size: 1rem; + } + &__actionsIcon { + margin-right: 25px; + cursor: pointer; + font-size: 1rem; + color: $primary-color; + &:last-child { + margin-right: 0; + } + } + } + } +} +.TagSoftDelete { + &__contentContainer { + padding: 25px 20px; + display: flex; + &__iconContainer { + margin-right: 30px; + display: flex; + justify-content: center; + align-items: center; + .MuiSvgIcon-root { + width: 4.5rem; + height: 3.5rem; + } + } + &__textBox { + &__titleText { + font-weight: $font-600; + font-size: $text-md; + margin-bottom: 5px; + } + &__contentText { + font-weight: $font-400; + font-size: $text-sm; + } + } + } + &__footerBox { + border-top: $border-grey; + height: 64px; + display: flex; + justify-content: center; + align-items: center; + &__cancelButton { + margin-right: 10px; + } + } +} + +.TagDelete { + &__contentContainer { + padding: 20px; + &__contentBox { + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; + &__warningText { + margin: 16px 0 4px 0; + } + .MuiInputBase-root { + margin-bottom: 0; + } + } + } + &__footerBox { + border-top: $border-grey; + height: 64px; + display: flex; + justify-content: center; + align-items: center; + &__cancelButton { + margin-right: 10px; + } + } +} + +.TagDetail__headerContainer__headerActionsBox__actionsIcon__Wrapper { + padding: 8px; + border-radius: 6px; + display: flex; + justify-content: center; + align-items: center; + margin-right: 5px; + color: $primary-color; + cursor: pointer; + &:hover { + background-color: rgba(28, 40, 82, 0.05); + } +} diff --git a/src/src/pages/Tags/Tags.tsx b/src/src/pages/Tags/Tags.tsx new file mode 100644 index 00000000..25b996bd --- /dev/null +++ b/src/src/pages/Tags/Tags.tsx @@ -0,0 +1,98 @@ +import React, { memo, useEffect, useState } from 'react'; + +import { Paper, Tab, Tabs } from '@material-ui/core'; + +import TabPanel from 'components/TabPanel/TabPanel'; +import NotificationContainer from 'components/NotificationContainer/NotificationContainer'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { ITagsProps } from 'types/pages/tags/Tags'; + +import TagsList from './TagsList'; + +import './Tags.scss'; + +function Tags({ + tagsListData, + isTagsDataLoading, + tagInfo, + tagRuns, + onNotificationDelete, + notifyData, + isRunsDataLoading, + isTagInfoDataLoading, +}: ITagsProps): React.FunctionComponentElement { + const [value, setValue] = useState(0); + const [archivedTagsList, setArchivedTagsList] = useState( + tagsListData?.filter((tag) => tag.archived) || [], + ); + const [tagsList, setTagsList] = useState( + tagsListData?.filter((tag) => !tag.archived) || [], + ); + + const handleChange = (event: React.ChangeEvent<{}>, newValue: number) => { + setValue(newValue); + analytics.trackEvent(ANALYTICS_EVENT_KEYS.tags.tabChange); + }; + + useEffect(() => { + setArchivedTagsList(tagsListData?.filter((tag) => tag.archived) || []); + setTagsList(tagsListData?.filter((tag) => !tag.archived) || []); + }, [tagsListData]); + + return ( + +
+ + + + + + + + + + + + + + + + + {notifyData?.length > 0 && ( + + )} +
+
+ ); +} + +export default memo(Tags); diff --git a/src/src/pages/Tags/TagsContainer.tsx b/src/src/pages/Tags/TagsContainer.tsx new file mode 100644 index 00000000..520e7a73 --- /dev/null +++ b/src/src/pages/Tags/TagsContainer.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { useModel } from 'hooks'; + +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import tagsAppModel from 'services/models/tags/tagsAppModel'; +import * as analytics from 'services/analytics'; + +import Tags from './Tags'; + +const tagsRequestRef = tagsAppModel.getTagsData(); + +function TagsContainer(): React.FunctionComponentElement { + const tagsData = useModel(tagsAppModel); + + React.useEffect(() => { + tagsAppModel.initialize(); + tagsRequestRef.call(); + analytics.pageView(ANALYTICS_EVENT_KEYS.tags.pageView); + }, []); + return ( + + + + ); +} + +export default TagsContainer; diff --git a/src/src/pages/Tags/TagsList.tsx b/src/src/pages/Tags/TagsList.tsx new file mode 100644 index 00000000..7fd11c19 --- /dev/null +++ b/src/src/pages/Tags/TagsList.tsx @@ -0,0 +1,203 @@ +import React, { ChangeEvent, memo, useRef, useState } from 'react'; + +import { Button, Dialog, Drawer, TextField } from '@material-ui/core'; + +import TagForm from 'components/TagForm/TagForm'; +import { Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { ITagProps, ITagsListProps } from 'types/pages/tags/Tags'; + +import TagsTable from './TagsTable'; +import TagDetail from './TagDetail'; +import TagSoftDelete from './TagSoftDelete'; +import TagDelete from './TagDelete'; + +import './Tags.scss'; + +function TagsList({ + tagsList, + isHiddenTagsList, + isTagsDataLoading, + tagInfo, + tagRuns, + isRunsDataLoading, + isTagInfoDataLoading, +}: ITagsListProps): React.FunctionComponentElement { + const tableRef = useRef({}); + const [isCreateModalOpened, setIsCreateModalOpened] = useState(false); + const [isUpdateModalOpened, setIsUpdateModalOpened] = useState(false); + const [isSoftDeleteModalOpened, setIsSoftDeleteModalOpened] = useState(false); + const [isDeleteModalOpened, setIsDeleteModalOpened] = useState(false); + const [isTagDetailOverLayOpened, setIsTagDetailOverLayOpened] = + useState(false); + const [tagDetailId, setTagDetailId] = useState(''); + const [searchValue, setSearchValue] = useState(''); + + function onCreateModalToggle() { + setIsCreateModalOpened(!isCreateModalOpened); + } + + function onUpdateModalToggle() { + setIsUpdateModalOpened(!isUpdateModalOpened); + } + + function onSoftDeleteModalToggle() { + setIsSoftDeleteModalOpened(!isSoftDeleteModalOpened); + } + + function onDeleteModalToggle() { + setIsDeleteModalOpened(!isDeleteModalOpened); + } + + function onTagDetailOverlayToggle() { + if (isTagDetailOverLayOpened) { + tableRef.current?.setActiveRow(null); + } + setIsTagDetailOverLayOpened(!isTagDetailOverLayOpened); + } + + function openTagDetailOverLay() { + setIsTagDetailOverLayOpened(true); + } + + function onSearchInputChange(e: ChangeEvent) { + setSearchValue(e.target.value); + } + + function onTableRunClick(id: string) { + if (!isTagDetailOverLayOpened) { + openTagDetailOverLay(); + } + setTagDetailId(id); + analytics.trackEvent(ANALYTICS_EVENT_KEYS.tags.tagDetail); + } + + return ( +
+
+ , + disabled: isTagsDataLoading, + }} + onChange={onSearchInputChange} + value={searchValue} + /> + {!isHiddenTagsList && ( + + )} +
+ + + tag.name.includes(searchValue), + )} + isTagsDataLoading={isTagsDataLoading} + hasSearchValue={!!searchValue} + onTableRunClick={onTableRunClick} + onSoftDeleteModalToggle={onSoftDeleteModalToggle} + onDeleteModalToggle={onDeleteModalToggle} + onUpdateModalToggle={onUpdateModalToggle} + /> + +
+
+ + Create Tag + +
+
+ +
+
+
+ +
+
+ + Update Tag + +
+
+ +
+
+
+ {tagInfo && ( + + )} + {tagInfo && ( + + )} +
+ + {isTagDetailOverLayOpened && ( + + )} + +
+ ); +} + +export default memo(TagsList); diff --git a/src/src/pages/Tags/TagsTable.tsx b/src/src/pages/Tags/TagsTable.tsx new file mode 100644 index 00000000..a6368a3e --- /dev/null +++ b/src/src/pages/Tags/TagsTable.tsx @@ -0,0 +1,175 @@ +import React, { memo, useEffect, useState } from 'react'; +import _ from 'lodash-es'; + +import Table from 'components/Table/Table'; +import { Badge, Button, Icon, Text } from 'components/kit'; +import ErrorBoundary from 'components/ErrorBoundary/ErrorBoundary'; + +import { IllustrationsEnum } from 'config/illustrationConfig/illustrationConfig'; + +import tagsAppModel from 'services/models/tags/tagsAppModel'; + +import { ITagProps, ITagsTableProps } from 'types/pages/tags/Tags'; + +function TagsTable({ + tableRef, + tagsList, + hasSearchValue, + isTagsDataLoading, + onTableRunClick, + onSoftDeleteModalToggle, + onUpdateModalToggle, + onDeleteModalToggle, +}: ITagsTableProps): React.FunctionComponentElement { + const [hoveredRowIndex, setHoveredRowIndex] = useState(''); + const tableColumns = [ + { + dataKey: 'name', + key: 'name', + title: 'Name & Color', + width: 200, + cellRenderer: function cellRenderer({ cellData }: any, i: any) { + const { name, color } = cellData; + return ; + }, + }, + { + dataKey: 'runs', + key: 'runs', + title: 'Runs', + width: 150, + cellRenderer: function cellRenderer({ cellData }: any, i: any) { + return ( +
+ + + + + {cellData.count} + +
+ ); + }, + }, + { + dataKey: 'comment', + key: 'comment', + title: 'Comment', + width: 0, + flexGrow: 1, + cellRenderer: function cellRenderer({ cellData, i }: any) { + return ( +
e.stopPropagation()} + > + + {cellData.description} + + {cellData.id === hoveredRowIndex && ( +
+ {!cellData?.archived && ( + + )} + {cellData?.archived ? ( + + ) : ( + + )} + +
+ )} +
+ ); + }, + }, + ]; + + function onSoftDeleteClick(tagData: ITagProps) { + tagsAppModel.updateTagInfo(tagData); + onSoftDeleteModalToggle(); + } + + function onUpdateClick(tagData: ITagProps) { + tagsAppModel.updateTagInfo(tagData); + onUpdateModalToggle(); + } + + function onDeleteClick(tagData: ITagProps) { + tagsAppModel.updateTagInfo(tagData); + onDeleteModalToggle(); + } + + useEffect(() => { + if (tableRef.current.updateData) { + tableRef?.current?.updateData({ + newData: tagsList.map((tagData: ITagProps, i: number) => ({ + key: tagData.id, + name: { name: tagData.name, color: tagData.color }, + comment: tagData, + runs: { count: tagData.run_count, tagId: tagData.id }, + })), + newColumns: tableColumns, + }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [tagsList, onTableRunClick, hoveredRowIndex]); + + return ( + +
+
+ {!isTagsDataLoading && !_.isNil(tagsList) && ( + + {tagsList.length} {tagsList.length > 1 ? 'Tags' : 'Tag'} + + )} +
+ +
setHoveredRowIndex(rowIndex)} + onRowClick={(rowIndex) => onTableRunClick(rowIndex || '')} + illustrationConfig={{ + type: hasSearchValue + ? IllustrationsEnum.EmptySearch + : IllustrationsEnum.ExploreData, + page: 'tags', + }} + height='calc(100% - 39px)' + /> + + + ); +} + +export default memo(TagsTable); diff --git a/src/src/pages/TextExplorer/getStaticContent.tsx b/src/src/pages/TextExplorer/getStaticContent.tsx new file mode 100644 index 00000000..b1e1bef1 --- /dev/null +++ b/src/src/pages/TextExplorer/getStaticContent.tsx @@ -0,0 +1,52 @@ +import * as React from 'react'; + +import { DOCUMENTATIONS } from 'config/references'; + +import getBaseExplorerStaticContent, { + STATIC_CONTENT_TYPES, +} from 'modules/BaseExplorer/utils/getBaseExplorerStaticContent'; +import { StaticContentType } from 'modules/BaseExplorer/types'; + +function getTextExplorerStaticContent( + type: StaticContentType, +): React.ReactNode { + const illustrationContent = getTextExplorerIllustrationContent(type); + return getBaseExplorerStaticContent(type, illustrationContent); +} + +function getTextExplorerIllustrationContent( + type: StaticContentType, +): React.ReactNode { + const Never_Executed = ( + <> + It’s super easy to search Aim experiments. Just start typing your query in + the search bar above. +
+ Look up + + search docs + + to learn more. + + ); + const Failed = 'Incorrect Query'; + const Insufficient_Resources = "You don't have any tracked text"; + const Empty = 'No Results'; + const Empty_Bookmarks = "You don't have any saved bookmark"; + + const CONTENT = { + [STATIC_CONTENT_TYPES.Never_Executed]: Never_Executed, + [STATIC_CONTENT_TYPES.Failed]: Failed, + [STATIC_CONTENT_TYPES.Insufficient_Resources]: Insufficient_Resources, + [STATIC_CONTENT_TYPES.Empty]: Empty, + [STATIC_CONTENT_TYPES.Empty_Bookmarks]: Empty_Bookmarks, + }; + return CONTENT[type] || null; +} + +export default getTextExplorerStaticContent; diff --git a/src/src/pages/TextExplorer/index.tsx b/src/src/pages/TextExplorer/index.tsx new file mode 100644 index 00000000..854a19b1 --- /dev/null +++ b/src/src/pages/TextExplorer/index.tsx @@ -0,0 +1,44 @@ +import type { FunctionComponent } from 'react'; + +import renderer from 'modules/BaseExplorer'; +import TextBox from 'modules/BaseExplorer/components/TextBox/TextBox'; +import { VisualizerLegends } from 'modules/BaseExplorer/components/Widgets'; + +import { AimObjectDepths, SequenceTypesEnum } from 'types/core/enums'; + +import { getTextDefaultConfig } from './textConfig'; + +const defaultConfig = getTextDefaultConfig(); + +const TextExplorer = renderer( + { + name: 'Text Explorer', + sequenceName: SequenceTypesEnum.Texts, + basePath: 'text', + persist: true, + adapter: { + objectDepth: AimObjectDepths.Index, + }, + groupings: defaultConfig.groupings, + visualizations: { + vis1: { + component: defaultConfig.Visualizer as FunctionComponent, + controls: defaultConfig.controls, + box: { + ...defaultConfig.box, + component: TextBox, + initialState: defaultConfig.box.initialState, + }, + widgets: { + legends: { + component: VisualizerLegends, + }, + }, + }, + }, + getStaticContent: defaultConfig.getStaticContent, + }, + __DEV__, +); + +export default TextExplorer; diff --git a/src/src/pages/TextExplorer/textConfig.tsx b/src/src/pages/TextExplorer/textConfig.tsx new file mode 100644 index 00000000..67b87148 --- /dev/null +++ b/src/src/pages/TextExplorer/textConfig.tsx @@ -0,0 +1,105 @@ +import React, { memo } from 'react'; + +import COLORS from 'config/colors/colors'; + +import CaptionProperties from 'modules/BaseExplorer/components/Controls/CaptionProperties'; +import TextRendererMode from 'modules/BaseExplorer/components/Controls/TextRendererMode'; +import Legends from 'modules/BaseExplorer/components/Controls/Legends'; +import { GroupingItem } from 'modules/BaseExplorer/components/Grouping'; +import { getDefaultHydration } from 'modules/BaseExplorer'; +import { GroupType, Order } from 'modules/core/pipeline'; +import { defaultHydration } from 'modules/BaseExplorer/getDefaultHydration'; +import { IBaseComponentProps } from 'modules/BaseExplorer/types'; +import { PersistenceTypesEnum } from 'modules/core/engine/types'; + +import { AimFlatObjectBase } from 'types/core/AimObjects'; + +import { LegendsModeEnum } from 'utils/d3'; + +import getTextExplorerStaticContent from './getStaticContent'; + +export enum TEXT_RNDERER_MODES { + TEXT = 'text', + MARKDOWN = 'markdown', + HTML = 'html', + CODE = 'code', +} + +export const getTextDefaultConfig = (): typeof defaultHydration => { + const defaultConfig = getDefaultHydration(); + + return { + ...defaultConfig, + groupings: { + ...defaultConfig.groupings, + [GroupType.COLUMN]: { + ...defaultConfig.groupings[GroupType.COLUMN], + defaultApplications: { + orders: defaultConfig.groupings[GroupType.COLUMN].defaultApplications + ?.orders ?? [Order.ASC, Order.ASC], + fields: ['run.hash', 'texts.name'], + }, + }, + [GroupType.COLOR]: { + component: memo((props: IBaseComponentProps) => ( + + )), + + // @ts-ignore + styleApplier: ( + object: AimFlatObjectBase, + group: any, + boxConfig: any, + iteration: number, + ) => { + return { + color: + group[GroupType.COLOR]?.order !== undefined + ? COLORS[0][group[GroupType.COLOR].order % COLORS[0].length] + : null, + }; + }, + defaultApplications: { + fields: ['run.hash'], + orders: [Order.ASC], + }, + }, + }, + controls: { + ...defaultConfig.controls, + captionProperties: { + component: CaptionProperties, + state: { + initialState: { + displayBoxCaption: true, + selectedFields: ['run.name', 'texts.name', 'texts.context'], + }, + persist: 'url', + }, + }, + textRenderer: { + component: TextRendererMode, + state: { + initialState: { + type: 'text', + }, + persist: 'url', + }, + }, + legends: { + component: Legends, + state: { + initialState: { + display: false, + mode: LegendsModeEnum.PINNED, + }, + persist: PersistenceTypesEnum.Url, + }, + }, + }, + box: { + ...defaultConfig.box, + }, + getStaticContent: getTextExplorerStaticContent, + }; +}; diff --git a/src/src/react-app-env.d.ts b/src/src/react-app-env.d.ts new file mode 100644 index 00000000..6431bc5f --- /dev/null +++ b/src/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/src/reportWebVitals.ts b/src/src/reportWebVitals.ts new file mode 100644 index 00000000..b1b86f02 --- /dev/null +++ b/src/src/reportWebVitals.ts @@ -0,0 +1,17 @@ +import { ReportHandler } from 'web-vitals'; + +const reportWebVitals = (onPerfEntry?: ReportHandler) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import(/* webpackChunkName: "web-vitals" */ 'web-vitals').then( + ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }, + ); + } +}; + +export default reportWebVitals; diff --git a/src/src/routes/routes.tsx b/src/src/routes/routes.tsx new file mode 100644 index 00000000..75c659b2 --- /dev/null +++ b/src/src/routes/routes.tsx @@ -0,0 +1,231 @@ +import React from 'react'; + +import { PathEnum } from 'config/enums/routesEnum'; +import pageTitlesEnum from 'config/pageTitles/pageTitles'; + +const Runs = React.lazy( + () => import(/* webpackChunkName: "runs" */ 'pages/Runs/RunsContainer'), +); +const RunDetail = React.lazy( + () => import(/* webpackChunkName: "run" */ 'pages/RunDetail/RunDetail'), +); +const Experiment = React.lazy( + () => import(/* webpackChunkName: "run" */ 'pages/Experiment/Experiment'), +); +const Metrics = React.lazy( + () => + import(/* webpackChunkName: "metrics" */ 'pages/Metrics/MetricsContainer'), +); +const Params = React.lazy( + () => import(/* webpackChunkName: "params" */ 'pages/Params/ParamsContainer'), +); +const Bookmarks = React.lazy( + () => + import( + /* webpackChunkName: "bookmarks" */ 'pages/Bookmarks/BookmarksContainer' + ), +); +const Dashboard = React.lazy( + () => import(/* webpackChunkName: "dashboard" */ 'pages/Dashboard/Dashboard'), +); +const TagsContainer = React.lazy( + () => import(/* webpackChunkName: "tags" */ 'pages/Tags/TagsContainer'), +); +const Scatters = React.lazy( + () => + import( + /* webpackChunkName: "scatters" */ 'pages/Scatters/ScattersContainer' + ), +); +const ImagesExplore = React.lazy( + () => + import( + /* webpackChunkName: "images" */ 'pages/ImagesExplore/ImagesExplore' + ), +); +const FiguresExplore = React.lazy( + () => import(/* webpackChunkName: "figures" */ 'pages/FiguresExplorer'), +); +const AudiosExplorer = React.lazy( + () => import(/* webpackChunkName: "audios" */ 'pages/AudiosExplorer'), +); +const MetricsExplorer = React.lazy( + () => import(/* webpackChunkName: "metrics_v2" */ 'pages/MetricsExplorer'), +); + +const TextExplorer = React.lazy( + () => import(/* webpackChunkName: "text" */ 'pages/TextExplorer'), +); + +export interface IRoute { + path: PathEnum; + component: + | React.LazyExoticComponent< + () => React.FunctionComponentElement + > + | any; + showInSidebar: boolean; + displayName: string | null; + icon?: string | null; +} + +const routes = { + DASHBOARD: { + path: PathEnum.Dashboard, + component: Dashboard, + showInSidebar: false, + displayName: 'Dashboard', + icon: 'dashboard', + isExact: true, + title: pageTitlesEnum.DASHBOARD, + }, + RUNS: { + path: PathEnum.Runs, + component: Runs, + showInSidebar: true, + displayName: 'Runs', + icon: 'runs', + isExact: true, + title: pageTitlesEnum.RUNS_EXPLORER, + }, + METRICS: { + path: PathEnum.Metrics, + component: Metrics, + showInSidebar: true, + displayName: 'Metrics', + icon: 'metrics', + isExact: true, + title: pageTitlesEnum.METRICS_EXPLORER, + }, + METRICS_ID: { + path: PathEnum.Metrics_Id, + component: Metrics, + showInSidebar: false, + displayName: 'MetricsId', + isExact: true, + title: pageTitlesEnum.METRICS_EXPLORER, + }, + PARAMS: { + path: PathEnum.Params, + component: Params, + showInSidebar: true, + displayName: 'Params', + icon: 'params', + isExact: true, + title: pageTitlesEnum.PARAMS_EXPLORER, + }, + PARAMS_ID: { + path: PathEnum.Params_Id, + component: Params, + showInSidebar: false, + displayName: 'ParamsId', + isExact: true, + title: pageTitlesEnum.PARAMS_EXPLORER, + }, + TEXT_EXPLORER: { + path: PathEnum.Text_Explorer, + component: TextExplorer, + showInSidebar: true, + icon: 'text', + displayName: 'Text', + isExact: true, + title: pageTitlesEnum.TEXT_EXPLORER, + }, + IMAGE_EXPLORE: { + path: PathEnum.Images_Explore, + component: ImagesExplore, + showInSidebar: true, + displayName: 'Images', + icon: 'images', + isExact: true, + title: pageTitlesEnum.IMAGES_EXPLORER, + }, + IMAGE_EXPLORE_ID: { + path: PathEnum.Images_Explore_Id, + component: ImagesExplore, + showInSidebar: false, + displayName: 'ImagesId', + isExact: true, + title: pageTitlesEnum.IMAGES_EXPLORER, + }, + FIGURES_EXPLORER: { + path: PathEnum.Figures_Explorer, + component: FiguresExplore, + showInSidebar: true, + icon: 'figures', + displayName: 'Figures', + isExact: true, + title: pageTitlesEnum.FIGURES_EXPLORER, + }, + AUDIOS_EXPLORER: { + path: PathEnum.Audios_Explorer, + component: AudiosExplorer, + showInSidebar: true, + icon: 'audios', + displayName: 'Audios', + isExact: true, + title: pageTitlesEnum.AUDIOS_EXPLORER, + }, + SCATTERS: { + path: PathEnum.Scatters, + component: Scatters, + showInSidebar: true, + displayName: 'Scatters', + icon: 'scatterplot', + isExact: true, + title: pageTitlesEnum.SCATTERS_EXPLORER, + }, + SCATTERS_EXPLORE_ID: { + path: PathEnum.Scatters_Id, + component: Scatters, + showInSidebar: false, + displayName: 'ScatterId', + isExact: true, + title: pageTitlesEnum.SCATTERS_EXPLORER, + }, + BOOKMARKS: { + path: PathEnum.Bookmarks, + component: Bookmarks, + showInSidebar: true, + displayName: 'Bookmarks', + icon: 'bookmarks', + isExact: true, + title: pageTitlesEnum.BOOKMARKS, + }, + TAGS: { + path: PathEnum.Tags, + component: TagsContainer, + showInSidebar: true, + displayName: 'Tags', + icon: 'tags', + isExact: true, + title: pageTitlesEnum.TAGS, + }, + RUN_DETAIL: { + path: PathEnum.Run_Detail, + component: RunDetail, + showInSidebar: false, + displayName: 'Run Detail', + isExact: false, + title: pageTitlesEnum.RUN_DETAIL, + }, + Experiment: { + path: PathEnum.Experiment, + component: Experiment, + showInSidebar: false, + displayName: 'Experiment', + isExact: false, + title: pageTitlesEnum.EXPERIMENT, + }, + METRICS_EXPLORER: { + path: PathEnum.Metrics_Explorer, + component: MetricsExplorer, + showInSidebar: false, + icon: 'metrics', + displayName: 'Metrics_v2', + isExact: true, + title: pageTitlesEnum.METRICS_EXPLORER_V2, + }, +}; + +export default routes; diff --git a/src/src/services/NetworkService/index.ts b/src/src/services/NetworkService/index.ts new file mode 100644 index 00000000..2b455a17 --- /dev/null +++ b/src/src/services/NetworkService/index.ts @@ -0,0 +1,391 @@ +import Cookies from 'js-cookie'; + +import ENDPOINTS from '../api/endpoints'; +import { AuthToken } from '../api/api'; + +import { + HttpRequestMethods, + HttpErrorMessages, + Interceptor, + RequestOptions, + RequestInit, +} from './types'; +import exceptionDetector from './interceptors/exceptionDetector'; +// remove comment for this line once different platforms will have usage of fetch +// import 'isomorphic-fetch'; + +/** + * class NetworkService + * @Usage + * const api = new NetworkService('host/api', [(body, headers) => { body.data = {}; return {body, headers} }]); + * api.makeApiGetRequest('resource/:resourceId') + * .then({ body, headers } => { + * // body.data always will be {}, because passed interceptor which resets the data property of body + * }) + * @TODO write methods docs + */ +class NetworkService { + private interceptors: Interceptor[] = [exceptionDetector]; + private readonly uri?: string; + private readonly AUTH_TOKEN_KEY = 'Auth'; + private readonly AUTH_REFRESH_TOKEN_KEY = 'token'; + private readonly CONTENT_TYPE = { + JSON: 'application/json', + FORM_DATA: 'application/x-www-form-urlencoded', + }; + + constructor(uri: string, interceptors: Array = []) { + if (!uri) { + throw new Error('The "uri" argument must be a string.'); + } + + if (interceptors.length) { + interceptors.forEach((interceptor: Interceptor) => { + this.setInterceptor(interceptor); + }); + } + + this.uri = uri; + } + + public makeAPIGetRequest = ( + url: string, + options: RequestOptions = {}, + apiHost: string | undefined = this.uri, + ) => { + options = options || {}; + options.method = HttpRequestMethods.GET; + return this.makeAPIRequest(url, options, apiHost); + }; + + public makeAPIPostRequest = ( + url: string, + options: RequestOptions = {}, + apiHost: string | undefined = this.uri, + ) => { + options.method = HttpRequestMethods.POST; + return this.makeAPIRequest(url, options, apiHost); + }; + + public makeAPIPutRequest = ( + urlPrefix: string, + options: RequestOptions = {}, + apiHost: string | undefined = this.uri, + ) => { + options.method = HttpRequestMethods.PUT; + return this.makeAPIRequest(urlPrefix, options, apiHost); + }; + + public makeAPIDeleteRequest = ( + urlPrefix: string, + options: RequestOptions = {}, + apiHost: string | undefined = this.uri, + ) => { + options.method = HttpRequestMethods.DELETE; + return this.makeAPIRequest(urlPrefix, options, apiHost); + }; + + public makeAPIPatchRequest = ( + urlPrefix: string, + options: RequestOptions = {}, + apiHost: string | undefined = this.uri, + ) => { + options.method = HttpRequestMethods.PATCH; + return this.makeAPIRequest(urlPrefix, options, apiHost); + }; + + public createUrl = ( + arg: string | Array, + apiHost: string | undefined = this.uri, + ): string => { + if (Array.isArray(arg)) { + return [apiHost, ...arg].join('/'); + } + if (arg) { + return `${apiHost}/${arg}`; + } + return `${apiHost}`; + }; + + private createQueryParams = (queryParams: Record) => { + return Object.keys(queryParams) + .reduce((accumulator: Array, key: string) => { + const item = queryParams[key]; + if (item === null || item === undefined) return accumulator; + + if (Array.isArray(item)) { + for (let index = 0; index < item.length; index++) { + const arrItem = item[index]; + accumulator.push(`${key}=${arrItem}`); + } + } else { + accumulator.push(`${key}=${item}`); + } + + return accumulator; + }, []) + .join('&'); + }; + + public makeAPIRequest = ( + partUrl: string, + options: RequestOptions = {}, + apiHost: string | undefined = this.uri, + ): Promise<{ body: any; headers: any }> => { + return new Promise((resolve, reject) => { + let url = this.createUrl(partUrl, apiHost); + + this.request(url, options) + .then(async (response: Response) => { + if (!response) { + return reject({ + message: HttpErrorMessages.INVALID_RESPONSE_DATA, + }); + } + + const { headers } = response; + let body: { status?: number } = {}; + + const contentType = headers.get('content-type'); + + // @ts-ignore + body = response.body; + + if (contentType && contentType.indexOf('application/json') !== -1) { + body = await response.json(); + } + + try { + if (this.interceptors.length) { + this.interceptors.forEach((interceptor) => { + if (typeof interceptor === 'function') { + // @ts-ignore + body = interceptor(body, headers); + } + }); + } + } catch (e: any) { + reject({ message: e.message, res: { body, headers } }); + } + + if (response.status >= 400) { + return await this.checkCredentials(response, url, () => + this.request(url, options), + ); + } + + return resolve({ body, headers }); + }) + .catch((err: any) => reject(err)); + }); + }; + + private request = (url: string, options: RequestOptions = {}) => { + return new Promise((resolve, reject) => { + if (!url) { + return reject(HttpErrorMessages.INVALID_REQUEST_PARAMS); + } + + if (options.query_params) { + const queryParams = this.createQueryParams(options.query_params); + + if (queryParams) { + const paramGlue = url.includes('?') ? '&' : '?'; + url += `${paramGlue}${queryParams}`; + } + } + + if (!options.method) { + options.method = HttpRequestMethods.GET; + } + + const fetchOptions: RequestInit = { + method: options.method, + headers: options.headers || this.getRequestHeaders(), + }; + + if (options.credentials) { + fetchOptions.credentials = options.credentials; + } + + if (options.headers) { + fetchOptions.headers = options.headers; + } + + if (options.signal) { + fetchOptions.signal = options.signal; + } + + try { + if (options.body) { + if (options.body instanceof File) { + fetchOptions.body = options.body; + } else { + fetchOptions.body = JSON.stringify(options.body); + } + } + } catch (ex) { + return reject({ + message: HttpErrorMessages.INVALID_REQUEST_PARAMS, + }); + } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + fetch(url, fetchOptions) + .then((response) => resolve(response)) + .catch((error) => reject(error)); + }); + }; + + public setInterceptor(interceptor: Interceptor) { + if (typeof interceptor !== 'function') { + throw new Error(`The '${interceptor}' is not a function.`); + } + this.interceptors.push(interceptor); + } + + /** + * getTimezoneOffset is a function that returns the timezone offset + * @returns string + * @example + * const timezoneOffset = getTimezoneOffset(); + */ + public getTimezoneOffset(): string { + return `${new Date().getTimezoneOffset()}`; + } + + /** + * getAuthToken - Gets the token from local storage + * @returns {string} - The token + */ + public getAuthToken(): string { + return localStorage.getItem(this.AUTH_TOKEN_KEY) || ''; + } + + /** + * getRequestHeaders is a function that returns the request headers + * @returns object + * @example + * const requestHeaders = getRequestHeaders(); + * const response = await fetch(`${API_ROOT}${endpoint}`, { + * method: "POST", + * headers: requestHeaders, + * body: JSON.stringify(data), + * }); + */ + public getRequestHeaders(headers = {}) { + const requestHeaders: Record = { + 'X-Timezone-Offset': this.getTimezoneOffset(), + 'Content-Type': this.CONTENT_TYPE.JSON, + ...headers, + }; + + const Authorization = this.getAuthToken(); + if (Authorization) { + requestHeaders.Authorization = Authorization; + } + return requestHeaders; + } + + /** + * refreshToken is a function that makes a GET request to the auth endpoint for refresh the token + * @returns IResponse + * @throws Error + */ + public async refreshToken() { + return this.makeAPIGetRequest( + `${ENDPOINTS.AUTH.BASE}/${ENDPOINTS.AUTH.REFRESH}`, + { + headers: this.getRequestHeaders(), + credentials: + process.env.NODE_ENV === 'development' ? 'include' : 'same-origin', + }, + `${window.location.origin}/api`, + ); + } + + /** + * removeAuthToken - Removes the token from local storage and refresh token from cookies + * @returns {void} + */ + public removeAuthToken(): void { + localStorage.removeItem(this.AUTH_TOKEN_KEY); + this.removeRefreshToken(); + } + + /** + * setAuthToken - Sets the token in local storage and refresh token in cookies + * @param {AuthToken} token - The token object + * @returns {void} + */ + public setAuthToken({ + token_type, + refresh_token, + access_token, + }: AuthToken): void { + localStorage.setItem(this.AUTH_TOKEN_KEY, `${token_type} ${access_token}`); + this.setRefreshToken(refresh_token); + } + + /** + * setRefreshToken - Sets the refresh token in cookies + * @param refresh_token - The refresh token + * @returns {void} + */ + public setRefreshToken(refresh_token: string): void { + Cookies.set(this.AUTH_REFRESH_TOKEN_KEY, refresh_token); + } + + /** + * removeRefreshToken - Removes the refresh token from cookies + * @returns {void} + */ + public removeRefreshToken(): void { + Cookies.remove(this.AUTH_REFRESH_TOKEN_KEY); + } + + /** + * parseResponse is a generic function that parses the response body + * @param response is the response object + * @returns + * @throws Error + * @example + * const response = await fetch(`${API_ROOT}${endpoint}`); + * return parseResponse(response); + */ + public async parseResponse(response: Response): Promise { + try { + const data = await response.json(); + if (response.ok) { + return data; + } else { + return Promise.reject(new Error(data.message)); + } + } catch (error) { + throw error; + } + } + + public async checkCredentials( + response: Response, + endpoint: string, + refetch: () => Promise, + ): Promise { + if (response.status === 401) { + if (endpoint === `${ENDPOINTS.AUTH.BASE}/${ENDPOINTS.AUTH.REFRESH}`) { + this.removeAuthToken(); + return this.parseResponse(response); + } + // Refresh token + const token = (await this.refreshToken()).body; + if (token) { + this.setAuthToken(token); + return refetch(); + } + } + return this.parseResponse(response); + } +} + +export * from './types'; +export default NetworkService; diff --git a/src/src/services/NetworkService/interceptors/exceptionDetector.ts b/src/src/services/NetworkService/interceptors/exceptionDetector.ts new file mode 100644 index 00000000..7d3ad1a9 --- /dev/null +++ b/src/src/services/NetworkService/interceptors/exceptionDetector.ts @@ -0,0 +1,6 @@ +function exceptionDetector(data: any) { + // Actions + return data; +} + +export default exceptionDetector; diff --git a/src/src/services/NetworkService/types.ts b/src/src/services/NetworkService/types.ts new file mode 100644 index 00000000..82603d7a --- /dev/null +++ b/src/src/services/NetworkService/types.ts @@ -0,0 +1,118 @@ +export type Interceptor = ( + data: T, + headers?: Record, +) => D | Promise; + +export enum HttpRequestMethods { + GET = 'GET', + PUT = 'PUT', + HEAD = 'HEAD', + POST = 'POST', + PATCH = 'PATCH', + DELETE = 'DELETE', + OPTION = 'OPTION', +} + +export enum HttpErrorMessages { + INVALID_REQUEST_PARAMS = 'Invalid request parameters.', + INVALID_RESPONSE_DATA = 'Invalid Response Data', + SERVER_IS_UNAVAILABLE = 'The server is unavailable.', + RESPONSE_PARSING_ERROR = 'Unable to parse response.', +} + +export type RequestOptions = { + method?: HttpRequestMethods; + query_params?: Record; + headers?: Record; + body?: string | Record | File | ReadableStream; + signal?: AbortSignal; + credentials?: RequestCredentials; +}; + +export interface RequestInit { + /** + * A BodyInit object or null to set request's body. + */ + body?: string | Record | File | null; + + /** + * A string indicating how the request will interact with the + * browser's cache to set request's cache. + */ + cache?: Record; + + /** + * A string indicating whether credentials will be sent with the + * request always, never, or only when sent to a same-origin URL. + * + * Sets request's credentials. + */ + credentials?: RequestCredentials; + + /** + * A Headers object, an object literal, or an array of two-item + * arrays to set request's headers. + */ + headers?: Record; + + /** + * A cryptographic hash of the resource to be fetched by request. + * + * Sets request's integrity. + */ + integrity?: string; + + /** + * A boolean to set request's keepalive. + */ + keepalive?: boolean; + + /** + * A string to set request's method. + */ + method?: string; + + /** + * A string to indicate whether the request will use CORS, or will be + * restricted to same-origin URLs. Sets request's mode. + */ + mode?: Record; + + /** + * A string indicating whether request follows redirects, results in an error + * upon encountering a redirect, or returns the redirect (in an opaque fashion). + * + * Sets request's redirect. + */ + redirect?: Record; + + /** + * A string whose value is a same-origin URL, "about:client", or the empty string, + * to set request's referrer. + */ + referrer?: string; + + /** + * A referrer policy to set request's referrerPolicy. + */ + referrerPolicy?: Record; + + /** + * An AbortSignal to set request's signal. + */ + signal?: AbortSignal | null; +} + +export interface HttpResponseBody { + status: string; +} + +export type HttpResponse = { + body: T; + headers: any; // @TODO fill in later +}; + +export type RequestInstance = { + call: (...args: any) => Promise>; + cancel: () => void; +}; diff --git a/src/src/services/analytics.ts b/src/src/services/analytics.ts new file mode 100644 index 00000000..dad8a580 --- /dev/null +++ b/src/src/services/analytics.ts @@ -0,0 +1,62 @@ +//@ts-nocheck +export const SEGMENT_DEMO_WRITE_KEY = 'Z5rtxFe3gJmZB8JD97c4rqQa9R0q4Gkn'; +export const SEGMENT_WRITE_KEY = 'RrVqLHHD6WDXoFBkodO9KidodTtU92XO'; +export function isDev() { + return process.env.NODE_ENV === 'development'; +} + +let initialized = false; + +const enabled = () => { + return ( + !isDev() && window.analytics !== false && window.telemetry_enabled === 1 + ); +}; + +const init = () => { + if (initialized) return; + if ( + window.location.hostname.indexOf('aimstack.io') !== -1 && + (window.location.hostname.indexOf('demo') !== -1 || + window.location.hostname.indexOf('play') !== -1) + ) { + window.analytics._writeKey = SEGMENT_DEMO_WRITE_KEY; + window.analytics.load(SEGMENT_DEMO_WRITE_KEY); + } else { + window.analytics._writeKey = SEGMENT_WRITE_KEY; + window.analytics.load(SEGMENT_WRITE_KEY); + } + window.analytics.identify(); + initialized = true; +}; + +const pageView = (pageName, pageCat = null) => { + if (!enabled()) return; + init(); + window.analytics.page(pageCat, pageName, { + path: window.location.pathname, + url: window.location.hostname, + search: null, + referrer: null, + title: null, + }); +}; + +const trackEvent = (eventName: string, properties = {}) => { + if (!enabled()) return; + init(); + + window.analytics.track(eventName, properties, { + path: window.location.pathname, + url: window.location.hostname, + page: { + path: null, + search: null, + referrer: null, + title: null, + url: null, + }, + }); +}; + +export { init, pageView, trackEvent }; diff --git a/src/src/services/api/api.ts b/src/src/services/api/api.ts new file mode 100644 index 00000000..93615f5a --- /dev/null +++ b/src/src/services/api/api.ts @@ -0,0 +1,379 @@ +import Cookies from 'js-cookie'; + +import { getAPIHost, getAPIAuthToken } from 'config/config'; + +import ENDPOINTS from './endpoints'; + +export interface AuthToken { + /** + * @description access_token is the token of the user + * @example "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9" + */ + access_token: string; + /** + * @description token_type is the type of the token + * @example "bearer" + */ + token_type: string; + /** + * @description refresh_token is the refresh token of the user + * @example 3600 + */ + refresh_token: string; +} + +const AUTH_TOKEN_KEY = 'Auth'; +const AUTH_REFRESH_TOKEN_KEY = 'token'; +const AUTH_USER_KEY = 'user'; + +export const CONTENT_TYPE = { + JSON: 'application/json', + FORM_DATA: 'application/x-www-form-urlencoded', +}; + +function createAPIRequestWrapper( + url: string, + options: RequestInit = {}, + stream: boolean = false, + apiHost: string = getAPIHost(), +) { + const controller = new AbortController(); + const signal = controller.signal; + + return { + call: (exceptionHandler?: (error: ResponseDataType) => any) => + new Promise((resolve: (data: ResponseDataType) => void, reject) => { + fetch(`${apiHost}/${url}`, { ...options, signal }) + .then(async (response) => { + try { + if (response.status >= 400) { + const body = await response.json(); + + if (typeof exceptionHandler === 'function') { + exceptionHandler(body); + } + + return await checkCredentials( + response, + url, + () => + createAPIRequestWrapper( + url, + options, + stream, + apiHost, + ).call(exceptionHandler), + ); + } + const data = stream ? response.body : await response.json(); + + resolve(data); + } catch (err: Error | any) { + if (typeof exceptionHandler === 'function') { + exceptionHandler(err); + } + reject(err); + } + }) + .catch((err: Error | any) => { + if (err.name === 'AbortError') { + // Fetch aborted + } else { + if (typeof exceptionHandler === 'function') { + exceptionHandler(err); + } + reject(err); + } + }); + }), + abort: () => controller.abort(), + }; +} + +function getStream( + url: string, + params?: {}, + options?: RequestInit, + apiHost: string = getAPIHost(), +) { + return createAPIRequestWrapper( + `${url}${ + options?.method === 'POST' + ? '' + : params + ? '?' + new URLSearchParams(params).toString() + : '' + }`, + { + method: 'GET', + ...options, + headers: getRequestHeaders(), + ...(options?.method === 'POST' && { + body: JSON.stringify(params), + }), + }, + true, + apiHost, + ); +} + +function getStream1( + url: string, + params?: {}, + options?: RequestInit, + apiHost: string = getAPIHost(), +) { + return createAPIRequestWrapper( + `${url}${ + options?.method === 'POST' && params + ? '?' + new URLSearchParams(params).toString() + : '' + }`, + { + method: 'GET', + ...options, + headers: getRequestHeaders(), + ...(options?.method === 'POST' && { + body: JSON.stringify(options.body), + }), + }, + true, + apiHost, + ); +} + +function get( + url: string, + params?: {}, + options?: RequestInit, + apiHost: string = getAPIHost(), +) { + return createAPIRequestWrapper( + `${url}${params ? '?' + new URLSearchParams(params).toString() : ''}`, + { + method: 'GET', + ...options, + headers: getRequestHeaders(), + }, + false, + apiHost, + ); +} + +function post( + url: string, + data: object, + options?: RequestInit, + apiHost: string = getAPIHost(), +) { + return createAPIRequestWrapper( + url, + { + method: 'POST', + ...options, + headers: getRequestHeaders(), + body: JSON.stringify(data), + }, + false, + apiHost, + ); +} + +function put( + url: string, + data: object, + options?: RequestInit, + apiHost: string = getAPIHost(), +) { + return createAPIRequestWrapper( + url, + { + method: 'PUT', + ...options, + headers: getRequestHeaders(), + body: JSON.stringify(data), + }, + false, + apiHost, + ); +} + +function remove( + url: string, + options?: RequestInit, + apiHost: string = getAPIHost(), +) { + return createAPIRequestWrapper( + url, + { + method: 'DELETE', + ...options, + headers: getRequestHeaders(), + }, + false, + apiHost, + ); +} + +/** + * getTimezoneOffset is a function that returns the timezone offset + * @returns string + * @example + * const timezoneOffset = getTimezoneOffset(); + */ +function getTimezoneOffset(): string { + return `${new Date().getTimezoneOffset()}`; +} + +/** + * getRequestHeaders is a function that returns the request headers + * @returns object + * @example + * const requestHeaders = getRequestHeaders(); + * const response = await fetch(`${API_ROOT}${endpoint}`, { + * method: "POST", + * headers: requestHeaders, + * body: JSON.stringify(data), + * }); + */ +function getRequestHeaders(headers = {}) { + const requestHeaders: Record = { + 'X-Timezone-Offset': getTimezoneOffset(), + 'Content-Type': CONTENT_TYPE.JSON, + ...headers, + }; + const Authorization = getAuthToken(); + if (Authorization) { + requestHeaders.Authorization = Authorization; + } + return requestHeaders; +} + +/** + * getAuthToken - Gets the token from local storage + * @returns {string} - The token + */ +function getAuthToken(): string { + if (typeof window === 'undefined') { + return getAPIAuthToken(); + } + return localStorage.getItem(AUTH_TOKEN_KEY) || ''; +} + +/** + * removeAuthToken - Removes the token from local storage and refresh token from cookies + * @returns {void} + */ +function removeAuthToken(): void { + localStorage.removeItem(AUTH_TOKEN_KEY); + localStorage.removeItem(AUTH_USER_KEY); + removeRefreshToken(); +} + +/** + * setAuthToken - Sets the token in local storage and refresh token in cookies + * @param {AuthToken} token - The token object + * @returns {void} + */ +function setAuthToken({ + token_type, + refresh_token, + access_token, +}: AuthToken): void { + localStorage.setItem(AUTH_TOKEN_KEY, `${token_type} ${access_token}`); + setRefreshToken(refresh_token); +} + +/** + * setRefreshToken - Sets the refresh token in cookies + * @param refresh_token - The refresh token + * @returns {void} + */ +function setRefreshToken(refresh_token: string): void { + Cookies.set(AUTH_REFRESH_TOKEN_KEY, refresh_token); +} + +/** + * removeRefreshToken - Removes the refresh token from cookies + * @returns {void} + */ +function removeRefreshToken(): void { + Cookies.remove(AUTH_REFRESH_TOKEN_KEY); +} + +/** + * refreshToken is a function that makes a GET request to the auth endpoint for refresh the token + * @returns IResponse + * @throws Error + */ +function refreshToken() { + return get( + `${ENDPOINTS.AUTH.BASE}/${ENDPOINTS.AUTH.REFRESH}`, + undefined, + { + credentials: + process.env.NODE_ENV === 'development' ? 'include' : 'same-origin', + }, + `${window.location.origin}/api`, + ); +} + +/** + * parseResponse is a generic function that parses the response body + * @param response is the response object + * @returns + * @throws Error + * @example + * const response = await fetch(`${API_ROOT}${endpoint}`); + * return parseResponse(response); + */ +async function parseResponse(response: Response): Promise { + try { + const data = await response.json(); + if (response.ok) { + return data; + } else { + return Promise.reject(new Error(data.message)); + } + } catch (error) { + throw error; + } +} + +async function checkCredentials( + response: Response, + endpoint: string, + refetch: () => Promise, +): Promise { + if (response.status === 401) { + if (endpoint === `${ENDPOINTS.AUTH.BASE}/${ENDPOINTS.AUTH.REFRESH}`) { + removeAuthToken(); + window.location.assign(`${window.location.origin}/sign-in`); + return parseResponse(response); + } + if (localStorage.getItem('refreshing') !== 'true') { + localStorage.setItem('refreshing', 'true'); + // Refresh token + const token = await refreshToken().call(); + if (token) { + setAuthToken(token); + localStorage.setItem('refreshing', 'false'); + window.location.reload(); + return refetch(); + } + localStorage.setItem('refreshing', 'false'); + } + } + return parseResponse(response); +} + +const API = { + get, + getStream, + getStream1, + post, + put, + delete: remove, +}; + +export default API; diff --git a/src/src/services/api/apps/appsService.ts b/src/src/services/api/apps/appsService.ts new file mode 100644 index 00000000..83875783 --- /dev/null +++ b/src/src/services/api/apps/appsService.ts @@ -0,0 +1,38 @@ +import { IAppData } from 'types/services/models/metrics/metricsAppModel'; +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + APPS: 'apps', +}; + +function fetchAppsList(): IApiRequest { + return API.get(endpoints.APPS); +} + +function fetchApp(id: string): IApiRequest { + return API.get(`${endpoints.APPS}/${id}`); +} + +function createApp(reqBody: IAppData): IApiRequest { + return API.post(endpoints.APPS, reqBody); +} + +function updateApp(id: string, reqBody: IAppData): IApiRequest { + return API.put(`${endpoints.APPS}/${id}`, reqBody); +} + +function deleteApp(id: string): IApiRequest { + return API.delete(`${endpoints.APPS}/${id}`); +} +const appsService = { + endpoints, + fetchAppsList, + fetchApp, + createApp, + updateApp, + deleteApp, +}; + +export default appsService; diff --git a/src/src/services/api/audiosExplore/audiosExplore.ts b/src/src/services/api/audiosExplore/audiosExplore.ts new file mode 100644 index 00000000..a87955af --- /dev/null +++ b/src/src/services/api/audiosExplore/audiosExplore.ts @@ -0,0 +1,26 @@ +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + GET_AUDIOS: 'runs/search/audios', + GET_AUDIOS_BY_URIS: 'runs/audios/get-batch', +}; + +function getAudiosExploreData(params: {}): IApiRequest { + return API.getStream(endpoints.GET_AUDIOS, params); +} + +function getAudiosByURIs(body: string[]): IApiRequest { + return API.getStream>(endpoints.GET_AUDIOS_BY_URIS, body, { + method: 'POST', + }); +} + +const audiosExploreService = { + endpoints, + getAudiosExploreData, + getAudiosByURIs, +}; + +export default audiosExploreService; diff --git a/src/src/services/api/dashboard/dashboardService.ts b/src/src/services/api/dashboard/dashboardService.ts new file mode 100644 index 00000000..51381504 --- /dev/null +++ b/src/src/services/api/dashboard/dashboardService.ts @@ -0,0 +1,49 @@ +import { + IAppData, + IDashboardRequestBody, +} from 'types/services/models/metrics/metricsAppModel'; +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + DASHBOARD: 'dashboards', +}; + +function fetchDashboardsList(): IApiRequest { + return API.get(endpoints.DASHBOARD); +} + +function fetchDashboard(id: string): IApiRequest { + return API.get(`${endpoints.DASHBOARD}/${id}`); +} + +function createDashboard( + reqBody: IDashboardRequestBody, +): IApiRequest { + return API.post(endpoints.DASHBOARD, reqBody, { + headers: { 'Content-type': 'application/json' }, + }); +} + +function updateDashboard( + id: string, + reqBody: IDashboardRequestBody, +): IApiRequest { + return API.put(`${endpoints.DASHBOARD}/${id}`, reqBody); +} + +function deleteDashboard(id: string): IApiRequest { + return API.delete(`${endpoints.DASHBOARD}/${id}`); +} + +const dashboardService = { + endpoints, + createDashboard, + fetchDashboardsList, + fetchDashboard, + updateDashboard, + deleteDashboard, +}; + +export default dashboardService; diff --git a/src/src/services/api/endpoints.ts b/src/src/services/api/endpoints.ts new file mode 100644 index 00000000..56c64848 --- /dev/null +++ b/src/src/services/api/endpoints.ts @@ -0,0 +1,51 @@ +const ENDPOINTS = { + PROJECTS: { + BASE: '/projects', + GET: '', + GET_ACTIVITY: 'activity', + GET_PARAMS: 'params', + }, + + RUNS: { + BASE: '/runs', + GET: '', + SEARCH: 'search', + ACTIVE: 'active', + }, + + EXPERIMENTS: { + BASE: '/experiments', + GET: '', + CREATE: '', + SEARCH: 'search', + GET_ACTIVITY: 'activity', + GET_NOTE: 'note', + CREATE_NOTE: 'note', + }, + + DASHBOARDS: { + BASE: '/dashboards', + GET: '', + CREATE: '', + SEARCH: 'search', + }, + + TAGS: { + BASE: '/tags', + GET: '', + CREATE: '', + UPDATE: '', + DELETE: '', + }, + RELEASE_NOTES: { + BASE: 'https://api.github.com/repos/aimhubio/aim/releases', + GET: '', + GET_BY_TAG_NAME: 'tags', + }, + AUTH: { + BASE: 'auth', + REFRESH: 'refresh', + }, +}; + +export default ENDPOINTS; diff --git a/src/src/services/api/experiments/experimentsService.ts b/src/src/services/api/experiments/experimentsService.ts new file mode 100644 index 00000000..ed1f736b --- /dev/null +++ b/src/src/services/api/experiments/experimentsService.ts @@ -0,0 +1,57 @@ +import { IExperimentData } from 'modules/core/api/experimentsApi'; + +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + EXPERIMENTS: 'experiments', + GET_EXPERIMENT_BY_ID: (id: string) => `experiments/${id}`, + UPDATE_EXPERIMENT_BY_ID: (id: string) => `experiments/${id}`, + SEARCH_EXPERIMENT: (query: string) => `experiments/search=${query}`, + GET_RUNS_BY_EXPERIMENT_ID: (id: string) => `experiments/${id}/runs`, +}; + +function getExperimentsData(): IApiRequest { + return API.get(endpoints.EXPERIMENTS); +} + +function searchExperiment(query: string): IApiRequest { + return API.get(endpoints.SEARCH_EXPERIMENT(query)); +} + +function getExperimentById(id: string): IApiRequest { + return API.get(endpoints.GET_EXPERIMENT_BY_ID(id)); +} + +function updateExperimentById( + reqBody: { name?: string; archived?: boolean }, + id: string, +): IApiRequest<{ status: string; id: string }> { + return API.put(endpoints.UPDATE_EXPERIMENT_BY_ID(id), reqBody); +} + +function createExperiment(reqBody: { + name: string; +}): IApiRequest<{ id: string; status: string }> { + return API.post(endpoints.EXPERIMENTS, reqBody); +} + +function getRunsOfExperiment( + id: string, + params: { limit: number; offset?: string } = { limit: 10 }, +) { + return API.get(endpoints.GET_RUNS_BY_EXPERIMENT_ID(id), params); +} + +const experimentsService = { + endpoints, + getExperimentsData, + searchExperiment, + getExperimentById, + updateExperimentById, + createExperiment, + getRunsOfExperiment, +}; + +export default experimentsService; diff --git a/src/src/services/api/imagesExplore/imagesExploreService.ts b/src/src/services/api/imagesExplore/imagesExploreService.ts new file mode 100644 index 00000000..9e864b33 --- /dev/null +++ b/src/src/services/api/imagesExplore/imagesExploreService.ts @@ -0,0 +1,26 @@ +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + GET_IMAGES: 'runs/search/images', + GET_IMAGES_BY_URIS: 'runs/images/get-batch', +}; + +function getImagesExploreData(params: {}): IApiRequest { + return API.getStream(endpoints.GET_IMAGES, params); +} + +function getImagesByURIs(body: string[]): IApiRequest { + return API.getStream>(endpoints.GET_IMAGES_BY_URIS, body, { + method: 'POST', + }); +} + +const imagesExploreService = { + endpoints, + getImagesExploreData, + getImagesByURIs, +}; + +export default imagesExploreService; diff --git a/src/src/services/api/metrics/metricsMock.ts b/src/src/services/api/metrics/metricsMock.ts new file mode 100644 index 00000000..a12e5fbc --- /dev/null +++ b/src/src/services/api/metrics/metricsMock.ts @@ -0,0 +1,83 @@ +const hparams = { + lr: [0.0001, 0.0003, 0.0007, 0.001, 0.002, 0.01], + batch_size: [32, 64], + seed: [1, 3, 5, 7], + foo: ['bar', 'baz'], +}; + +function generateMetrics(count = 500, pointsCount = 50) { + const runsContainer = []; + for (let i = 0; i < count / 2; i++) { + runsContainer.push({ + experiment_name: `experiment${i + 1}`, + name: `runs${i + 1}`, + run_hash: generateRunHash(`${i}`), + params: { + hparams: { + lr: hparams.lr[Math.round(Math.random() * 6)], + batch_size: hparams.batch_size[Math.round(Math.random() * 2)], + seed: hparams.seed[Math.round(Math.random() * 4)], + foo: hparams.foo[Math.round(Math.random() * 2)], + }, + }, + metrics: ['train', 'val'].map((context) => { + return { + metric_name: 'foo', + context: { + subset: context, + }, + data: { + values: new Float64Array( + context === 'val' + ? [...Array(Math.ceil(pointsCount / 3))].map( + (e, j) => Math.random() * -1.1 + Math.random() * (j + 1), + ) + : [...Array(pointsCount)].map( + (e, j) => Math.random() * -1.1 + Math.random() * (j + 1), + ), + ), + steps: new Uint32Array( + context === 'val' + ? [...Array(Math.ceil(pointsCount / 3))] + .fill(0) + .map((e, i) => i * 10) + : [...Array(pointsCount)].fill(0).map((e, i) => i * 10), + ), + epochs: new Uint32Array( + context === 'val' ? [0, 1, 2] : [0, 0, 1, 1, 1, 2, 2], + ), + iterations: new Uint32Array( + context === 'val' + ? [...Array(Math.ceil(pointsCount / 3))] + .fill(0) + .map((e, i) => i * 10) + : [...Array(pointsCount)].fill(0).map((e, i) => i * 10), + ), + timestamp: new Uint32Array( + context === 'val' + ? [1624564800000, 1624564850820, 1624564876596] + : [ + 1624564800000, 1624564821000, 1624564834070, 1624564850820, + 1624564857000, 1624564865427, 1624564876596, + ], + ), + }, + }; + }), + }); + } + + return runsContainer; +} + +function generateRunHash(prefix: string) { + let result = ''; + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; + const charactersLength = characters.length; + for (let i = 0; i < 8; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return `${prefix}${result}`; +} + +export default generateMetrics; diff --git a/src/src/services/api/metrics/metricsService.ts b/src/src/services/api/metrics/metricsService.ts new file mode 100644 index 00000000..3f72d511 --- /dev/null +++ b/src/src/services/api/metrics/metricsService.ts @@ -0,0 +1,50 @@ +import { IApiRequest } from 'types/services/services'; +import { IAlignMetricsDataParams } from 'types/services/models/metrics/metricsAppModel'; + +import API from '../api'; +// import generateMetrics from './metricsMock'; +// import { IRun } from 'types/services/models/metrics/runModel'; + +const endpoints = { + GET_METRICS: 'runs/search/metric', + GET_ALIGNED_METRICS: 'runs/search/metric/align', +}; + +function getMetricsData(params: {}): IApiRequest { + return API.getStream(endpoints.GET_METRICS, params); + + // We will not remove this part yet, though we will need to refactor mock data structure + // due to API schema changes + + // return { + // call: () => ({ + // then: (resolve: (data: IRun[]) => void, reject?: unknown) => { + // setTimeout(() => { + // const mock = generateMetrics(200, 100); + // resolve(mock); + // }, 1000); + // }, + // }), + // abort: () => null, + // }; +} + +function fetchAlignedMetricsData( + params: IAlignMetricsDataParams, +): IApiRequest { + return API.getStream>( + endpoints.GET_ALIGNED_METRICS, + params, + { + method: 'POST', + }, + ); +} + +const metricsService = { + endpoints, + getMetricsData, + fetchAlignedMetricsData, +}; + +export default metricsService; diff --git a/src/src/services/api/notes/notesService.ts b/src/src/services/api/notes/notesService.ts new file mode 100644 index 00000000..22a83b65 --- /dev/null +++ b/src/src/services/api/notes/notesService.ts @@ -0,0 +1,57 @@ +import { + INoteReqBody, + INote, + INotesList, +} from 'types/services/models/notes/notes'; +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + GET_NOTES_LIST: (run_id: string): string => `runs/${run_id}/note`, + CREATE_NOTE: (run_id: string): string => `runs/${run_id}/note`, + GET_SINGLE_NOTE: (run_id: string, note_id: number): string => + `runs/${run_id}/note/${note_id}`, + UPDATE_NOTE: (run_id: string, note_id: number): string => + `runs/${run_id}/note/${note_id}`, + DELETE_NOTE: (run_id: string, note_id: number): string => + `runs/${run_id}/note/${note_id}`, +}; + +function getNotes(runId: string): IApiRequest { + return API.get(endpoints.GET_NOTES_LIST(runId)); +} + +function createNote(runId: string, reqBody: INoteReqBody): IApiRequest { + return API.post(endpoints.CREATE_NOTE(runId), reqBody, { + headers: { 'Content-type': 'application/json' }, + }); +} + +function getSingleNote(runId: string, noteId: number): IApiRequest { + return API.get(endpoints.GET_SINGLE_NOTE(runId, noteId)); +} + +function updateNote( + runId: string, + noteId: number, + reqBody: INoteReqBody, +): IApiRequest { + return API.put(endpoints.UPDATE_NOTE(runId, noteId), reqBody, { + headers: { 'Content-type': 'application/json' }, + }); +} + +function deleteNote(runId: string, noteId: number): IApiRequest { + return API.delete(endpoints.DELETE_NOTE(runId, noteId)); +} + +const notesService = { + getNotes, + getSingleNote, + createNote, + updateNote, + deleteNote, +}; + +export default notesService; diff --git a/src/src/services/api/projects/projectsService.ts b/src/src/services/api/projects/projectsService.ts new file mode 100644 index 00000000..5aca1cd6 --- /dev/null +++ b/src/src/services/api/projects/projectsService.ts @@ -0,0 +1,57 @@ +import { + IPinnedSequencesResData, + IProject, + IProjectParamsMetrics, +} from 'types/services/models/projects/projectsModel'; +import { IApiRequest } from 'types/services/services'; + +import API from '../api'; + +const endpoints = { + GET_PROJECTS: 'projects', + GET_ACTIVITIES: 'projects/activity', + GET_PROJECTS_PARAMS: 'projects/params', + PINNED_SEQUENCES: 'projects/pinned-sequences', +}; + +function getProjectsData(): IApiRequest { + return API.get(endpoints.GET_PROJECTS); +} + +function fetchActivityData(): IApiRequest { + return API.get(endpoints.GET_ACTIVITIES); +} + +function getProjectParams( + sequences: string[] = ['metric'], +): IApiRequest { + const query = sequences.reduce( + (acc: string, sequence: string, index: number) => { + acc += `${index === 0 ? '?' : '&'}sequence=${sequence}`; + return acc; + }, + '', + ); + return API.get(endpoints.GET_PROJECTS_PARAMS + query); +} + +function getPinnedSequences(): IApiRequest { + return API.get(endpoints.PINNED_SEQUENCES); +} + +function setPinnedSequences( + body: IPinnedSequencesResData, +): IApiRequest { + return API.post(endpoints.PINNED_SEQUENCES, body); +} + +const projectsService = { + endpoints, + getProjectsData, + fetchActivityData, + getProjectParams, + getPinnedSequences, + setPinnedSequences, +}; + +export default projectsService; diff --git a/src/src/services/api/runs/paramsMock.ts b/src/src/services/api/runs/paramsMock.ts new file mode 100644 index 00000000..e055ccf5 --- /dev/null +++ b/src/src/services/api/runs/paramsMock.ts @@ -0,0 +1,87 @@ +import COLORS from 'config/colors/colors'; + +import { encode } from 'utils/encoder/encoder'; +/* eslint-disable no-loop-func */ +function randomGenerateLineData(count: number, dimensions: any) { + const dKeys = Object.keys(dimensions); + const data: any = []; + let f = 0; + for (let i = 0; i < count; i++) { + let a = {}; + f++; + dKeys.forEach((key) => { + f = f + 1; + if (f % 13 === 0) { + //@ts-ignore + a[key] = null; + } else { + if (dimensions[key].scaleType === 'linear') { + //@ts-ignore + a[key] = getRandomIntInclusive(...dimensions[key].domainData); + } else { + //@ts-ignore + a[key] = + dimensions[key].domainData[ + getRandomDoubleInclusive(0, dimensions[key].domainData.length - 1) + ]; + } + } + }); + data.push({ + values: a, + key: encode({ a }), + color: COLORS[0][i % COLORS[0].length], + }); + } + + return { + dimensions, + data, + }; +} + +export const mockData = randomGenerateLineData(10, { + column1: { scaleType: 'linear', domainData: [2, 5.6] }, + column2: { + scaleType: 'point', + domainData: [ + '+inf', + 'None', + '12', + 'hinalsfhsaifhsaifhoasihfoiawhfiwahfoiawhfowihhinalsfhsaifhsaifhoasihfoiawhfiwahfoiawhfowihff', + '-inf', + ], + }, + column3: { scaleType: 'linear', domainData: [3, 5] }, + column4: { scaleType: 'linear', domainData: [1, 2] }, + column5: { scaleType: 'linear', domainData: [8, 22] }, + column6: { scaleType: 'linear', domainData: [45, 60] }, +}); + +export const mockData2 = randomGenerateLineData(15, { + column1: { scaleType: 'linear', domainData: [2, 5.6] }, + column2: { + scaleType: 'point', + domainData: [ + '+inf', + 'None', + '12', + 'hinalsfhsaifhsaifhoasihfoiawhfiwahfoiawhfowihhinalsfhsaifhsaifhoasihfoiawhfiwahfoiawhfowihff', + '-inf', + ], + }, + column3: { scaleType: 'linear', domainData: [3, 5] }, + column4: { scaleType: 'linear', domainData: [1, 2] }, + column5: { scaleType: 'linear', domainData: [8, 22] }, + column6: { scaleType: 'linear', domainData: [45, 60] }, +}); + +function getRandomIntInclusive(min: number, max: number) { + return Math.random() * (max - min) + min; +} + +function getRandomDoubleInclusive(min: number, max: number) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; +} diff --git a/src/src/services/api/runs/runsService.ts b/src/src/services/api/runs/runsService.ts new file mode 100644 index 00000000..777001f1 --- /dev/null +++ b/src/src/services/api/runs/runsService.ts @@ -0,0 +1,127 @@ +import { TraceType } from 'services/models/runs/types'; + +import API from '../api'; + +const endpoints = { + GET_RUNS: 'runs/search/run', + GET_EXPERIMENTS: 'experiments', + GET_RUN_INFO: (id: string) => `runs/${id}/info`, + GET_RUN_LOGS: (id: string) => `runs/${id}/logs`, + GET_RUN_METRICS_BATCH_BY_TRACES: (id: string) => + `runs/${id}/metric/get-batch`, + EDIT_RUN: (id: string) => `runs/${id}`, + ARCHIVE_RUNS: (archived: boolean) => `runs/archive-batch?archive=${archived}`, + DELETE_RUN: (id: string) => `runs/${id}`, + DELETE_RUNS: 'runs/delete-batch', + ATTACH_RUNS_TAG: (id: string) => `runs/${id}/tags/new`, + DELETE_RUNS_TAG: (id: string, tag_id: string) => `runs/${id}/tags/${tag_id}`, + GET_BATCH: (id: string, trace: string) => `runs/${id}/${trace}/get-batch`, + GET_BATCH_BY_STEP: (id: string, trace: string) => + `runs/${id}/${trace}/get-step`, +}; + +function getRunsData(query?: string, limit?: number, offset?: string) { + return API.getStream(endpoints.GET_RUNS, { + q: query || '', + ...(limit ? { limit } : {}), + ...(offset ? { offset } : {}), + }); +} + +function getRunLogs(id: string, record_range?: string) { + return API.getStream(endpoints.GET_RUN_LOGS(id), { + record_range: record_range ?? '', + }); +} + +function getRunInfo(id: string) { + return API.get(endpoints.GET_RUN_INFO(id)); +} + +function getExperimentsData() { + return API.get(endpoints.GET_EXPERIMENTS); +} + +function getRunMetricsBatch(body: any, id: string) { + return API.post(endpoints.GET_RUN_METRICS_BATCH_BY_TRACES(id), body); +} + +function archiveRun(id: string, archived: boolean = false) { + return API.put(endpoints.EDIT_RUN(id), { archived }); +} + +function editRunNameAndDescription( + id: string, + name: string, + description: string, + archived: boolean, +) { + return API.put(endpoints.EDIT_RUN(id), { name, description, archived }); +} + +function archiveRuns(ids: string[], archived: boolean = false) { + return API.post(endpoints.ARCHIVE_RUNS(archived), ids); +} + +function deleteRun(id: string) { + return API.delete(endpoints.DELETE_RUN(id)); +} + +function deleteRuns(ids: string[]) { + return API.post(endpoints.DELETE_RUNS, ids); +} + +function attachRunsTag(body: object, run_id: string) { + return API.post(endpoints.ATTACH_RUNS_TAG(run_id), body); +} + +function deleteRunsTag(run_id: string, tag_id: string) { + return API.delete(endpoints.DELETE_RUNS_TAG(run_id, tag_id)); +} + +function getBatch(run_id: string, trace: TraceType, params: any, body: any) { + return API.getStream1( + endpoints.GET_BATCH(run_id, trace), + params, + { + method: 'POST', + body, + }, + ); +} + +function getBatchByStep( + run_id: string, + trace: TraceType, + params: any, + body: any, +) { + return API.getStream1( + endpoints.GET_BATCH_BY_STEP(run_id, trace), + params, + { + method: 'POST', + body, + }, + ); +} + +const runsService = { + endpoints, + getBatch, + getBatchByStep, + getRunsData, + getRunInfo, + getRunLogs, + getRunMetricsBatch, + getExperimentsData, + archiveRun, + deleteRun, + attachRunsTag, + deleteRunsTag, + archiveRuns, + deleteRuns, + editRunNameAndDescription, +}; + +export default runsService; diff --git a/src/src/services/api/tags/tagsService.ts b/src/src/services/api/tags/tagsService.ts new file mode 100644 index 00000000..25d8c65f --- /dev/null +++ b/src/src/services/api/tags/tagsService.ts @@ -0,0 +1,70 @@ +import API from '../api'; + +const endpoints = { + GET_TAGS: 'tags', + GET_TAG: 'tags/', + CREATE_TAG: 'tags', + UPDATE_TAG: 'tags/', + GET_TAG_RUNS: (id: string) => `tags/${id}/runs`, +}; + +function getTags() { + return API.get(endpoints.GET_TAGS); +} + +function getTagRuns(id: string) { + return API.get(endpoints.GET_TAG_RUNS(id)); +} + +function createTag(body: object) { + return API.post(endpoints.GET_TAGS, body, { + headers: { + 'Content-Type': 'application/json', + }, + }); +} + +function updateTag(body: object, id: string) { + return API.put(endpoints.UPDATE_TAG + id, body, { + headers: { + 'Content-Type': 'application/json', + }, + }); +} + +function getTagById(id: string) { + return API.get(endpoints.GET_TAG + id); +} + +function hideTag(id: string, archived: boolean) { + return API.put( + endpoints.GET_TAG + id, + { archived }, + { + headers: { + 'Content-Type': 'application/json', + }, + }, + ); +} + +function deleteTag(id: string) { + return API.delete(endpoints.GET_TAG + id, { + headers: { + 'Content-Type': 'application/json', + }, + }); +} + +const tagsService = { + endpoints, + getTags, + createTag, + updateTag, + getTagById, + getTagRuns, + hideTag, + deleteTag, +}; + +export default tagsService; diff --git a/src/src/services/live-update/README.md b/src/src/services/live-update/README.md new file mode 100644 index 00000000..b41a896f --- /dev/null +++ b/src/src/services/live-update/README.md @@ -0,0 +1,39 @@ +## Usage + +````js + // to describe webpack as this is a worker file + import LUWorker from 'comlink-loader!./services/live-update/Worker'; + import { getDataFromTransferable } from 'services/live-update' + import * as Comlink from 'comlink'; + + function initizeWorker(subscriber) { + let worker = new LUWorker(); + + // set config [name, uri, delay, enableLog] + worker.setConfig('Runs', 'runs/search/run', 1000, true); + worker.subscribeToApiCallResult( + // if subscriber has a context, please bind to the context + Comlink.proxy(subscriber), + ); + + return worker; + } + + const subscriber = (data) => { + const obj = getDataFromTransferable(data); + console.log("DATA --- ", obj); + + // send to render + } + + const w = initizeWorker(subscriber); + + w.start({ q: 'test', limit: 50 }) + // some condition + w.stop().then().catch()// will pause to call + // some condition + // w.start({ q: 'test1', limit: 60 }).then().catch() + + // to terminate + w.close(); +```` \ No newline at end of file diff --git a/src/src/services/live-update/Worker.ts b/src/src/services/live-update/Worker.ts new file mode 100644 index 00000000..d0923b00 --- /dev/null +++ b/src/src/services/live-update/Worker.ts @@ -0,0 +1,274 @@ +/** + * @TODO improve logging, exception handling + */ + +/* eslint-disable no-console */ + +import * as Comlink from 'comlink'; + +import { setAPIBasePath, setAPIAuthToken } from 'config/config'; + +import { + decodeBufferPairs, + decodePathsVals, + iterFoldTree, +} from 'utils/encoder/streamEncoding'; + +import { + Scheduler, + ApiMethods, + ISubscriptions, + SubscriptionTypes, + WorkerApiCallResultSubscriber, +} from './types'; +import { + createGetStream, + createTransferableData, + invariantError, + invariantSuccess, +} from './utils'; + +/* + * Subscribers collection grouped by subscription type + * Currently type 'API_CALL_RESULT' is the only subscription type, + * but it is possible to add some types here + */ +let subscriptions: ISubscriptions = { + [SubscriptionTypes.API_CALL_RESULT]: [], +}; + +/* + * symbol to identify the worker instance + * can be useful for logs + */ +let key: Symbol; + +// delay +let schedulerDelay: number = 5000; + +// api url prefix +let url: string = ''; + +// scheduler +let schedule: Scheduler = { + timerId: null, + inProgress: false, +}; + +// api methods +let apiMethods: ApiMethods | null = null; + +// enable/disable logging +let logging = true; + +/** + * @external function subscribeToApiCallResult + * When using it from other thread + * it is no possible to send callback function using postMessage's parameter + * make callback function as a proxy using Comlink.proxy(callback), or implement proxy + * making it proxy is a chance to transfer callable native codes between different agents(threads, workers, ...) + * Useful when other threads, or internal methods have to listen api call's responses + * @param {WorkerApiCallResultSubscriber} subscriber - callback function to call after some event + */ +function subscribeToApiCallResult(subscriber: WorkerApiCallResultSubscriber) { + subscriptions[SubscriptionTypes.API_CALL_RESULT].push(subscriber); +} + +/** + * @internal + * function removeSubscribers + * Currently this function removes only subscribers grouped by 'API_CALL_RESULT' subscription + * Can be useful to reset instance of worker, make use for destroying instance + * @param {SubscriptionTypes} type - @TODO please refactor function body, if there is need to reset all subscriptions + */ +function removeSubscribers( + type: SubscriptionTypes = SubscriptionTypes.API_CALL_RESULT, +) { + subscriptions[type] = []; +} + +/** + * function transferApiCallResponse + * This function called once api response is ready, and need to send to subscribers + * @internal usage + * @param {ArrayLike} data - api call response, can be any + */ +function transferApiCallResponse(data: Array) { + if (subscriptions[SubscriptionTypes.API_CALL_RESULT].length) { + const transferable = createTransferableData(data); + subscriptions[SubscriptionTypes.API_CALL_RESULT].forEach( + (subscriber: WorkerApiCallResultSubscriber) => { + subscriber( + Comlink.transfer(transferable.buffer, [transferable.buffer]), + ); + }, + ); + } +} + +function clearScheduler() { + if (schedule.timerId) { + clearTimeout(schedule.timerId); + } + schedule = { + timerId: null, + inProgress: false, + }; +} + +function updateSchedule(timerId: number) { + schedule = { + timerId, + inProgress: true, + }; +} + +/** + * @internal + * schedule periodic function call + * @param {(q: string) => Promise} f - callback + */ +function scheduler(f: (q: string) => Promise) { + // @TODO improve + // now this will call every for delay ms, need to create delay after each other + + const timerId = setTimeout(f, schedulerDelay); + schedule = { + timerId, + inProgress: false, + }; +} + +/** + * @external function stop + * stop worker processes + * currently there is a single process (api call) + * calling stop function will abort the call, and will pause scheduler + * @return {Promise} - abort promise + */ +async function stop(): Promise { + try { + clearScheduler(); + if (apiMethods) { + await apiMethods.abort(); + apiMethods = null; + } + invariantSuccess(`Stopped ${key.toString()} success`, logging); + } catch (e: Error | any) { + clearScheduler(); + invariantError(e, logging); + throw e; + } +} + +/** + * @external function start + * @param {Object} params - params to send with http request + */ +function start(params: Object = {}): void { + apiMethods = createGetStream(url, params); + invariantSuccess(`Started ${key.toString()} success`, logging); + + scheduler(startUpdateCall); +} + +/** + * @internal + */ +async function startUpdateCall(): Promise { + // calculate nec-s; + const timerId = setTimeout(startUpdateCall, schedulerDelay); + try { + logging && console.time(`${key.toString()} operated`); + const stream = await apiMethods?.call(); + let bufferPairs = decodeBufferPairs(stream); + let decodedPairs = decodePathsVals(bufferPairs); + let objects = iterFoldTree(decodedPairs, 1); + + const data = []; + + for await (let [keys, val] of objects) { + const d: any = val; + data.push({ ...d, hash: keys[0] } as any); + } + + logging && console.timeEnd(`${key.toString()} operated`); + transferApiCallResponse(data); + + // @ts-ignore + updateSchedule(timerId); + } catch (e) { + // @ts-ignore + updateSchedule(timerId); + invariantError(e, logging); + // throw e; remove comment once there will be handle error out of worker + } +} + +/** + * @external function close + * function close + * close function is useful for cleanup, when worker has not usage + * close function will + * removes all subscribers + * removes internal objects to reduce garbage collector iterations + * terminate the worker + * Alternative is myWorkerInstanceProxy[Comlink.releaseProxy]() + * this will detach the proxy and the exposed object from the message channel, allowing both ends to be garbage collected. + * Will be useful when there is no need to terminate, just need to remove js proxies to temporarily cleanup the heap + */ +function close() { + // maybe this is no need, depends on terminated/released + removeSubscribers(); + + // eslint-disable-next-line no-restricted-globals + self.close(); +} + +/** + * @TODO make chance to set config as constructor parameters + * @external function setConfig + * function setConfig + * @param {string} name - the name to unify worker + * @param {string} endpoint - http call endpoint + * @param {number} delay - delay (milliseconds) + * @param {boolean} enableLog - enable/disable logging - default is disabled + */ +const setConfig = ( + name: string, + endpoint: string, + delay: number = 5000, + enableLog = false, +) => { + key = Symbol(`app.live.update.${name}`); + logging = enableLog; + url = endpoint; + schedulerDelay = delay; +}; + +export function errorHandler(error: ResponseType) { + invariantError(error, logging); +} + +function replaceBasePath(basePath: string) { + setAPIBasePath(basePath); +} + +function setAuthToken(authToken: string) { + setAPIAuthToken(authToken); +} + +const WebWorker = { + subscribeToApiCallResult, + setConfig, + start, + close, + stop, + replaceBasePath, + setAuthToken, +}; + +export type IWorker = typeof WebWorker; + +// @ts-ignore +Comlink.expose(WebWorker); diff --git a/src/src/services/live-update/examples/LiveUpdateBridge.example.js b/src/src/services/live-update/examples/LiveUpdateBridge.example.js new file mode 100644 index 00000000..1b207fb0 --- /dev/null +++ b/src/src/services/live-update/examples/LiveUpdateBridge.example.js @@ -0,0 +1,103 @@ +/** + * @see README.md for more details + */ +/* eslint-disable no-console */ + +import * as Comlink from 'comlink'; + +// eslint-disable-next-line import/no-webpack-loader-syntax +import LUWorker from 'comlink-loader!../Worker'; + +import { getDataFromTransferable } from '../utils'; + +const embeddedAppNames = { + runs: { + name: 'Runs', + endpoint: 'runs/search/run', + }, + metrics: { + name: 'Metrics', + endpoint: 'runs/search/metric', + }, + params: { + name: 'Params', + endpoint: 'runs/search/run', + }, + scatters: { + name: 'Scatters', + endpoint: 'runs/search/run', + }, +}; + +class UpdateService { + constructor(appName, responseListener, delay) { + this.appName = appName; + this.delay = delay; + this.responseListener = responseListener; + + this.instance = new LUWorker(); + this.instance.replaceBasePath(window.API_BASE_PATH); + this.instance.setAuthToken(localStorage.getItem('Auth') || ''); + this.instance.setConfig( + appName, + embeddedAppNames[this.appName].endpoint, + delay, + process.env.NODE_ENV === 'development', + ); + this.instance.subscribeToApiCallResult( + Comlink.proxy(this.responseHandler.bind(this)), + ); + } + + async stop() { + if (this.inProgress) { + try { + const stopResult = await this.instance.stop(); + this.inProgress = false; + return stopResult; + } catch (e) { + console.log("---- couldn't stop worker"); + } + } + } + + start(params) { + this.inProgress = true; + this.instance + .start({ ...params, report_progress: 'False' }) + .then() + .catch((e) => { + console.log('worker start exception --> ', e); + }); + } + + responseHandler(data) { + const obj = getDataFromTransferable(data); + + this.responseListener(obj); + } + + changeDelay(delay) { + this.stop() + .catch(() => { + console.log("---- couldn't change config"); + }) + .finally(() => { + this.instance.setConfig( + this.appName, + embeddedAppNames[this.appName].endpoint, + delay, + process.env.NODE_ENV === 'development', + ); + }); + } + + clear() { + this.stop().finally(() => { + this.instance.close(); + this.instance[Comlink.releaseProxy](); + }); + } +} + +export default UpdateService; diff --git a/src/src/services/live-update/index.ts b/src/src/services/live-update/index.ts new file mode 100644 index 00000000..c92ddad8 --- /dev/null +++ b/src/src/services/live-update/index.ts @@ -0,0 +1,9 @@ +import LiveUpdateService from './examples/LiveUpdateBridge.example'; +import { createTransferableData, getDataFromTransferable } from './utils'; +import { WorkerApiCallResultSubscriber } from './types'; + +export { createTransferableData, getDataFromTransferable }; + +export type Subscriber = WorkerApiCallResultSubscriber; + +export default LiveUpdateService; diff --git a/src/src/services/live-update/types.ts b/src/src/services/live-update/types.ts new file mode 100644 index 00000000..b989b42a --- /dev/null +++ b/src/src/services/live-update/types.ts @@ -0,0 +1,31 @@ +export enum SubscriptionTypes { + API_CALL_RESULT = 'API_CALL_RESULT', +} + +export type ExceptionHandler = (error: ResponseType) => void; + +export type ApiMethods = { + call: (exceptionHandler?: ExceptionHandler) => Promise; + abort: () => void; +}; + +export type Scheduler = { + timerId: null | number; + inProgress: boolean; +}; + +export type WorkerApiCallResultSubscriber = (data: ArrayBufferLike) => void; + +export interface IScheduler { + timerId: number | null; + inProgress: boolean; +} + +export interface ApiRequestParams { + query: string; + limit: number; +} + +export interface ISubscriptions { + [SubscriptionTypes.API_CALL_RESULT]: WorkerApiCallResultSubscriber[]; +} diff --git a/src/src/services/live-update/utils.ts b/src/src/services/live-update/utils.ts new file mode 100644 index 00000000..d7af4cdb --- /dev/null +++ b/src/src/services/live-update/utils.ts @@ -0,0 +1,115 @@ +/* eslint-disable no-console */ + +import API from 'services/api/api'; + +import { IApiRequest } from 'types/services/services'; + +const LogTypes = { + log: 'black', + error: 'red', + success: 'green', +}; + +enum LogTypeNames { + log = 'log', + error = 'error', + success = 'success', +} + +export function log( + message: string | Error | typeof Error, + type: LogTypeNames = LogTypeNames.log, +): void { + console.log(`%c ${message}`, `color: ${LogTypes[type]}`); +} + +export function invariantSuccess(message: string, condition: boolean): void { + if (condition) { + log(message, LogTypeNames.success); + } +} + +export function invariantError( + exception: string | Error | typeof Error, + condition: boolean, +): void { + if (condition) { + log(exception, LogTypeNames.error); + } +} + +/** + * function createGetStream + * Useful to dynamically create {call, abort} methods + * @param {String} endpoint - uri + * @param {Object} params - parameters to send with http call + */ +export function createGetStream( + endpoint: string, + params: Object, +): IApiRequest { + return API.getStream(endpoint, params); +} + +/** + * @internal function arrayBufferToString + * Converts an ArrayBuffer to a String. + * @param buffer - Buffer to convert. + * @returns String. + */ +function arrayBufferToString(buffer: ArrayBuffer): string { + return String.fromCharCode.apply(null, Array.from(new Uint8Array(buffer))); +} + +/** + * @internal function stringToArrayBuffer + * Converts a String to an ArrayBuffer. + * @param str - String to convert. + * @returns ArrayBuffer. + */ +function stringToArrayBuffer(str: string): ArrayBuffer { + const stringLength = str.length; + const buffer = new ArrayBuffer(stringLength); + const bufferView = new Uint8Array(buffer); + for (let i = 0; i < stringLength; i++) { + bufferView[i] = str.charCodeAt(i); + } + return bufferView; +} + +/** + * createTransferableData + * Useful to convert transferable data to non-transferable getting from Worker + * @param {ArrayBufferLike} data - buffer + * convert buffer to JSON parse result + */ +export function createTransferableData(data: any): Buffer { + const stringData = JSON.stringify(data, (k: string, v) => { + if (k === 'blob') { + return arrayBufferToString(v); + } + + return v; + }); + + return Buffer.from(stringData, 'utf-8'); +} + +/** + * getDataFromTransferable + * Useful to convert transferable data to non-transferable getting from Worker + * @param {ArrayBufferLike} data - buffer + * convert buffer to JSON parse result + */ +export function getDataFromTransferable(data: ArrayBufferLike): any { + const view = new DataView(data, 0, data.byteLength); + const decoder = new TextDecoder('utf-8'); + const string = decoder.decode(view.buffer); + + return JSON.parse(string, (k, v) => { + if (k === 'blob') { + return stringToArrayBuffer(v); + } + return v; + }); +} diff --git a/src/src/services/models/bookmarks/bookmarksAppModel.ts b/src/src/services/models/bookmarks/bookmarksAppModel.ts new file mode 100644 index 00000000..b1a5a763 --- /dev/null +++ b/src/src/services/models/bookmarks/bookmarksAppModel.ts @@ -0,0 +1,132 @@ +import dashboardService from 'services/api/dashboard/dashboardService'; +import appsService from 'services/api/apps/appsService'; + +import { IBookmarksAppModelState } from 'types/services/models/bookmarks/bookmarksAppModel'; +import { IBookmarksData } from 'types/pages/bookmarks/Bookmarks'; + +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; + +import createModel from '../model'; + +let bookmarksRequestRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; +}; + +const model = createModel({ + isLoading: true, + listData: [], + notifyData: [], +}); + +function getBookmarksData() { + const { call, abort } = dashboardService.fetchDashboardsList(); + return { + call: () => + call().then(async (data: any) => { + try { + const appsList = await appsService + .fetchAppsList() + .call((detail: any) => { + exceptionHandler({ detail, model: model as any }); + }); + const listData = data.map((item: any) => { + const app = appsList.find( + (appData: any) => appData.id === item.app_id, + ); + return { ...item, select: app.state.select, type: app.type }; + }); + model.setState({ + isLoading: false, + listData, + }); + } catch (err: any) { + onNotificationAdd({ + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + model: model as any, + }); + } + model.setState({ isLoading: false }); + }), + + abort, + }; +} + +function onBookmarksNotificationDelete(id: number) { + onNotificationDelete({ id, model }); +} + +async function onBookmarkDelete(id: string) { + try { + model.setState({ isLoading: true }); + await dashboardService.deleteDashboard(id).call((detail: any) => { + exceptionHandler({ detail, model }); + }); + const listData: IBookmarksData[] | any = model.getState()?.listData; + const newListData = [...listData].filter((bookmark) => bookmark.id !== id); + model.setState({ + listData: newListData, + isLoading: false, + }); + } catch (err: any) { + model.setState({ + isLoading: false, + }); + onNotificationAdd({ + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + model: model as any, + }); + } +} + +function initialize() { + model.init(); + try { + bookmarksRequestRef = getBookmarksData(); + bookmarksRequestRef.call((detail) => { + exceptionHandler({ detail, model: model as any }); + model.setState({ + isLoading: false, + }); + }); + } catch (err: any) { + onNotificationAdd({ + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + model: model as any, + }); + model.setState({ + isLoading: false, + }); + bookmarksRequestRef.abort(); + } +} + +function destroy() { + bookmarksRequestRef.abort(); + model.destroy(); +} +const bookmarkAppModel = { + ...model, + initialize, + destroy, + getBookmarksData, + onBookmarkDelete, + onBookmarksNotificationDelete, +}; + +export default bookmarkAppModel; diff --git a/src/src/services/models/explorer/config.ts b/src/src/services/models/explorer/config.ts new file mode 100644 index 00000000..2a3620c4 --- /dev/null +++ b/src/src/services/models/explorer/config.ts @@ -0,0 +1,324 @@ +import _ from 'lodash-es'; + +import { TABLE_DEFAULT_CONFIG } from 'config/table/tableConfigs'; +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { IModel } from 'types/services/models/model'; +import { + IAppInitialConfig, + IAppModelConfig, + IAppModelState, +} from 'types/services/models/explorer/createAppModel'; +import { IApiRequest } from 'types/services/services'; +import { IAppData } from 'types/services/models/metrics/metricsAppModel'; + +import { ChartTypeEnum } from 'utils/d3'; +import setDefaultAppConfigData from 'utils/app/setDefaultAppConfigData'; +import getAppConfigData from 'utils/app/getAppConfigData'; + +import createModel from '../model'; + +import { AppDataTypeEnum, AppNameEnum } from './index'; + +function initializeAppModel(appConfig: IAppInitialConfig): InitialAppModelType { + const { appName, dataType, grouping, components, selectForm } = appConfig; + + const model = createModel({ + requestStatus: RequestStatusEnum.NotRequested, + requestProgress: { + matched: 0, + checked: 0, + trackedRuns: 0, + }, + selectFormData: { options: undefined, suggestions: [] }, + config: getConfig(), + }); + + let appRequest: { + call: () => Promise; + abort: () => void; + }; + + function getConfig(): IAppModelConfig { + switch (dataType) { + case AppDataTypeEnum.METRICS: { + const config: IAppModelConfig = { + liveUpdate: { + delay: 10000, + enabled: false, + }, + }; + if (grouping) { + config.grouping = { + color: [], + stroke: [], + chart: ['name'], + reverseMode: { + color: false, + stroke: false, + chart: false, + }, + isApplied: { + color: true, + stroke: true, + chart: true, + }, + persistence: { + color: false, + stroke: false, + }, + seed: { + color: 10, + stroke: 10, + }, + paletteIndex: 0, + }; + } + if (components?.table) { + config.table = { + resizeMode: TABLE_DEFAULT_CONFIG.metrics.resizeMode, + rowHeight: TABLE_DEFAULT_CONFIG.metrics.rowHeight, + sortFields: [...TABLE_DEFAULT_CONFIG.metrics.sortFields], + hiddenMetrics: [...TABLE_DEFAULT_CONFIG.metrics.hiddenMetrics], + hiddenColumns: [...TABLE_DEFAULT_CONFIG.metrics.hiddenColumns], + columnsWidths: { tags: 300 }, + columnsOrder: { + left: [...TABLE_DEFAULT_CONFIG.metrics.columnsOrder.left], + middle: [...TABLE_DEFAULT_CONFIG.metrics.columnsOrder.middle], + right: [...TABLE_DEFAULT_CONFIG.metrics.columnsOrder.right], + }, + height: TABLE_DEFAULT_CONFIG.metrics.height, + }; + } + if (components?.charts?.[0]) { + if (components.charts.indexOf(ChartTypeEnum.LineChart) !== -1) { + config.chart = { + highlightMode: CONTROLS_DEFAULT_CONFIG.metrics.highlightMode, + ignoreOutliers: CONTROLS_DEFAULT_CONFIG.metrics.ignoreOutliers, + zoom: { + active: CONTROLS_DEFAULT_CONFIG.metrics.zoom.active, + mode: CONTROLS_DEFAULT_CONFIG.metrics.zoom.mode, + history: [], + }, + axesScaleType: { + xAxis: CONTROLS_DEFAULT_CONFIG.metrics.axesScaleType.xAxis, + yAxis: CONTROLS_DEFAULT_CONFIG.metrics.axesScaleType.yAxis, + }, + axesScaleRange: { + yAxis: CONTROLS_DEFAULT_CONFIG.metrics.axesScaleRange.yAxis, + xAxis: CONTROLS_DEFAULT_CONFIG.metrics.axesScaleRange.xAxis, + }, + smoothing: { + algorithm: CONTROLS_DEFAULT_CONFIG.metrics.smoothing.algorithm, + factor: CONTROLS_DEFAULT_CONFIG.metrics.smoothing.factor, + curveInterpolation: + CONTROLS_DEFAULT_CONFIG.metrics.smoothing.curveInterpolation, + isApplied: CONTROLS_DEFAULT_CONFIG.metrics.smoothing.isApplied, + }, + alignmentConfig: { + metric: CONTROLS_DEFAULT_CONFIG.metrics.alignmentConfig.metric, + type: CONTROLS_DEFAULT_CONFIG.metrics.alignmentConfig.type, + }, + densityType: CONTROLS_DEFAULT_CONFIG.metrics.densityType, + aggregationConfig: { + methods: { + area: CONTROLS_DEFAULT_CONFIG.metrics.aggregationConfig + .methods.area, + line: CONTROLS_DEFAULT_CONFIG.metrics.aggregationConfig + .methods.line, + }, + isApplied: + CONTROLS_DEFAULT_CONFIG.metrics.aggregationConfig.isApplied, + isEnabled: + CONTROLS_DEFAULT_CONFIG.metrics.aggregationConfig.isEnabled, + }, + tooltip: { + appearance: CONTROLS_DEFAULT_CONFIG.metrics.tooltip.appearance, + display: CONTROLS_DEFAULT_CONFIG.metrics.tooltip.display, + selectedFields: + CONTROLS_DEFAULT_CONFIG.metrics.tooltip.selectedFields, + }, + legends: { + display: CONTROLS_DEFAULT_CONFIG.metrics.legends.display, + mode: CONTROLS_DEFAULT_CONFIG.metrics.legends.mode, + }, + focusedState: { + key: null, + xValue: null, + yValue: null, + active: false, + chartIndex: null, + }, + }; + } + } + + if (selectForm) { + config.select = { + options: [], + query: '', + advancedMode: false, + advancedQuery: '', + }; + } + return config; + } + case AppDataTypeEnum.RUNS: { + const config: IAppModelConfig = { + liveUpdate: { + delay: 10000, + enabled: false, + }, + }; + if (grouping) { + config.grouping = { + color: [], + stroke: [], + chart: [], + reverseMode: { + color: false, + stroke: false, + chart: false, + }, + isApplied: { + color: true, + stroke: true, + chart: true, + }, + persistence: { + color: false, + stroke: false, + }, + seed: { + color: 10, + stroke: 10, + }, + paletteIndex: 0, + }; + } + if (components?.table) { + config.table = { + metricsValueKey: TABLE_DEFAULT_CONFIG.runs.metricsValueKey, + rowHeight: TABLE_DEFAULT_CONFIG.runs.rowHeight, + hideSystemMetrics: TABLE_DEFAULT_CONFIG.runs.hideSystemMetrics, + hiddenMetrics: TABLE_DEFAULT_CONFIG.runs.hiddenMetrics, + hiddenColumns: TABLE_DEFAULT_CONFIG.runs.hiddenColumns, + sortFields: [...TABLE_DEFAULT_CONFIG.runs.sortFields], + columnsWidths: { tags: 300 }, + columnsColorScales: {}, + columnsOrder: { + left: [...TABLE_DEFAULT_CONFIG.runs.columnsOrder.left], + middle: [...TABLE_DEFAULT_CONFIG.runs.columnsOrder.middle], + right: [...TABLE_DEFAULT_CONFIG.runs.columnsOrder.right], + }, + resizeMode: TABLE_DEFAULT_CONFIG.runs.resizeMode, + height: TABLE_DEFAULT_CONFIG.runs.height, + }; + if (appName === AppNameEnum.RUNS) { + config.pagination = { + limit: 45, + offset: null, + isLatest: false, + }; + } + } + if (components?.charts?.[0]) { + if (components.charts.indexOf(ChartTypeEnum.HighPlot) !== -1) { + config.chart = { + curveInterpolation: + CONTROLS_DEFAULT_CONFIG.params.curveInterpolation, + isVisibleColorIndicator: + CONTROLS_DEFAULT_CONFIG.params.isVisibleColorIndicator, + focusedState: { + key: null, + xValue: null, + yValue: null, + active: false, + chartIndex: null, + }, + tooltip: { + appearance: CONTROLS_DEFAULT_CONFIG.params.tooltip.appearance, + display: CONTROLS_DEFAULT_CONFIG.params.tooltip.display, + selectedFields: + CONTROLS_DEFAULT_CONFIG.params.tooltip.selectedFields, + }, + brushExtents: {}, + }; + } + if (components.charts.indexOf(ChartTypeEnum.ScatterPlot) !== -1) { + config.table = { + ...config?.table!, + resizeMode: TABLE_DEFAULT_CONFIG.scatters.resizeMode, + }; + config.chart = { + focusedState: { + key: null, + xValue: null, + yValue: null, + active: false, + chartIndex: null, + }, + tooltip: { + appearance: CONTROLS_DEFAULT_CONFIG.scatters.tooltip.appearance, + display: CONTROLS_DEFAULT_CONFIG.scatters.tooltip.display, + selectedFields: + CONTROLS_DEFAULT_CONFIG.scatters.tooltip.selectedFields, + }, + trendlineOptions: { + type: CONTROLS_DEFAULT_CONFIG.scatters.trendlineOptions.type, + bandwidth: + CONTROLS_DEFAULT_CONFIG.scatters.trendlineOptions.bandwidth, + isApplied: + CONTROLS_DEFAULT_CONFIG.scatters.trendlineOptions.isApplied, + }, + }; + } + } + if (selectForm) { + config.select = { + options: [], + query: '', + advancedMode: false, + advancedQuery: '', + }; + } + //TODO solve the problem with keeping table config after switching from Scatters explore to Params explore. But the solution is temporal + return _.cloneDeep(config); + } + default: + return {}; + } + } + + function setModelDefaultAppConfigData( + recoverTableState: boolean = true, + ): void { + setDefaultAppConfigData({ + config: getConfig(), + appInitialConfig: appConfig, + model, + recoverTableState, + }); + } + + function getModelAppConfigData(appId: string): IApiRequest { + return getAppConfigData({ appId, appRequest, config: getConfig(), model }); + } + + return { + model, + getConfig, + setModelDefaultAppConfigData, + getModelAppConfigData, + }; +} + +export type InitialAppModelType = { + model: IModel; + getConfig: () => IAppModelConfig; + setModelDefaultAppConfigData: (recoverTableState?: boolean) => void; + getModelAppConfigData: (appId: string) => IApiRequest; +}; + +export default initializeAppModel; diff --git a/src/src/services/models/explorer/createAppModel.ts b/src/src/services/models/explorer/createAppModel.ts new file mode 100644 index 00000000..ded2276d --- /dev/null +++ b/src/src/services/models/explorer/createAppModel.ts @@ -0,0 +1,54 @@ +/** + * function createAppModel has 2 major functionalities: + * 1. getConfig() function which depends on appInitialConfig returns corresponding config state + * 2. getAppModelMethods() function which depends on appInitialConfig returns corresponding methods + * @appConfig {IAppInitialConfig} - the config which describe app model + */ + +import { IAppInitialConfig } from 'types/services/models/explorer/createAppModel'; + +import initializeAppModel from './config'; +import getRunsModelMethods from './runsModelMethods'; +import getParamsModelMethods from './paramsModelMethods'; +import getScattersModelMethods from './scattersModelMethods'; +import getMetricsAppModelMethods from './metricsModelMethods'; + +import { AppDataTypeEnum, AppNameEnum } from './index'; + +function createAppModel(appConfig: IAppInitialConfig) { + const { appName, dataType } = appConfig; + + const initialApp = initializeAppModel(appConfig); + const { model } = initialApp; + + function getRunsAppModelMethods() { + switch (appName) { + case AppNameEnum.PARAMS: + return getParamsModelMethods(initialApp, appConfig); + case AppNameEnum.RUNS: + return getRunsModelMethods(initialApp, appConfig); + case AppNameEnum.SCATTERS: + return getScattersModelMethods(initialApp, appConfig); + default: + return {}; + } + } + + function getAppModelMethods() { + switch (dataType) { + case AppDataTypeEnum.METRICS: + return getMetricsAppModelMethods(initialApp, appConfig); + case AppDataTypeEnum.RUNS: + return getRunsAppModelMethods(); + default: + return {}; + } + } + + return { + ...model, + ...getAppModelMethods(), + }; +} + +export default createAppModel; diff --git a/src/src/services/models/explorer/index.ts b/src/src/services/models/explorer/index.ts new file mode 100644 index 00000000..00717ad6 --- /dev/null +++ b/src/src/services/models/explorer/index.ts @@ -0,0 +1,66 @@ +import { IAppInitialConfig } from 'types/services/models/explorer/createAppModel'; + +import { ChartTypeEnum } from 'utils/d3'; + +import createAppModel from './createAppModel'; + +/** + * Constants and enums we can create and export from this file + */ + +export enum AppDataTypeEnum { + RUNS = 'runs', + METRICS = 'metrics', + IMAGES = 'images', +} + +export enum AppNameEnum { + METRICS = 'metrics', + PARAMS = 'params', + RUNS = 'runs', + IMAGES = 'images', + SCATTERS = 'scatters', + FIGURES = 'figures', + AUDIOS = 'audios', + TEXT = 'text', +} + +/** + * appInitialConfig is config object which describes our app models + * @appInitialConfig { [key: string]: IAppInitialConfig } + */ + +const appInitialConfig: { + [key: string]: IAppInitialConfig; +} = { + METRICS: { + dataType: AppDataTypeEnum.METRICS, + selectForm: AppNameEnum.METRICS, + grouping: true, + appName: AppNameEnum.METRICS, + components: { table: true, charts: [ChartTypeEnum.LineChart] }, + }, + PARAMS: { + dataType: AppDataTypeEnum.RUNS, + selectForm: AppNameEnum.RUNS, + grouping: true, + appName: AppNameEnum.PARAMS, + components: { table: true, charts: [ChartTypeEnum.HighPlot] }, + }, + RUNS: { + dataType: AppDataTypeEnum.RUNS, + selectForm: AppNameEnum.RUNS, + grouping: false, + appName: AppNameEnum.RUNS, + components: { table: true }, + }, + SCATTERS: { + dataType: AppDataTypeEnum.RUNS, + selectForm: AppNameEnum.RUNS, + grouping: true, + appName: AppNameEnum.SCATTERS, + components: { table: true, charts: [ChartTypeEnum.ScatterPlot] }, + }, +}; + +export { createAppModel, appInitialConfig }; diff --git a/src/src/services/models/explorer/metricsModelMethods.ts b/src/src/services/models/explorer/metricsModelMethods.ts new file mode 100644 index 00000000..d2b8d5bd --- /dev/null +++ b/src/src/services/models/explorer/metricsModelMethods.ts @@ -0,0 +1,1798 @@ +import moment from 'moment'; +import { saveAs } from 'file-saver'; +import _ from 'lodash-es'; + +import { IAxesScaleRange } from 'components/AxesPropsPopover'; + +import COLORS from 'config/colors/colors'; +import DASH_ARRAYS from 'config/dash-arrays/dashArrays'; +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { DensityOptions } from 'config/enums/densityEnum'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_EXPORTING_FORMAT, TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { getSuggestionsByExplorer } from 'config/monacoConfig/monacoConfig'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + getMetricsTableColumns, + metricsTableRowRenderer, +} from 'pages/Metrics/components/MetricsTableGrid/MetricsTableGrid'; + +import * as analytics from 'services/analytics'; +import metricsService from 'services/api/metrics/metricsService'; +import runsService from 'services/api/runs/runsService'; +import createMetricModel from 'services/models/metrics/metricModel'; +import { createRunModel } from 'services/models/metrics/runModel'; +import LiveUpdateService from 'services/live-update/examples/LiveUpdateBridge.example'; +import projectsService from 'services/api/projects/projectsService'; + +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { ILine } from 'types/components/LineChart/LineChart'; +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { IMetric } from 'types/services/models/metrics/metricModel'; +import { + IAggregationConfig, + IChartZoom, + IGroupingSelectOption, + IMetricAppModelState, + IMetricsCollection, + IMetricTableRowData, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, + ISmoothing, + ITooltip, + LegendsConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { + IMetricTrace, + IRun, + ISequence, +} from 'types/services/models/metrics/runModel'; +import { IModel } from 'types/services/models/model'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { + IAppInitialConfig, + IAppModelConfig, + IAppModelState, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { IApiRequest } from 'types/services/services'; +import { ITagInfo, ITagProps } from 'types/pages/tags/Tags'; + +import { + aggregateGroupData, + AggregationAreaMethods, +} from 'utils/aggregateGroupData'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import getAggregatedData from 'utils/app/getAggregatedData'; +import getChartTitleData from 'utils/app/getChartTitleData'; +import { getFilteredGroupingOptions } from 'utils/app/getFilteredGroupingOptions'; +import getFilteredRow from 'utils/app/getFilteredRow'; +import { getGroupingPersistIndex } from 'utils/app/getGroupingPersistIndex'; +import getGroupingSelectOptions from 'utils/app/getGroupingSelectOptions'; +import getQueryStringFromSelect from 'utils/app/getQueryStringFromSelect'; +import getRunData from 'utils/app/getRunData'; +import onAggregationConfigChange from 'utils/app/onAggregationConfigChange'; +import onAlignmentMetricChange from 'utils/app/onAlignmentMetricChange'; +import onAlignmentTypeChange from 'utils/app/onAlignmentTypeChange'; +import onAxesScaleTypeChange from 'utils/app/onAxesScaleTypeChange'; +import onChangeTooltip from 'utils/app/onChangeTooltip'; +import onColumnsOrderChange from 'utils/app/onColumnsOrderChange'; +import onColumnsVisibilityChange from 'utils/app/onColumnsVisibilityChange'; +import onGroupingApplyChange from 'utils/app/onGroupingApplyChange'; +import onGroupingModeChange from 'utils/app/onGroupingModeChange'; +import onGroupingPaletteChange from 'utils/app/onGroupingPaletteChange'; +import onGroupingPersistenceChange from 'utils/app/onGroupingPersistenceChange'; +import onGroupingReset from 'utils/app/onGroupingReset'; +import onGroupingSelectChange from 'utils/app/onGroupingSelectChange'; +import onHighlightModeChange from 'utils/app/onHighlightModeChange'; +import onIgnoreOutliersChange from 'utils/app/onIgnoreOutliersChange'; +import onSelectOptionsChange from 'utils/app/onSelectOptionsChange'; +import onMetricVisibilityChange from 'utils/app/onMetricsVisibilityChange'; +import onRowHeightChange from 'utils/app/onRowHeightChange'; +import onRowVisibilityChange from 'utils/app/onRowVisibilityChange'; +import onSelectAdvancedQueryChange from 'utils/app/onSelectAdvancedQueryChange'; +import onSelectRunQueryChange from 'utils/app/onSelectRunQueryChange'; +import onSmoothingChange from 'utils/app/onSmoothingChange'; +import { onTableDiffShow } from 'utils/app/onTableDiffShow'; +import { onTableResizeEnd } from 'utils/app/onTableResizeEnd'; +import onTableResizeModeChange from 'utils/app/onTableResizeModeChange'; +import onTableRowClick from 'utils/app/onTableRowClick'; +import onTableRowHover from 'utils/app/onTableRowHover'; +import onTableSortChange from 'utils/app/onTableSortChange'; +import onZoomChange from 'utils/app/onZoomChange'; +import setAggregationEnabled from 'utils/app/setAggregationEnabled'; +import toggleSelectAdvancedMode from 'utils/app/toggleSelectAdvancedMode'; +import updateColumnsWidths from 'utils/app/updateColumnsWidths'; +import updateSortFields from 'utils/app/updateTableSortFields'; +import contextToString from 'utils/contextToString'; +import { AlignmentOptionsEnum, ChartTypeEnum, HighlightEnum } from 'utils/d3'; +import { filterMetricsData } from 'utils/app/filterMetricData'; +import { formatValue } from 'utils/formatValue'; +import getClosestValue from 'utils/getClosestValue'; +import getObjectPaths from 'utils/getObjectPaths'; +import getSmoothenedData from 'utils/getSmoothenedData'; +import JsonToCSV from 'utils/JsonToCSV'; +import { setItem } from 'utils/storage'; +import { encode } from 'utils/encoder/encoder'; +import onBookmarkCreate from 'utils/app/onBookmarkCreate'; +import onBookmarkUpdate from 'utils/app/onBookmarkUpdate'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import onResetConfigData from 'utils/app/onResetConfigData'; +import onShuffleChange from 'utils/app/onShuffleChange'; +import setComponentRefs from 'utils/app/setComponentRefs'; +import updateURL from 'utils/app/updateURL'; +import onDensityTypeChange from 'utils/app/onDensityTypeChange'; +import getValueByField from 'utils/getValueByField'; +import getTooltipContent from 'utils/getTooltipContent'; +import { getValue } from 'utils/helper'; +import onRowSelect from 'utils/app/onRowSelect'; +import { SortField } from 'utils/getSortedFields'; +import onRunsTagsChange from 'utils/app/onRunsTagsChange'; +import { + alignByAbsoluteTime, + alignByCustomMetric, + alignByEpoch, + alignByRelativeTime, + alignByStep, +} from 'utils/app/alignMetricData'; +import setRequestProgress from 'utils/app/setRequestProgress'; +import onAxesScaleRangeChange from 'utils/app/onAxesScaleRangeChange'; +import getAdvancedSuggestion from 'utils/getAdvancedSuggestions'; +import { processDurationTime } from 'utils/processDurationTime'; +import getSelectOptions from 'utils/app/getSelectOptions'; +import onRowsVisibilityChange from 'utils/app/onRowsVisibilityChange'; +import { onCopyToClipBoard } from 'utils/onCopyToClipBoard'; +import saveRecentSearches from 'utils/saveRecentSearches'; +import getLegendsData from 'utils/app/getLegendsData'; +import onLegendsChange from 'utils/app/onLegendsChange'; + +import { InitialAppModelType } from './config'; + +// ************ Metrics App Model Methods + +function getMetricsAppModelMethods( + initialApp: InitialAppModelType, + appConfig: IAppInitialConfig, +) { + const { appName, grouping, components, selectForm } = appConfig; + const { + model, + getModelAppConfigData, + setModelDefaultAppConfigData, + getConfig, + } = initialApp; + let metricsRequestRef: { + call: ( + exceptionHandler: (detail: any) => void, + ) => Promise[]>>; + abort: () => void; + }; + let runsArchiveRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let runsDeleteRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let liveUpdateInstance: LiveUpdateService | null; + + function initialize(appId: string): void { + model.init(); + + const state: Partial = {}; + if (grouping) { + state.groupingSelectOptions = []; + } + if (components?.table) { + state.refs = { + ...state.refs, + tableRef: { current: null }, + }; + } + if (components?.charts?.[0]) { + state.refs = { + ...state.refs, + chartPanelRef: { current: null }, + }; + } + model.setState({ ...state }); + if (!appId) { + setModelDefaultAppConfigData(); + } + + projectsService + .getProjectParams(['metric']) + .call() + .then((data) => { + const advancedSuggestions: Record = getAdvancedSuggestion( + data.metric, + ); + model.setState({ + selectFormData: { + options: getSelectOptions(data, true), + suggestions: getSuggestionsByExplorer(appName, data), + advancedSuggestions: { + ...getSuggestionsByExplorer(appName, data), + metric: { + name: '', + context: _.isEmpty(advancedSuggestions) + ? '' + : { ...advancedSuggestions }, + }, + }, + }, + }); + }); + const liveUpdateState = model.getState()?.config?.liveUpdate; + + if (liveUpdateState?.enabled) { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + liveUpdateState.delay, + ); + } + } + + function updateData(newData: ISequence[]): void { + const configData = model.getState()?.config; + if (configData) { + setModelData(newData, configData); + } + } + + function abortRequest(): void { + if (metricsRequestRef) { + metricsRequestRef.abort(); + } + setRequestProgress(model); + model.setState({ + requestStatus: RequestStatusEnum.Ok, + }); + onModelNotificationAdd({ + id: Date.now(), + severity: 'info', + messages: ['Request has been cancelled'], + }); + } + + function getMetricsData( + shouldUrlUpdate?: boolean, + shouldResetSelectedRows?: boolean, + queryString?: string, + ): IApiRequest { + if (metricsRequestRef) { + metricsRequestRef.abort(); + } + const configData = model.getState()?.config; + + const metric = configData?.chart?.alignmentConfig?.metric; + + if (queryString) { + if (configData.select.advancedMode) { + configData.select.advancedQuery = queryString; + } else { + configData.select.query = queryString; + } + } + let query = getQueryStringFromSelect(configData?.select); + metricsRequestRef = metricsService.getMetricsData({ + q: query, + p: configData?.chart?.densityType, + ...(metric ? { x_axis: metric } : {}), + }); + + setRequestProgress(model); + return { + call: async () => { + if (query === '()') { + resetModelState(configData, shouldResetSelectedRows!); + } else { + model.setState({ + requestStatus: RequestStatusEnum.Pending, + queryIsEmpty: false, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + }); + liveUpdateInstance?.stop().then(); + try { + const stream = await metricsRequestRef.call((detail) => { + exceptionHandler({ detail, model }); + resetModelState(configData, shouldResetSelectedRows!); + }); + const runData = await getRunData(stream, (progress) => + setRequestProgress(model, progress), + ); + if (shouldUrlUpdate) { + updateURL({ configData, appName }); + } + saveRecentSearches(appName, query); + updateData(runData); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + // Abort Error + } else { + // eslint-disable-next-line no-console + console.log('Unhandled error: ', ex); + } + } + + liveUpdateInstance?.start({ + q: query, + p: configData?.chart?.densityType, + ...(metric && { x_axis: metric }), + }); + } + }, + abort: metricsRequestRef.abort, + }; + } + + function resetModelState(configData: any, shouldResetSelectedRows: boolean) { + let state: Partial = {}; + if ( + Array.isArray(components?.charts) && + components?.charts?.indexOf(ChartTypeEnum.LineChart) !== -1 + ) { + state.lineChartData = []; + } + + if (components.table) { + state.tableData = []; + state.config = { + ...configData, + table: { + ...configData?.table, + resizeMode: ResizeModeEnum.Resizable, + }, + }; + } + model.setState({ + queryIsEmpty: true, + rawData: [], + tableColumns: [], + selectFormData: { + ...model.getState().selectFormData, + error: null, + advancedError: null, + }, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + ...state, + }); + } + + function getDataAsTableRows( + processedData: IMetricsCollection[], + xValue: number | string | null = null, + paramKeys: string[], + isRowData: boolean, + config: IAppModelConfig, + groupingSelectOptions: IGroupingSelectOption[], + dynamicUpdate?: boolean, + ): { + rows: IMetricTableRowData[] | any; + sameValueColumns: string[]; + } { + if (!processedData) { + return { + rows: [], + sameValueColumns: [], + }; + } + + const rows: IMetricTableRowData[] | any = + processedData[0]?.config !== null ? {} : []; + + let rowIndex = 0; + const sameValueColumns: string[] = []; + + const columnsFlattenValues: { [key: string]: Set } = {}; + processedData.forEach((metricsCollection: IMetricsCollection) => { + const groupKey = metricsCollection.key; + const columnsValues: { [key: string]: string[] } = {}; + + if (metricsCollection.config !== null) { + const groupConfigData: { [key: string]: unknown } = {}; + for (let key in metricsCollection.config) { + groupConfigData[getValueByField(groupingSelectOptions, key)] = + metricsCollection.config[key]; + } + const groupHeaderRow = { + meta: { + chartIndex: config?.grouping?.chart?.length + ? metricsCollection.chartIndex + 1 + : null, + //ToDo reverse mode + // config?.grouping?.reverseMode?.chart + // ? metricsCollection.chartIndex + 1 + // : null, + color: metricsCollection.color, + dasharray: metricsCollection.dasharray, + itemsCount: metricsCollection.data.length, + config: groupConfigData, + }, + key: groupKey!, + groupRowsKeys: metricsCollection.data.map((metric) => metric.key), + color: metricsCollection.color, + dasharray: metricsCollection.dasharray, + aggregation: { + area: { + min: '', + max: '', + }, + line: '', + }, + experiment: '', + description: '', + date: '', + run: '', + hash: '', + metric: '', + context: [], + value: '', + step: '', + epoch: '', + time: '', + children: [], + groups: groupConfigData, + }; + + rows[groupKey!] = { + data: groupHeaderRow, + items: [], + }; + } + + metricsCollection.data.forEach((metric: IMetric) => { + const closestIndex = + xValue === null + ? null + : getClosestValue(metric.data.xValues as number[], xValue as number) + .index; + const rowValues: IMetricTableRowData = { + rowMeta: { + color: metricsCollection.color ?? metric.color, + }, + key: metric.key, + selectKey: `${metric.run.hash}/${metric.key}`, + hash: metric.run.hash, + isHidden: metric.isHidden, + index: rowIndex, + color: metricsCollection.color ?? metric.color, + dasharray: metricsCollection.dasharray ?? metric.dasharray, + experiment: metric.run.props?.experiment?.name ?? 'default', + experimentId: metric.run.props?.experiment?.id ?? '', + experiment_description: + metric.run.props?.experiment?.description ?? '-', + run: metric.run.props?.name ?? '-', + description: metric.run.props?.description ?? '-', + date: moment(metric.run.props.creation_time * 1000).format( + TABLE_DATE_FORMAT, + ), + tags: metric.run.props.tags.map((tag: ITagProps) => ({ + archived: false, + color: tag.color, + id: tag.id, + comment: tag.description, + name: tag.name, + run_count: 0, + })), + duration: processDurationTime( + metric.run.props.creation_time * 1000, + metric.run.props.end_time + ? metric.run.props.end_time * 1000 + : Date.now(), + ), + active: metric.run.props.active, + metric: metric.name, + context: contextToString(metric.context)?.split(',') || [''], + value: + closestIndex === null + ? '-' + : formatValue(metric.data.values[closestIndex]), + step: + closestIndex === null + ? '-' + : formatValue(metric.data.steps[closestIndex]), + epoch: + closestIndex === null + ? '-' + : formatValue(metric.data.epochs[closestIndex]), + time: + closestIndex !== null ? metric.data.timestamps[closestIndex] : null, + parentId: groupKey, + }; + rowIndex++; + + if (metricsCollection.config !== null && closestIndex !== null) { + rows[groupKey!].data.aggregation = { + area: { + min: formatValue( + metricsCollection.aggregation!.area.min?.yValues[closestIndex], + ), + max: formatValue( + metricsCollection.aggregation!.area.max?.yValues[closestIndex], + ), + }, + line: formatValue( + metricsCollection.aggregation!.line?.yValues[closestIndex], + ), + }; + if ( + config.chart?.aggregationConfig?.methods.area === + AggregationAreaMethods.STD_DEV + ) { + rows[groupKey!].data.aggregation.area.stdDevValue = formatValue( + metricsCollection.aggregation!.area.stdDevValue?.yValues[ + closestIndex + ], + ); + } + if ( + config.chart?.aggregationConfig?.methods.area === + AggregationAreaMethods.STD_ERR + ) { + rows[groupKey!].data.aggregation.area.stdErrValue = formatValue( + metricsCollection.aggregation!.area.stdErrValue?.yValues[ + closestIndex + ], + ); + } + } + + [ + 'experiment', + 'description', + 'date', + 'duration', + 'run', + 'hash', + 'metric', + 'context', + 'step', + 'epoch', + 'time', + ].forEach((key) => { + if (columnsValues.hasOwnProperty(key)) { + if ( + _.findIndex(columnsValues[key], (value) => + _.isEqual(rowValues[key], value), + ) === -1 + ) { + columnsValues[key].push(rowValues[key]); + } + } else { + columnsValues[key] = [rowValues[key]]; + } + }); + + if (!dynamicUpdate) { + paramKeys.forEach((paramKey) => { + const value = getValue(metric.run.params, paramKey, '-'); + rowValues[paramKey] = formatValue(value); + if (columnsValues.hasOwnProperty(paramKey)) { + if ( + _.findIndex(columnsValues[paramKey], (paramValue) => + _.isEqual(value, paramValue), + ) === -1 + ) { + columnsValues[paramKey].push(value); + } + } else { + columnsValues[paramKey] = [value]; + } + }); + } + + if (metricsCollection.config !== null) { + rows[groupKey!].items.push( + isRowData + ? rowValues + : metricsTableRowRenderer(rowValues, onModelRunsTagsChange, { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange({ + metricKey: rowValues.key, + model, + appName, + updateModelData, + }); + }, + }), + ); + } else { + rows.push( + isRowData + ? rowValues + : metricsTableRowRenderer(rowValues, onModelRunsTagsChange, { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange({ + metricKey: rowValues.key, + model, + appName, + updateModelData, + }); + }, + }), + ); + } + }); + + for (let columnKey in columnsValues) { + columnsFlattenValues[columnKey] = new Set([ + ...(columnsFlattenValues[columnKey] || []), + ...(columnsValues[columnKey] || []), + ]); + + if (metricsCollection.config !== null) { + rows[groupKey!].data[columnKey] = + columnsValues[columnKey].length === 1 + ? paramKeys.includes(columnKey) + ? formatValue(columnsValues[columnKey][0]) + : columnsValues[columnKey][0] + : columnsValues[columnKey]; + } + } + if (metricsCollection.config !== null && !isRowData) { + rows[groupKey!].data = metricsTableRowRenderer( + rows[groupKey!].data, + onModelRunsTagsChange, + {}, + true, + ['value', 'groups'].concat(Object.keys(columnsValues)), + ); + } + }); + for (let columnKey in columnsFlattenValues) { + if (columnsFlattenValues[columnKey].size === 1) { + sameValueColumns.push(columnKey); + } + } + return { rows, sameValueColumns }; + } + + function processData(data: ISequence[]): { + data: IMetricsCollection[]; + params: string[]; + runProps: string[]; + highLevelParams: string[]; + contexts: string[]; + selectedRows: any; + } { + const configData = model.getState()?.config; + let selectedRows = model.getState()?.selectedRows; + let metrics: IMetric[] = []; + let runParams: string[] = []; + let runProps: string[] = []; + let highLevelParams: string[] = []; + let contexts: string[] = []; + const paletteIndex: number = configData?.grouping?.paletteIndex || 0; + + data?.forEach((run: ISequence, index) => { + runParams = runParams.concat(getObjectPaths(run.params, run.params)); + runProps = runProps.concat(getObjectPaths(run.props, run.props)); + highLevelParams = highLevelParams.concat( + getObjectPaths(run.params, run.params, '', false, true), + ); + metrics = metrics.concat( + run.traces.map((trace: IMetricTrace) => { + contexts = contexts.concat( + getObjectPaths(trace.context, trace.context), + ); + const { + values, + steps, + epochs, + timestamps, + x_axis_values, + x_axis_iters, + } = filterMetricsData( + trace, + configData?.chart?.alignmentConfig.type, + configData?.chart?.axesScaleType, + ); + + let processedValues = [...values]; + if (configData?.chart?.smoothing.isApplied) { + processedValues = getSmoothenedData({ + smoothingAlgorithm: configData?.chart.smoothing.algorithm, + smoothingFactor: configData.chart.smoothing.factor, + data: processedValues, + }); + } + const metricKey = encode({ + runHash: run.hash, + metricName: trace.name, + traceContext: trace.context, + }); + const metricValues = new Float64Array(processedValues); + return createMetricModel({ + ...trace, + run: createRunModel(_.omit(run, 'traces') as IRun), + key: metricKey, + dasharray: 'none', + color: COLORS[paletteIndex][index % COLORS[paletteIndex].length], + isHidden: configData?.table?.hiddenMetrics!.includes(metricKey), + x_axis_values, + x_axis_iters, + lastValue: metricValues[metricValues.length - 1], + data: { + values: metricValues, + steps, + epochs, + timestamps, + xValues: [...steps], + yValues: processedValues, + }, + } as IMetric); + }), + ); + }); + + let sortFields = configData?.table?.sortFields ?? []; + + if (sortFields?.length === 0) { + sortFields = [ + { + value: 'run.props.creation_time', + order: 'desc', + label: '', + group: '', + }, + ]; + } + + const processedData = groupData( + _.orderBy( + metrics, + sortFields?.map( + (f: SortField) => (metric: IMetric) => getValue(metric, f.value, ''), + ), + sortFields?.map((f: SortField) => f.order), + ), + ); + const uniqParams = _.uniq(runParams).sort(); + const uniqHighLevelParams = _.uniq(highLevelParams).sort(); + const uniqContexts = _.uniq(contexts).sort(); + const uniqProps = _.uniq(runProps).sort(); + + const mappedData: Record = {}; + + for (let metric of metrics) { + mappedData[metric.run.hash] = { + runHash: metric.run.hash, + ...metric.run.props, + ...metric, + }; + } + + let selected: Record = {}; + + if (selectedRows && !_.isEmpty(selectedRows)) { + for (let rowKey in selectedRows) { + const slicedKey = rowKey.slice(0, rowKey.indexOf('/')); + if (mappedData[slicedKey]) + selected[rowKey] = { + selectKey: rowKey, + ...mappedData[slicedKey], + }; + } + } + + selectedRows = selected; + + return { + data: processedData, + params: uniqParams, + highLevelParams: uniqHighLevelParams, + contexts: uniqContexts, + runProps: uniqProps, + selectedRows, + }; + } + + function updateModelData( + configData = model.getState()!.config!, + shouldURLUpdate?: boolean, + ): void { + const { data, params, runProps, highLevelParams, contexts, selectedRows } = + processData(model.getState()?.rawData as ISequence[]); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + runProps, + contexts, + sequenceName: 'metric', + }), + ]; + const sortOptions = [ + ...groupingSelectOptions, + { + group: 'metric', + label: 'metric.values.last', + value: 'lastValue', + }, + ]; + + const legendsData = getLegendsData( + data, + groupingSelectOptions, + configData?.grouping, + [GroupNameEnum.COLOR, GroupNameEnum.STROKE, GroupNameEnum.CHART], + ); + + const tableData = getDataAsTableRows( + data, + configData?.chart?.focusedState.xValue ?? null, + params, + false, + configData, + groupingSelectOptions, + ); + + const tableColumns = getMetricsTableColumns( + params, + groupingSelectOptions, + data[0]?.config, + configData.table?.columnsOrder!, + configData.table?.hiddenColumns!, + configData.chart?.aggregationConfig.methods, + configData.table?.sortFields, + onSortChange, + configData.grouping as any, + onModelGroupingSelectChange, + ); + + model.getState()?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + hiddenColumns: configData.table?.hiddenColumns!, + }); + + if (shouldURLUpdate) { + updateURL({ configData, appName }); + } + + model.setState({ + config: configData, + data, + lineChartData: getDataAsLines(data), + chartTitleData: getChartTitleData({ + processedData: data, + groupingSelectOptions, + model: model as IModel, + }), + aggregatedData: getAggregatedData>({ + processedData: data, + model: model as IModel, + }), + legendsData, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + groupingSelectOptions, + sortOptions, + selectedRows, + }); + } + + function setModelData( + rawData: ISequence[], + configData: IAppModelConfig, + ): void { + const modelState: IAppModelState = model.getState(); + const sortFields = modelState?.config?.table?.sortFields; + const { data, runProps, params, highLevelParams, contexts, selectedRows } = + processData(rawData); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + + if (configData) { + setAggregationEnabled({ model, appName }); + } + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + runProps, + params: sortedParams, + contexts, + sequenceName: 'metric', + }), + ]; + const sortOptions = [ + ...groupingSelectOptions, + { + group: 'metric', + label: 'metric.values.last', + value: 'lastValue', + }, + ]; + + const legendsData = getLegendsData( + data, + groupingSelectOptions, + configData?.grouping, + [GroupNameEnum.COLOR, GroupNameEnum.STROKE, GroupNameEnum.CHART], + ); + + const tableData = getDataAsTableRows( + data, + configData?.chart?.focusedState?.xValue ?? null, + params, + false, + configData, + groupingSelectOptions, + ); + + const tableColumns = getMetricsTableColumns( + params, + groupingSelectOptions, + data[0]?.config, + configData.table?.columnsOrder!, + configData.table?.hiddenColumns!, + configData?.chart?.aggregationConfig?.methods, + sortFields, + onSortChange, + configData.grouping as any, + onModelGroupingSelectChange, + ); + + modelState?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + }); + + model.setState({ + requestStatus: RequestStatusEnum.Ok, + rawData, + config: configData, + params, + data, + selectFormData: { + ...modelState?.selectFormData, + [configData.select?.advancedMode ? 'advancedError' : 'error']: null, + }, + lineChartData: getDataAsLines(data), + chartTitleData: getChartTitleData>( + { + processedData: data, + groupingSelectOptions, + model: model as IModel, + }, + ), + aggregatedData: getAggregatedData>({ + processedData: data, + model: model as IModel, + }), + legendsData, + tableData: tableData.rows, + tableColumns: tableColumns, + sameValueColumns: tableData.sameValueColumns, + groupingSelectOptions, + sortOptions, + selectedRows, + }); + } + + function alignData( + data: IMetricsCollection[], + type: AlignmentOptionsEnum = model.getState()!.config!.chart + ?.alignmentConfig.type, + ): IMetricsCollection[] { + const alignmentObj: { [key: string]: Function } = { + [AlignmentOptionsEnum.STEP]: alignByStep, + [AlignmentOptionsEnum.EPOCH]: alignByEpoch, + [AlignmentOptionsEnum.RELATIVE_TIME]: alignByRelativeTime, + [AlignmentOptionsEnum.ABSOLUTE_TIME]: alignByAbsoluteTime, + [AlignmentOptionsEnum.CUSTOM_METRIC]: alignByCustomMetric, + default: () => { + throw new Error('Unknown value for X axis alignment'); + }, + }; + const alignment = alignmentObj[type] || alignmentObj.default; + return alignment(data, model); + } + + function groupData(data: IMetric[]): IMetricsCollection[] { + const configData = model.getState()!.config; + const grouping = configData!.grouping; + const { paletteIndex = 0 } = grouping || {}; + const groupByColor = getFilteredGroupingOptions({ + groupName: GroupNameEnum.COLOR, + model, + }); + const groupByStroke = getFilteredGroupingOptions({ + groupName: GroupNameEnum.STROKE, + model, + }); + const groupByChart = getFilteredGroupingOptions({ + groupName: GroupNameEnum.CHART, + model, + }); + if ( + groupByColor.length === 0 && + groupByStroke.length === 0 && + groupByChart.length === 0 + ) { + return alignData([ + { + config: null, + color: null, + dasharray: null, + chartIndex: 0, + data: data, + }, + ]); + } + + const groupValues: { + [key: string]: IMetricsCollection; + } = {}; + + const groupingFields = _.uniq( + groupByColor.concat(groupByStroke).concat(groupByChart), + ); + + for (let i = 0; i < data.length; i++) { + const groupValue: { [key: string]: string } = {}; + groupingFields.forEach((field) => { + groupValue[field] = getValue(data[i], field); + }); + const groupKey = encode(groupValue); + if (groupValues.hasOwnProperty(groupKey)) { + groupValues[groupKey].data.push(data[i]); + } else { + groupValues[groupKey] = { + key: groupKey, + config: groupValue, + color: null, + dasharray: null, + chartIndex: 0, + data: [data[i]], + }; + } + } + + let colorIndex = 0; + let dasharrayIndex = 0; + let chartIndex = 0; + + const colorConfigsMap: { [key: string]: number } = {}; + const dasharrayConfigsMap: { [key: string]: number } = {}; + const chartIndexConfigsMap: { [key: string]: number } = {}; + + for (let groupKey in groupValues) { + const groupValue = groupValues[groupKey]; + + if (groupByColor.length > 0) { + const colorConfig = _.pick(groupValue.config, groupByColor); + const colorKey = encode(colorConfig); + + if (grouping?.persistence.color && grouping.isApplied.color) { + let index = getGroupingPersistIndex({ + groupConfig: colorConfig, + grouping, + groupName: 'color', + }); + groupValue.color = + COLORS[paletteIndex][ + Number(index % BigInt(COLORS[paletteIndex].length)) + ]; + } else if (colorConfigsMap.hasOwnProperty(colorKey)) { + groupValue.color = + COLORS[paletteIndex][ + colorConfigsMap[colorKey] % COLORS[paletteIndex].length + ]; + } else { + colorConfigsMap[colorKey] = colorIndex; + groupValue.color = + COLORS[paletteIndex][colorIndex % COLORS[paletteIndex].length]; + colorIndex++; + } + } + + if (groupByStroke.length > 0) { + const dasharrayConfig = _.pick(groupValue.config, groupByStroke); + const dasharrayKey = encode(dasharrayConfig); + if (grouping?.persistence.stroke && grouping.isApplied.stroke) { + let index = getGroupingPersistIndex({ + groupConfig: dasharrayConfig, + grouping, + groupName: 'stroke', + }); + groupValue.dasharray = + DASH_ARRAYS[Number(index % BigInt(DASH_ARRAYS.length))]; + } else if (dasharrayConfigsMap.hasOwnProperty(dasharrayKey)) { + groupValue.dasharray = + DASH_ARRAYS[dasharrayConfigsMap[dasharrayKey] % DASH_ARRAYS.length]; + } else { + dasharrayConfigsMap[dasharrayKey] = dasharrayIndex; + groupValue.dasharray = + DASH_ARRAYS[dasharrayIndex % DASH_ARRAYS.length]; + dasharrayIndex++; + } + } + + if (groupByChart.length > 0) { + const chartIndexConfig = _.pick(groupValue.config, groupByChart); + const chartIndexKey = encode(chartIndexConfig); + if (chartIndexConfigsMap.hasOwnProperty(chartIndexKey)) { + groupValue.chartIndex = chartIndexConfigsMap[chartIndexKey]; + } else { + chartIndexConfigsMap[chartIndexKey] = chartIndex; + groupValue.chartIndex = chartIndex; + chartIndex++; + } + } + } + + const groups = alignData(Object.values(groupValues)); + const chartConfig = configData!.chart; + + return aggregateGroupData({ + groupData: groups, + methods: { + area: chartConfig!.aggregationConfig.methods.area, + line: chartConfig!.aggregationConfig.methods.line, + }, + scale: chartConfig!.axesScaleType, + }); + } + + function onSearchQueryCopy(): void { + const selectedMetricsData = model.getState()?.config?.select; + let query = getQueryStringFromSelect(selectedMetricsData); + onCopyToClipBoard(query, false, () => onNotificationAdd, { + notification: { + id: Date.now(), + severity: 'success', + messages: ['Run Expression Copied'], + }, + model, + }); + } + + function getDataAsLines( + processedData: IMetricsCollection[], + ): ILine[][] { + if (!processedData) { + return []; + } + const lines = processedData + .map((metricsCollection: IMetricsCollection) => + metricsCollection.data + .filter((metric) => !metric.isHidden) + .map((metric: IMetric) => { + return { + ...metric, + groupKey: metricsCollection.key, + color: metricsCollection.color ?? metric.color, + dasharray: metricsCollection.dasharray ?? metric.dasharray, + chartIndex: metricsCollection.chartIndex, + selectors: [ + metric.key, + metric.key, + encode({ runHash: metric.run.hash }), + ], + data: { + xValues: metric.data.xValues, + yValues: metric.data.yValues, + }, + }; + }), + ) + .flat(); + + return Object.values(_.groupBy(lines, 'chartIndex')); + } + + function onExportTableData(): void { + const { data, params, config, groupingSelectOptions } = model.getState(); + + const tableData = getDataAsTableRows( + data, + config?.chart?.focusedState.xValue ?? null, + params, + true, + config, + groupingSelectOptions, + ); + const tableColumns: ITableColumn[] = getMetricsTableColumns( + params, + groupingSelectOptions, + data[0]?.config, + config?.table?.columnsOrder!, + config?.table?.hiddenColumns!, + config?.chart?.aggregationConfig.methods, + ); + + const excludedFields: string[] = ['#', 'actions']; + const filteredHeader: string[] = tableColumns.reduce( + (acc: string[], column: ITableColumn) => + acc.concat( + excludedFields.indexOf(column.key) === -1 && !column.isHidden + ? column.key + : [], + ), + [], + ); + + let emptyRow: { [key: string]: string } = {}; + filteredHeader.forEach((column: string) => { + emptyRow[column] = '--'; + }); + + const groupedRows: IMetricTableRowData[][] = + data.length > 1 + ? Object.keys(tableData.rows).map( + (groupedRowKey: string) => tableData.rows[groupedRowKey].items, + ) + : [ + Array.isArray(tableData.rows) + ? tableData.rows + : tableData.rows[Object.keys(tableData.rows)[0]].items, + ]; + + const dataToExport: { [key: string]: string }[] = []; + + groupedRows?.forEach( + (groupedRow: IMetricTableRowData[], groupedRowIndex: number) => { + groupedRow?.forEach((row: IMetricTableRowData) => { + const filteredRow = getFilteredRow({ + columnKeys: filteredHeader, + row, + }); + dataToExport.push(filteredRow); + }); + if (groupedRows?.length - 1 !== groupedRowIndex) { + dataToExport.push(emptyRow); + } + }, + ); + + const blob = new Blob([JsonToCSV(dataToExport)], { + type: 'text/csv;charset=utf-8;', + }); + saveAs(blob, `${appName}-${moment().format(DATE_EXPORTING_FORMAT)}.csv`); + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.exports.csv); + } + + const onActivePointChange = _.debounce( + (activePoint: IActivePoint, focusedStateActive: boolean = false): void => { + const { data, params, refs, config, groupingSelectOptions } = + model.getState(); + if (!!config) { + const tableRef: any = refs?.tableRef; + let tableData = null; + if (config.table?.resizeMode !== ResizeModeEnum.Hide) { + tableData = getDataAsTableRows( + data, + activePoint.xValue, + params, + false, + config, + groupingSelectOptions, + true, + ); + if (tableRef) { + tableRef.current?.updateData({ + newData: tableData.rows, + dynamicData: true, + }); + + if (focusedStateActive) { + tableRef.current?.scrollToRow?.(activePoint.key); + tableRef.current?.setActiveRow?.( + focusedStateActive ? activePoint.key : null, + ); + } else { + tableRef.current?.setHoveredRow?.(activePoint.key); + } + } + } + let configData = config; + if (configData?.chart) { + // TODO remove this later + // remove unnecessary content prop from tooltip config + if (configData.chart.tooltip?.hasOwnProperty('content')) { + delete configData.chart.tooltip.content; + } + + configData = { + ...configData, + chart: { + ...configData.chart, + focusedState: { + active: focusedStateActive, + key: activePoint.key, + xValue: activePoint.xValue, + yValue: activePoint.yValue, + chartIndex: activePoint.chartIndex, + visId: activePoint.visId || `${activePoint.chartIndex}`, + }, + }, + }; + + if ( + config.chart?.focusedState.active !== focusedStateActive || + (config.chart.focusedState.active && + activePoint.key !== config.chart.focusedState.key) + ) { + updateURL({ configData, appName }); + } + } + + const tooltipData = { + ...configData?.chart?.tooltip, + content: getTooltipContent({ + groupingNames: [ + GroupNameEnum.COLOR, + GroupNameEnum.STROKE, + GroupNameEnum.CHART, + ], + groupingSelectOptions, + data, + configData, + activePointKey: configData.chart?.focusedState?.key, + selectedFields: configData.chart?.tooltip?.selectedFields, + }), + }; + model.setState({ config: configData, tooltip: tooltipData }); + } + }, + 50, + ); + + function onModelRunsTagsChange(runHash: string, tags: ITagInfo[]): void { + onRunsTagsChange({ runHash, tags, model, updateModelData }); + } + + function onModelGroupingSelectChange({ + groupName, + list, + }: IOnGroupingSelectChangeParams): void { + onGroupingSelectChange({ + groupName, + list, + model, + appName, + updateModelData, + setAggregationEnabled, + }); + } + + function onModelBookmarkCreate({ + name, + description, + }: { + name: string; + description: string; + }): Promise { + return onBookmarkCreate({ name, description, model, appName }); + } + + function onModelBookmarkUpdate(id: string): void { + onBookmarkUpdate({ id, model, appName }); + } + + function onModelNotificationDelete(id: number): void { + onNotificationDelete({ id, model }); + } + + function onModelNotificationAdd(notification: N & INotification): void { + onNotificationAdd({ notification, model }); + } + + function onModelResetConfigData(): void { + onResetConfigData({ model, getConfig, updateModelData }); + } + + function onSortChange({ + sortFields, + order, + index, + actionType, + field, + }: any): void { + onTableSortChange({ + field, + sortFields, + order, + index, + actionType, + model, + appName, + updateModelData, + }); + } + + function setModelComponentRefs(refElement: object): void { + setComponentRefs({ refElement, model }); + } + + function changeLiveUpdateConfig(config: { + enabled?: boolean; + delay?: number; + }): void { + const state = model.getState(); + const configData = state?.config; + const liveUpdateConfig = configData?.liveUpdate; + const metric = configData?.chart?.alignmentConfig?.metric; + let query = getQueryStringFromSelect(configData?.select); + + if (!liveUpdateConfig?.enabled && config.enabled && query !== '()') { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + config.delay || liveUpdateConfig?.delay, + ); + liveUpdateInstance?.start({ + p: configData?.chart?.densityType, + q: query, + ...(metric && { x_axis: metric }), + }); + } else { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; + } + + const newLiveUpdateConfig = { + ...liveUpdateConfig, + ...config, + }; + model.setState({ + config: { + ...configData, + liveUpdate: newLiveUpdateConfig, + }, + }); + setItem('metricsLUConfig', encode(newLiveUpdateConfig)); + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].liveUpdate} ${ + config.enabled ? 'on' : 'off' + }`, + ); + } + + function destroy(): void { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; //@TODO check is this need or not + } + + function archiveRuns(ids: string[], archived: boolean): IApiRequest { + runsArchiveRef = runsService.archiveRuns(ids, archived); + return { + call: async () => { + try { + await runsArchiveRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getMetricsData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [ + `Runs are successfully ${ + archived ? 'archived' : 'unarchived' + } `, + ], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.archiveRunsBatch, + ); + } + }, + abort: runsArchiveRef.abort, + }; + } + + function deleteRuns(ids: string[]): IApiRequest { + runsDeleteRef = runsService.deleteRuns(ids); + return { + call: async () => { + try { + await runsDeleteRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getMetricsData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: ['Runs are successfully deleted'], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.deleteRunsBatch, + ); + } + }, + abort: runsDeleteRef.abort, + }; + } + + const methods = { + initialize, + getAppConfigData: getModelAppConfigData, + getMetricsData, + abortRequest, + getDataAsTableRows, + setDefaultAppConfigData: setModelDefaultAppConfigData, + setComponentRefs: setModelComponentRefs, + updateModelData, + onActivePointChange, + onExportTableData, + onBookmarkCreate: onModelBookmarkCreate, + onBookmarkUpdate: onModelBookmarkUpdate, + onNotificationAdd: onModelNotificationAdd, + onNotificationDelete: onModelNotificationDelete, + onResetConfigData: onModelResetConfigData, + onRunsTagsChange: onModelRunsTagsChange, + onSortChange, + onSearchQueryCopy, + changeLiveUpdateConfig, + destroy, + deleteRuns, + archiveRuns, + }; + + if (grouping) { + Object.assign(methods, { + onGroupingSelectChange: onModelGroupingSelectChange, + onGroupingModeChange({ + groupName, + value, + }: IOnGroupingModeChangeParams): void { + onGroupingModeChange({ + groupName, + value, + model, + appName, + updateModelData, + setAggregationEnabled, + }); + }, + onGroupingPaletteChange(index: number): void { + onGroupingPaletteChange({ + index, + model, + appName, + updateModelData, + setAggregationEnabled, + }); + }, + onGroupingReset(groupName: GroupNameEnum): void { + onGroupingReset({ + groupName, + model, + appName, + updateModelData, + setAggregationEnabled, + }); + }, + onGroupingApplyChange(groupName: GroupNameEnum): void { + onGroupingApplyChange({ + groupName, + model, + appName, + updateModelData, + setAggregationEnabled, + }); + }, + onGroupingPersistenceChange(groupName: GroupNameEnum): void { + onGroupingPersistenceChange({ + groupName, + model, + appName, + updateModelData, + setAggregationEnabled, + }); + }, + onShuffleChange(name: 'color' | 'stroke'): void { + onShuffleChange({ name, model, updateModelData }); + }, + }); + } + if (selectForm) { + Object.assign(methods, { + onMetricsSelectChange(data: D & Partial): void { + onSelectOptionsChange({ data, model }); + }, + onSelectRunQueryChange(query: string): void { + onSelectRunQueryChange({ query, model }); + }, + onSelectAdvancedQueryChange(query: string): void { + onSelectAdvancedQueryChange({ query, model }); + }, + toggleSelectAdvancedMode(): void { + toggleSelectAdvancedMode({ model, appName }); + }, + }); + } + if (components?.charts?.[0]) { + Object.assign(methods, { + onHighlightModeChange(mode: HighlightEnum): void { + onHighlightModeChange({ mode, model, appName }); + }, + onZoomChange(zoom: Partial): void { + onZoomChange({ + zoom, + model, + appName, + }); + }, + onSmoothingChange(args: Partial): void { + onSmoothingChange({ args, model, appName, updateModelData }); + }, + onIgnoreOutliersChange(): void { + onIgnoreOutliersChange({ model, updateModelData, appName }); + }, + onAxesScaleTypeChange(args: IAxesScaleState): void { + onAxesScaleTypeChange({ args, model, appName, updateModelData }); + }, + onAggregationConfigChange( + aggregationConfig: Partial, + ): void { + onAggregationConfigChange({ + aggregationConfig, + model, + appName, + updateModelData, + }); + }, + onAlignmentMetricChange(metric: string): Promise { + return onAlignmentMetricChange({ + metric, + model, + appName, + updateModelData, + setModelData, + }); + }, + onAlignmentTypeChange(type: AlignmentOptionsEnum): void { + onAlignmentTypeChange({ type, model, appName, updateModelData }); + }, + onChangeTooltip(tooltip: Partial): void { + onChangeTooltip({ + tooltip, + groupingNames: [ + GroupNameEnum.COLOR, + GroupNameEnum.STROKE, + GroupNameEnum.CHART, + ], + model, + appName, + }); + }, + onAxesScaleRangeChange(range: Partial): void { + onAxesScaleRangeChange({ range, model, appName }); + }, + onDensityTypeChange(type: DensityOptions): Promise { + return onDensityTypeChange({ type, model, appName, getMetricsData }); + }, + onLegendsChange(legends: Partial): void { + onLegendsChange({ legends, model, appName, updateModelData }); + }, + }); + } + if (components?.table) { + Object.assign(methods, { + onRowHeightChange(height: RowHeightSize): void { + onRowHeightChange({ height, model, appName }); + }, + onTableRowHover(rowKey?: string): void { + onTableRowHover({ rowKey, model }); + }, + onTableRowClick(rowKey?: string): void { + onTableRowClick({ rowKey, model }); + }, + onMetricVisibilityChange(metricsKeys: string[]): void { + onMetricVisibilityChange({ + metricsKeys, + model, + appName, + updateModelData, + }); + }, + onColumnsVisibilityChange(hiddenColumns: string[]): void { + onColumnsVisibilityChange({ + hiddenColumns, + model, + appName, + updateModelData, + }); + }, + onTableDiffShow(): void { + onTableDiffShow({ model, appName, updateModelData }); + }, + onColumnsOrderChange(columnsOrder: any): void { + onColumnsOrderChange({ + columnsOrder, + model, + appName, + updateModelData, + }); + }, + onTableResizeModeChange(mode: ResizeModeEnum): void { + onTableResizeModeChange({ mode, model, appName }); + }, + onTableResizeEnd(tableHeight: string): void { + onTableResizeEnd({ tableHeight, model, appName }); + }, + onSortReset(): void { + updateSortFields({ sortFields: [], model, appName, updateModelData }); + }, + updateColumnsWidths(key: string, width: number, isReset: boolean): void { + updateColumnsWidths({ + key, + width, + isReset, + model, + appName, + updateModelData, + }); + }, + onRowSelect({ + actionType, + data, + }: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + }): void { + return onRowSelect({ actionType, data, model }); + }, + onRowsVisibilityChange(metricKeys: string[]): void { + return onRowsVisibilityChange({ + metricKeys, + model, + appName, + updateModelData, + }); + }, + }); + } + + return methods; +} + +export default getMetricsAppModelMethods; diff --git a/src/src/services/models/explorer/paramsModelMethods.ts b/src/src/services/models/explorer/paramsModelMethods.ts new file mode 100644 index 00000000..b9eb97b2 --- /dev/null +++ b/src/src/services/models/explorer/paramsModelMethods.ts @@ -0,0 +1,1690 @@ +import moment from 'moment'; +import { saveAs } from 'file-saver'; +import _ from 'lodash-es'; + +import COLORS from 'config/colors/colors'; +import DASH_ARRAYS from 'config/dash-arrays/dashArrays'; +import { MetricsValueKeyEnum, ResizeModeEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_EXPORTING_FORMAT, TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { getSuggestionsByExplorer } from 'config/monacoConfig/monacoConfig'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + getParamsTableColumns, + paramsTableRowRenderer, +} from 'pages/Params/components/ParamsTableGrid/ParamsTableGrid'; + +import * as analytics from 'services/analytics'; +import runsService from 'services/api/runs/runsService'; +import LiveUpdateService from 'services/live-update/examples/LiveUpdateBridge.example'; +import projectsService from 'services/api/projects/projectsService'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { + IGroupingSelectOption, + IMetricsCollection, + IMetricTableRowData, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; +import { IParamTrace, IRun } from 'types/services/models/metrics/runModel'; +import { IModel } from 'types/services/models/model'; +import { + IParam, + IParamsAppModelState, +} from 'types/services/models/params/paramsAppModel'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { IDimensionsType } from 'types/utils/d3/drawParallelAxes'; +import { + IAppInitialConfig, + IAppModelConfig, + IAppModelState, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { ITagInfo, ITagProps } from 'types/pages/tags/Tags'; + +import exceptionHandler from 'utils/app/exceptionHandler'; +import getChartTitleData from 'utils/app/getChartTitleData'; +import { getFilteredGroupingOptions } from 'utils/app/getFilteredGroupingOptions'; +import getFilteredRow from 'utils/app/getFilteredRow'; +import { getGroupingPersistIndex } from 'utils/app/getGroupingPersistIndex'; +import getGroupingSelectOptions from 'utils/app/getGroupingSelectOptions'; +import getRunData from 'utils/app/getRunData'; +import onChangeTooltip from 'utils/app/onChangeTooltip'; +import onColorIndicatorChange from 'utils/app/onColorIndicatorChange'; +import onColumnsOrderChange from 'utils/app/onColumnsOrderChange'; +import onColumnsVisibilityChange from 'utils/app/onColumnsVisibilityChange'; +import onCurveInterpolationChange from 'utils/app/onCurveInterpolationChange'; +import onGroupingApplyChange from 'utils/app/onGroupingApplyChange'; +import onGroupingModeChange from 'utils/app/onGroupingModeChange'; +import onGroupingPaletteChange from 'utils/app/onGroupingPaletteChange'; +import onGroupingPersistenceChange from 'utils/app/onGroupingPersistenceChange'; +import onGroupingReset from 'utils/app/onGroupingReset'; +import onGroupingSelectChange from 'utils/app/onGroupingSelectChange'; +import onSelectOptionsChange from 'utils/app/onSelectOptionsChange'; +import onParamVisibilityChange from 'utils/app/onParamsVisibilityChange'; +import onRowHeightChange from 'utils/app/onRowHeightChange'; +import onRowVisibilityChange from 'utils/app/onRowVisibilityChange'; +import onSelectRunQueryChange from 'utils/app/onSelectRunQueryChange'; +import onSortFieldsChange from 'utils/app/onSortFieldsChange'; +import { onTableDiffShow } from 'utils/app/onTableDiffShow'; +import { onTableResizeEnd } from 'utils/app/onTableResizeEnd'; +import onTableResizeModeChange from 'utils/app/onTableResizeModeChange'; +import onTableRowClick from 'utils/app/onTableRowClick'; +import onTableRowHover from 'utils/app/onTableRowHover'; +import onTableSortChange from 'utils/app/onTableSortChange'; +import updateColumnsWidths from 'utils/app/updateColumnsWidths'; +import updateSortFields from 'utils/app/updateTableSortFields'; +import contextToString from 'utils/contextToString'; +import { ChartTypeEnum, ScaleEnum } from 'utils/d3'; +import { formatValue } from 'utils/formatValue'; +import getObjectPaths from 'utils/getObjectPaths'; +import JsonToCSV from 'utils/JsonToCSV'; +import { setItem } from 'utils/storage'; +import { encode } from 'utils/encoder/encoder'; +import onBookmarkCreate from 'utils/app/onBookmarkCreate'; +import onBookmarkUpdate from 'utils/app/onBookmarkUpdate'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import onResetConfigData from 'utils/app/onResetConfigData'; +import onShuffleChange from 'utils/app/onShuffleChange'; +import updateURL from 'utils/app/updateURL'; +import getValueByField from 'utils/getValueByField'; +import getTooltipContent from 'utils/getTooltipContent'; +import { getValue } from 'utils/helper'; +import onRowSelect from 'utils/app/onRowSelect'; +import { SortField } from 'utils/getSortedFields'; +import onAxisBrushExtentChange from 'utils/app/onAxisBrushExtentChange'; +import onRunsTagsChange from 'utils/app/onRunsTagsChange'; +import setRequestProgress from 'utils/app/setRequestProgress'; +import { minMaxOfArray } from 'utils/minMaxOfArray'; +import { processDurationTime } from 'utils/processDurationTime'; +import getSelectOptions from 'utils/app/getSelectOptions'; +import { getMetricsSelectOptions } from 'utils/app/getMetricsSelectOptions'; +import onRowsVisibilityChange from 'utils/app/onRowsVisibilityChange'; +import { getMetricsInitialRowData } from 'utils/app/getMetricsInitialRowData'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import { getMetricLabel } from 'utils/app/getMetricLabel'; + +import { InitialAppModelType } from './config'; + +import { AppNameEnum } from './index'; + +// ************ Params App Model Methods + +function getParamsModelMethods( + initialApp: InitialAppModelType, + appConfig: IAppInitialConfig, +) { + const { appName, grouping, components, selectForm } = appConfig; + const { + model, + getModelAppConfigData, + setModelDefaultAppConfigData, + getConfig, + } = initialApp; + + let runsRequestRef: { + call: ( + exceptionHandler: (detail: any) => void, + ) => Promise[]>>; + abort: () => void; + }; + let runsArchiveRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let runsDeleteRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let liveUpdateInstance: LiveUpdateService | null; + + function initialize(appId: string): void { + model.init(); + const state: Partial = {}; + if (grouping) { + state.groupingSelectOptions = []; + } + if (components?.table) { + state.refs = { + ...state.refs, + tableRef: { current: null }, + }; + } + if (components?.charts?.[0]) { + state.refs = { + ...state.refs, + chartPanelRef: { current: null }, + }; + } + projectsService + .getProjectParams(['metric']) + .call() + .then((data) => { + model.setState({ + selectFormData: { + options: getSelectOptions(data), + suggestions: getSuggestionsByExplorer(appName, data), + }, + }); + }); + model.setState({ ...state }); + if (!appId) { + setModelDefaultAppConfigData(); + } + const liveUpdateState = model.getState()?.config?.liveUpdate; + + if (liveUpdateState?.enabled) { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + liveUpdateState.delay, + ); + } + } + + function updateData(newData: IRun[]): void { + const configData = model.getState()?.config; + if (configData) { + setModelData(newData, configData); + } + } + + function abortRequest(): void { + if (runsRequestRef) { + runsRequestRef.abort(); + } + setRequestProgress(model); + model.setState({ + requestStatus: RequestStatusEnum.Ok, + }); + onModelNotificationAdd({ + id: Date.now(), + severity: 'info', + messages: ['Request has been cancelled'], + }); + } + + function getParamsData( + shouldUrlUpdate?: boolean, + shouldResetSelectedRows?: boolean, + queryString?: string, + ): { + call: () => Promise; + abort: () => void; + } { + if (runsRequestRef) { + runsRequestRef.abort(); + } + const configData = { ...model.getState()?.config }; + if (queryString) { + configData.select.query = queryString; + } + runsRequestRef = runsService.getRunsData(configData?.select?.query); + setRequestProgress(model); + return { + call: async () => { + if (_.isEmpty(configData?.select?.options)) { + resetModelState(configData, shouldResetSelectedRows!); + } else { + model.setState({ + requestStatus: RequestStatusEnum.Pending, + queryIsEmpty: false, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + }); + liveUpdateInstance?.stop().then(); + try { + const stream = await runsRequestRef.call((detail) => { + exceptionHandler({ detail, model }); + resetModelState(configData, shouldResetSelectedRows!); + }); + const runData = await getRunData(stream, (progress) => + setRequestProgress(model, progress), + ); + updateData(runData); + if (shouldUrlUpdate) { + updateURL({ configData, appName }); + } + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + // Abort Error + } else { + // eslint-disable-next-line no-console + console.log('Unhandled error: ', ex); + } + } + liveUpdateInstance?.start({ + q: configData?.select?.query, + }); + } + }, + abort: runsRequestRef.abort, + }; + } + + function resetModelState(configData: any, shouldResetSelectedRows: boolean) { + let state: Partial = {}; + if (components?.charts?.indexOf(ChartTypeEnum.HighPlot) !== -1) { + state.highPlotData = []; + } + if (components.table) { + state.tableData = []; + state.config = { + ...configData, + table: { + ...configData?.table, + resizeMode: ResizeModeEnum.Resizable, + }, + }; + } + + model.setState({ + queryIsEmpty: true, + rawData: [], + tableColumns: [], + selectFormData: { ...model.getState().selectFormData, error: null }, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + ...state, + }); + } + + function getDataAsTableRows( + processedData: IMetricsCollection[], + metricsColumns: any, + paramKeys: string[], + isRowData: boolean, + config: IAppModelConfig, + groupingSelectOptions: IGroupingSelectOption[], + ): { rows: IMetricTableRowData[] | any; sameValueColumns: string[] } { + if (!processedData) { + return { + rows: [], + sameValueColumns: [], + }; + } + + const rows: IMetricTableRowData[] | any = + processedData[0]?.config !== null ? {} : []; + + let rowIndex = 0; + const sameValueColumns: string[] = []; + const columnsFlattenValues: { [key: string]: Set } = {}; + + processedData.forEach((metricsCollection: IMetricsCollection) => { + const groupKey = metricsCollection.key; + const columnsValues: { [key: string]: string[] } = {}; + if (metricsCollection.config !== null) { + const groupConfigData: { [key: string]: unknown } = {}; + for (let key in metricsCollection.config) { + groupConfigData[getValueByField(groupingSelectOptions, key)] = + metricsCollection.config[key]; + } + const groupHeaderRow = { + meta: { + chartIndex: config?.grouping?.chart?.length + ? metricsCollection.chartIndex + 1 + : null, + //ToDo reverse mode + // config.grouping?.reverseMode?.chart + // ? metricsCollection.chartIndex + 1 + // : null, + color: metricsCollection.color, + dasharray: metricsCollection.dasharray, + itemsCount: metricsCollection.data.length, + config: groupConfigData, + }, + key: groupKey!, + groupRowsKeys: metricsCollection.data.map((metric) => metric.key), + color: metricsCollection.color, + dasharray: metricsCollection.dasharray, + experiment: '', + run: '', + hash: '', + description: '', + experiment_description: '', + date: '', + metric: '', + context: [], + children: [], + groups: groupConfigData, + }; + + rows[groupKey!] = { + data: groupHeaderRow, + items: [], + }; + } + + metricsCollection.data.forEach((metric: any) => { + const metricsRowValues = getMetricsInitialRowData(metricsColumns); + metric.run.traces.metric.forEach((trace: any) => { + const metricHash = getMetricHash(trace.name, trace.context); + metricsRowValues[metricHash] = formatValue(trace.values.last); + }); + const rowValues: any = { + rowMeta: { + color: metricsCollection.color ?? metric.color, + }, + key: metric.key, + selectKey: `${metric.run.hash}/${metric.key}`, + hash: metric.run.hash, + isHidden: metric.isHidden, + index: rowIndex, + color: metricsCollection.color ?? metric.color, + dasharray: metricsCollection.dasharray ?? metric.dasharray, + experiment: metric.run.props.experiment.name ?? 'default', + experimentId: metric.run.props.experiment.id ?? '', + experiment_description: + metric.run.props.experiment?.description ?? '-', + run: metric.run.props?.name ?? '-', + description: metric.run.props?.description ?? '-', + date: moment(metric.run.props.creation_time * 1000).format( + TABLE_DATE_FORMAT, + ), + tags: metric.run.props.tags.map((tag: ITagProps) => ({ + archived: false, + color: tag.color, + id: tag.id, + comment: tag.description, + name: tag.name, + run_count: 0, + })), + metric: metric.name, + duration: processDurationTime( + metric.run.props.creation_time * 1000, + metric.run.props.end_time + ? metric.run.props.end_time * 1000 + : Date.now(), + ), + active: metric.run.props.active, + ...metricsRowValues, + }; + rowIndex++; + + for (let key in metricsRowValues) { + columnsValues[key] = ['-']; + } + + [ + 'experiment', + 'run', + 'hash', + 'date', + 'duration', + 'description', + 'metric', + 'context', + 'step', + 'epoch', + 'time', + ].forEach((key) => { + if (columnsValues.hasOwnProperty(key)) { + if (!_.some(columnsValues[key], rowValues[key])) { + columnsValues[key].push(rowValues[key]); + } + } else { + columnsValues[key] = [rowValues[key]]; + } + }); + + paramKeys.forEach((paramKey) => { + const value = getValue(metric.run.params, paramKey, '-'); + rowValues[paramKey] = formatValue(value); + if (columnsValues.hasOwnProperty(paramKey)) { + if ( + _.findIndex(columnsValues[paramKey], (paramValue) => + _.isEqual(value, paramValue), + ) === -1 + ) { + columnsValues[paramKey].push(value); + } + } else { + columnsValues[paramKey] = [value]; + } + }); + + if (metricsCollection.config !== null) { + rows[groupKey!].items.push( + isRowData + ? rowValues + : paramsTableRowRenderer(rowValues, onModelRunsTagsChange, { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange({ + metricKey: rowValues.key, + model, + appName, + updateModelData, + }); + }, + }), + ); + } else { + rows.push( + isRowData + ? rowValues + : paramsTableRowRenderer(rowValues, onModelRunsTagsChange, { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange({ + metricKey: rowValues.key, + model, + appName, + updateModelData, + }); + }, + }), + ); + } + }); + + for (let columnKey in columnsValues) { + columnsFlattenValues[columnKey] = new Set([ + ...(columnsFlattenValues[columnKey] || []), + ...(columnsValues[columnKey] || []), + ]); + + if (metricsCollection.config !== null) { + rows[groupKey!].data[columnKey] = + columnsValues[columnKey].length === 1 + ? paramKeys.includes(columnKey) + ? formatValue(columnsValues[columnKey][0]) + : columnsValues[columnKey][0] + : columnsValues[columnKey]; + } + } + + if (metricsCollection.config !== null && !isRowData) { + rows[groupKey!].data = paramsTableRowRenderer( + rows[groupKey!].data, + onModelRunsTagsChange, + {}, + true, + ['groups'].concat(Object.keys(columnsValues)), + ); + } + }); + for (let columnKey in columnsFlattenValues) { + if (columnsFlattenValues[columnKey].size === 1) { + sameValueColumns.push(columnKey); + } + } + return { rows, sameValueColumns }; + } + + function getDataAsLines( + processedData: IMetricsCollection[], + configData = model.getState()?.config, + ): { dimensions: IDimensionsType; data: any }[] { + if (!processedData || _.isEmpty(configData.select.options)) { + return []; + } + const dimensionsObject: any = {}; + const lines = processedData.map( + ({ chartIndex, color, data, dasharray }: IMetricsCollection) => { + if (!dimensionsObject[chartIndex]) { + dimensionsObject[chartIndex] = {}; + } + + return data + .filter((run) => !run.isHidden) + .map((run: IParam) => { + const values: { [key: string]: string | number | null } = {}; + configData.select.options.forEach( + ({ type, label, value }: ISelectOption) => { + const dimension = dimensionsObject[chartIndex]; + if (!dimension[label] && type === 'params') { + dimension[label] = { + values: new Set(), + scaleType: ScaleEnum.Linear, + displayName: label, + dimensionType: 'param', + }; + } + if (type === 'metrics') { + run.run.traces.metric.forEach((trace: IParamTrace) => { + const metricHash = getMetricHash( + trace.name, + trace.context as any, + ); + const metricLabel = getMetricLabel( + trace.name, + trace.context as any, + ); + if ( + trace.name === value?.option_name && + _.isEqual(trace.context, value?.context) + ) { + values[metricHash] = trace.values.last; + if (dimension[metricHash]) { + dimension[metricHash].values.add(trace.values.last); + if (typeof trace.values.last === 'string') { + dimension[metricHash].scaleType = ScaleEnum.Point; + } + } else { + dimension[metricHash] = { + values: new Set().add(trace.values.last), + scaleType: ScaleEnum.Linear, + displayName: metricLabel, + dimensionType: 'metric', + }; + } + } + }); + } else { + const paramValue = getValue(run.run.params, label, '-'); + const formattedParam = formatValue(paramValue, '-'); + values[label] = paramValue; + if (formattedParam !== '-' && dimension[label]) { + if (typeof paramValue !== 'number') { + dimension[label].scaleType = ScaleEnum.Point; + values[label] = formattedParam; + } else if (isNaN(paramValue) || !isFinite(paramValue)) { + values[label] = formattedParam; + dimension[label].scaleType = ScaleEnum.Point; + } + dimension[label].values.add(values[label]); + } + } + }, + ); + + return { + values, + color: color ?? run.color, + dasharray: dasharray ?? run.dasharray, + chartIndex: chartIndex, + key: run.key, + }; + }); + }, + ); + + const flattedLines = lines.flat(); + const groupedByChartIndex = Object.values( + _.groupBy(flattedLines, 'chartIndex'), + ); + + return Object.keys(dimensionsObject) + .map((keyOfDimension, i) => { + const dimensions: IDimensionsType = {}; + Object.keys(dimensionsObject[keyOfDimension]).forEach((key: string) => { + if (dimensionsObject[keyOfDimension][key].scaleType === 'linear') { + const [minDomain, maxDomain] = minMaxOfArray([ + ...dimensionsObject[keyOfDimension][key].values, + ]); + + dimensions[key] = { + scaleType: dimensionsObject[keyOfDimension][key].scaleType, + domainData: [minDomain, maxDomain], + displayName: dimensionsObject[keyOfDimension][key].displayName, + dimensionType: + dimensionsObject[keyOfDimension][key].dimensionType, + }; + } else { + const numDomain: number[] = []; + const strDomain: string[] = []; + + [...dimensionsObject[keyOfDimension][key].values].forEach( + (data) => { + if (typeof data === 'number') { + numDomain.push(data); + } else { + strDomain.push(data); + } + }, + ); + + // sort domain data + numDomain.sort((a, b) => a - b); + strDomain.sort(); + + dimensions[key] = { + scaleType: dimensionsObject[keyOfDimension][key].scaleType, + domainData: numDomain.concat(strDomain as any[]), + displayName: dimensionsObject[keyOfDimension][key].displayName, + dimensionType: + dimensionsObject[keyOfDimension][key].dimensionType, + }; + } + }); + return { + dimensions, + data: groupedByChartIndex[i], + }; + }) + .filter((data) => !_.isEmpty(data.data) && !_.isEmpty(data.dimensions)); + } + + function setModelData( + rawData: IRun[], + configData: IAppModelConfig, + ): void { + const { + data, + runProps, + highLevelParams, + params, + metricsColumns, + selectedRows, + } = processData(rawData); + const modelState: IAppModelState = model.getState(); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + runProps, + }), + ]; + const metricsSelectOptions = getMetricsSelectOptions(metricsColumns, model); + const sortOptions = [...groupingSelectOptions, ...metricsSelectOptions]; + + const tableData = getDataAsTableRows( + data, + metricsColumns, + params, + false, + configData, + groupingSelectOptions, + ); + const sortFields = modelState?.config?.table.sortFields; + + const tableColumns = getParamsTableColumns( + sortOptions, + metricsColumns, + params, + data[0]?.config, + configData.table?.columnsOrder!, + configData.table?.hiddenColumns!, + configData.table?.metricsValueKey, + sortFields, + onSortChange, + configData.grouping as any, + onModelGroupingSelectChange, + AppNameEnum.PARAMS, + ); + + modelState?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + }); + + if (!_.isEmpty(configData.chart?.brushExtents)) { + const chart = { ...configData.chart }; + let brushExtents = { ...chart?.brushExtents }; + const resultBrushExtents: any = {}; + const selectOptionList = configData.select?.options.map( + (option: ISelectOption) => option.key, + ); + + const brushExtentsKeys = Object.keys(brushExtents); + brushExtentsKeys.forEach((chartIndex: string) => { + const chartBrushExtents = { ...brushExtents[chartIndex] }; + const chartBrushExtentsKeys = Object.keys(chartBrushExtents); + const omitKeys = chartBrushExtentsKeys.filter( + (key: string) => !selectOptionList?.includes(key), + ); + resultBrushExtents[chartIndex] = _.omit(chartBrushExtents, omitKeys); + }); + configData = { + ...configData, + chart: { ...configData.chart, brushExtents: resultBrushExtents }, + }; + } + + model.setState({ + requestStatus: RequestStatusEnum.Ok, + data, + highPlotData: getDataAsLines(data), + chartTitleData: getChartTitleData({ + processedData: data, + groupingSelectOptions, + model: model as IModel, + }), + selectFormData: { ...modelState.selectFormData, error: null }, + params, + selectedRows, + metricsColumns, + rawData, + config: configData, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + groupingSelectOptions, + sortOptions, + }); + } + + function groupData(data: IParam[]): IMetricsCollection[] { + const grouping = model.getState()!.config!.grouping; + const { paletteIndex } = grouping; + const groupByColor = getFilteredGroupingOptions({ + groupName: GroupNameEnum.COLOR, + model, + }); + const groupByStroke = getFilteredGroupingOptions({ + groupName: GroupNameEnum.STROKE, + model, + }); + const groupByChart = getFilteredGroupingOptions({ + groupName: GroupNameEnum.CHART, + model, + }); + if ( + groupByColor.length === 0 && + groupByStroke.length === 0 && + groupByChart.length === 0 + ) { + return [ + { + config: null, + color: null, + dasharray: null, + chartIndex: 0, + data, + }, + ]; + } + + const groupValues: { + [key: string]: IMetricsCollection | any; + } = {}; + + const groupingFields = _.uniq( + groupByColor.concat(groupByStroke).concat(groupByChart), + ); + + for (let i = 0; i < data.length; i++) { + const groupValue: { [key: string]: unknown } = {}; + groupingFields.forEach((field) => { + groupValue[field] = getValue(data[i], field); + }); + const groupKey = encode(groupValue); + if (groupValues.hasOwnProperty(groupKey)) { + groupValues[groupKey].data.push(data[i]); + } else { + groupValues[groupKey] = { + key: groupKey, + config: groupValue, + color: null, + dasharray: null, + chartIndex: 0, + data: [data[i]], + }; + } + } + + let colorIndex = 0; + let dasharrayIndex = 0; + let chartIndex = 0; + + const colorConfigsMap: { [key: string]: number } = {}; + const dasharrayConfigsMap: { [key: string]: number } = {}; + const chartIndexConfigsMap: { [key: string]: number } = {}; + + for (let groupKey in groupValues) { + const groupValue = groupValues[groupKey]; + + if (groupByColor.length > 0) { + const colorConfig = _.pick(groupValue.config, groupByColor); + const colorKey = encode(colorConfig); + + if (grouping.persistence.color && grouping.isApplied.color) { + let index = getGroupingPersistIndex({ + groupConfig: colorConfig, + grouping, + groupName: 'color', + }); + groupValue.color = + COLORS[paletteIndex][ + Number(index % BigInt(COLORS[paletteIndex].length)) + ]; + } else if (colorConfigsMap.hasOwnProperty(colorKey)) { + groupValue.color = + COLORS[paletteIndex][ + colorConfigsMap[colorKey] % COLORS[paletteIndex].length + ]; + } else { + colorConfigsMap[colorKey] = colorIndex; + groupValue.color = + COLORS[paletteIndex][colorIndex % COLORS[paletteIndex].length]; + colorIndex++; + } + } + + if (groupByStroke.length > 0) { + const dasharrayConfig = _.pick(groupValue.config, groupByStroke); + const dasharrayKey = encode(dasharrayConfig); + if (grouping.persistence.stroke && grouping.isApplied.stroke) { + let index = getGroupingPersistIndex({ + groupConfig: dasharrayConfig, + grouping, + groupName: 'stroke', + }); + groupValue.dasharray = + DASH_ARRAYS[Number(index % BigInt(DASH_ARRAYS.length))]; + } else if (dasharrayConfigsMap.hasOwnProperty(dasharrayKey)) { + groupValue.dasharray = + DASH_ARRAYS[dasharrayConfigsMap[dasharrayKey] % DASH_ARRAYS.length]; + } else { + dasharrayConfigsMap[dasharrayKey] = dasharrayIndex; + groupValue.dasharray = + DASH_ARRAYS[dasharrayIndex % DASH_ARRAYS.length]; + dasharrayIndex++; + } + } + + if (groupByChart.length > 0) { + const chartIndexConfig = _.pick(groupValue.config, groupByChart); + const chartIndexKey = encode(chartIndexConfig); + if (chartIndexConfigsMap.hasOwnProperty(chartIndexKey)) { + groupValue.chartIndex = chartIndexConfigsMap[chartIndexKey]; + } else { + chartIndexConfigsMap[chartIndexKey] = chartIndex; + groupValue.chartIndex = chartIndex; + chartIndex++; + } + } + } + return Object.values(groupValues); + } + + function processData(data: IRun[]): { + data: IMetricsCollection[]; + params: string[]; + runProps: string[]; + highLevelParams: string[]; + metricsColumns: any; + selectedRows: any; + } { + const configData = model.getState()?.config; + let selectedRows = model.getState()?.selectedRows; + const grouping = model.getState()?.config?.grouping; + let runs: IParam[] = []; + let params: string[] = []; + let runProps: string[] = []; + let highLevelParams: string[] = []; + const paletteIndex: number = grouping?.paletteIndex || 0; + const metricsColumns: any = {}; + + data?.forEach((run: IRun, index) => { + params = params.concat(getObjectPaths(run.params, run.params)); + runProps = runProps.concat(getObjectPaths(run.props, run.props)); + highLevelParams = highLevelParams.concat( + getObjectPaths(run.params, run.params, '', false, true), + ); + const metricsValues: Record< + string, + Record + > = {}; + run.traces.metric.forEach((trace) => { + metricsColumns[trace.name] = { + ...metricsColumns[trace.name], + [contextToString(trace.context) as string]: '-', + }; + const metricHash = getMetricHash(trace.name, trace.context as any); + metricsValues[metricHash] = { + min: trace.values.min, + max: trace.values.max, + last: trace.values.last, + first: trace.values.first, + }; + }); + const paramKey = encode({ runHash: run.hash }); + + runs.push({ + run, + isHidden: configData!.table.hiddenMetrics!.includes(paramKey), + color: COLORS[paletteIndex][index % COLORS[paletteIndex].length], + key: paramKey, + metricsValues, + dasharray: DASH_ARRAYS[0], + }); + }); + + let sortFields = configData?.table?.sortFields ?? []; + + if (sortFields?.length === 0) { + sortFields = [ + { + value: 'run.props.creation_time', + order: 'desc', + label: '', + group: '', + }, + ]; + } + + const processedData = groupData( + _.orderBy( + runs, + sortFields?.map( + (f: SortField) => + function (run: IParam) { + return getValue(run, f.value, ''); + }, + ), + sortFields?.map((f: SortField) => f.order), + ), + ); + const uniqProps = _.uniq(runProps).sort(); + const uniqParams = _.uniq(params).sort(); + const uniqHighLevelParams = _.uniq(highLevelParams).sort(); + + const mappedData: Record = {}; + + for (let run of runs) { + mappedData[run.run.hash] = { + runHash: run.run.hash, + ...run.run.props, + ...run, + }; + } + + let selected: Record = {}; + + if (selectedRows && !_.isEmpty(selectedRows)) { + for (let rowKey in selectedRows) { + const slicedKey = rowKey.slice(0, rowKey.indexOf('/')); + if (mappedData[slicedKey]) + selected[rowKey] = { + selectKey: rowKey, + ...mappedData[slicedKey], + }; + } + } + + selectedRows = selected; + + return { + data: processedData, + runProps: uniqProps, + params: uniqParams, + highLevelParams: uniqHighLevelParams, + metricsColumns, + selectedRows, + }; + } + + function onActivePointChange( + activePoint: IActivePoint, + focusedStateActive: boolean = false, + ): void { + const { refs, config, groupingSelectOptions, data } = model.getState(); + if (config.table.resizeMode !== ResizeModeEnum.Hide) { + const tableRef: any = refs?.tableRef; + if (tableRef) { + if (focusedStateActive) { + tableRef.current?.scrollToRow?.(activePoint.key); + tableRef.current?.setActiveRow?.( + focusedStateActive ? activePoint.key : null, + ); + } else { + tableRef.current?.setHoveredRow?.(activePoint.key); + } + } + } + let configData = config; + if (configData?.chart) { + // TODO remove this later + // remove unnecessary content prop from tooltip config + if (configData.chart.tooltip?.hasOwnProperty('content')) { + delete configData.chart.tooltip.content; + } + + configData = { + ...configData, + chart: { + ...configData.chart, + focusedState: { + active: focusedStateActive, + key: activePoint.key, + xValue: activePoint.xValue, + yValue: activePoint.yValue, + chartIndex: activePoint.chartIndex, + visId: activePoint.visId || `${activePoint.chartIndex}`, + }, + }, + }; + + if ( + config.chart.focusedState.active !== focusedStateActive || + (config.chart.focusedState.active && + (activePoint.key !== config.chart.focusedState.key || + activePoint.xValue !== config.chart.focusedState.xValue)) + ) { + updateURL({ configData, appName }); + } + } + + const tooltipData = { + ...configData?.chart?.tooltip, + content: getTooltipContent({ + groupingNames: [ + GroupNameEnum.COLOR, + GroupNameEnum.STROKE, + GroupNameEnum.CHART, + ], + groupingSelectOptions, + data, + configData, + activePointKey: configData.chart?.focusedState?.key, + selectedFields: configData.chart?.tooltip?.selectedFields, + }), + }; + model.setState({ config: configData, tooltip: tooltipData }); + } + + function onExportTableData(): void { + const { data, params, config, metricsColumns, groupingSelectOptions } = + model.getState() as IParamsAppModelState; + const tableData = getDataAsTableRows( + data, + metricsColumns, + params, + true, + config, + groupingSelectOptions, + ); + const metricsSelectOptions = getMetricsSelectOptions(metricsColumns, model); + const sortOptions = [...groupingSelectOptions, ...metricsSelectOptions]; + + const tableColumns: ITableColumn[] = getParamsTableColumns( + sortOptions, + metricsColumns, + params, + data[0]?.config, + config.table?.columnsOrder!, + config.table?.hiddenColumns!, + config.table?.metricsValueKey, + config.table?.sortFields, + onSortChange, + config.grouping as any, + onModelGroupingSelectChange, + AppNameEnum.PARAMS, + ); + + const excludedFields: string[] = ['#', 'actions']; + const filteredHeader: string[] = tableColumns.reduce( + (acc: string[], column: ITableColumn) => + acc.concat( + excludedFields.indexOf(column.key) === -1 && !column.isHidden + ? column.key + : [], + ), + [], + ); + + let emptyRow: { [key: string]: string } = {}; + filteredHeader.forEach((column: string) => { + emptyRow[column] = '--'; + }); + + const groupedRows: IMetricTableRowData[][] = + data.length > 1 + ? Object.keys(tableData.rows).map( + (groupedRowKey: string) => tableData.rows[groupedRowKey].items, + ) + : [ + Array.isArray(tableData.rows) + ? tableData.rows + : tableData.rows[Object.keys(tableData.rows)[0]].items, + ]; + const dataToExport: { [key: string]: string }[] = []; + groupedRows?.forEach( + (groupedRow: IMetricTableRowData[], groupedRowIndex: number) => { + groupedRow?.forEach((row: IMetricTableRowData) => { + const filteredRow = getFilteredRow({ + columnKeys: filteredHeader, + row, + }); + dataToExport.push(filteredRow); + }); + if (groupedRows?.length - 1 !== groupedRowIndex) { + dataToExport.push(emptyRow); + } + }, + ); + + const blob = new Blob([JsonToCSV(dataToExport)], { + type: 'text/csv;charset=utf-8;', + }); + saveAs(blob, `params-${moment().format(DATE_EXPORTING_FORMAT)}.csv`); + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.exports.csv); + } + + function updateModelData( + configData = model.getState()!.config!, + shouldURLUpdate?: boolean, + ): void { + const { + data, + params, + runProps, + highLevelParams, + metricsColumns, + selectedRows, + } = processData(model.getState()?.rawData as IRun[]); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + runProps, + }), + ]; + const metricsSelectOptions = getMetricsSelectOptions(metricsColumns, model); + const sortOptions = [...groupingSelectOptions, ...metricsSelectOptions]; + + const tableData = getDataAsTableRows( + data, + metricsColumns, + params, + false, + configData, + groupingSelectOptions, + ); + const tableColumns = getParamsTableColumns( + sortOptions, + metricsColumns, + params, + data[0]?.config, + configData.table?.columnsOrder!, + configData.table?.hiddenColumns!, + configData.table?.metricsValueKey, + configData.table?.sortFields, + onSortChange, + configData.grouping as any, + onModelGroupingSelectChange, + AppNameEnum.PARAMS, + ); + + model.getState()?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + hiddenColumns: configData.table?.hiddenColumns!, + }); + + if (shouldURLUpdate) { + updateURL({ configData, appName }); + } + + model.setState({ + config: configData, + data, + highPlotData: getDataAsLines(data), + chartTitleData: getChartTitleData({ + processedData: data, + groupingSelectOptions, + model: model as IModel, + }), + groupingSelectOptions, + sortOptions, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + selectedRows, + }); + } + + function onModelRunsTagsChange(runHash: string, tags: ITagInfo[]): void { + onRunsTagsChange({ runHash, tags, model, updateModelData }); + } + + function onModelGroupingSelectChange({ + groupName, + list, + }: IOnGroupingSelectChangeParams): void { + let configData = model.getState().config; + + onGroupingSelectChange({ + groupName, + list, + model, + appName, + updateModelData, + }); + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + brushExtents: {}, + }, + }; + } + + model.setState({ config: configData }); + } + + function onModelBookmarkCreate({ + name, + description, + }: { + name: string; + description: string; + }): Promise { + return onBookmarkCreate({ name, description, model, appName }); + } + + function onModelBookmarkUpdate(id: string): void { + onBookmarkUpdate({ id, model, appName }); + } + + function onModelNotificationDelete(id: number): void { + onNotificationDelete({ id, model }); + } + + function onModelNotificationAdd(notification: N & INotification): void { + onNotificationAdd({ notification, model }); + } + + function onModelResetConfigData(): void { + onResetConfigData({ model, getConfig, updateModelData }); + } + + function onSortChange({ + sortFields, + order, + index, + actionType, + field, + }: any): void { + onTableSortChange({ + sortFields, + order, + index, + field, + actionType, + model, + appName, + updateModelData, + }); + } + + function changeLiveUpdateConfig(config: { + enabled?: boolean; + delay?: number; + }): void { + const state = model.getState(); + const configData = state?.config; + const query = configData.select?.query; + const liveUpdateConfig = configData.liveUpdate; + if (!liveUpdateConfig?.enabled && config.enabled && query !== '()') { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + config?.delay || liveUpdateConfig?.delay, + ); + liveUpdateInstance?.start({ + q: query, + }); + } else { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; + } + + const newLiveUpdateConfig = { + ...liveUpdateConfig, + ...config, + }; + model.setState({ + config: { + ...configData, + liveUpdate: newLiveUpdateConfig, + }, + }); + + setItem('paramsLUConfig', encode(newLiveUpdateConfig)); + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].liveUpdate} ${ + config.enabled ? 'on' : 'off' + }`, + ); + } + + function destroy(): void { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; //@TODO check is this need or not + } + + function archiveRuns( + ids: string[], + archived: boolean, + ): { + call: () => Promise; + abort: () => void; + } { + runsArchiveRef = runsService.archiveRuns(ids, archived); + return { + call: async () => { + try { + await runsArchiveRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getParamsData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [ + `Runs are successfully ${ + archived ? 'archived' : 'unarchived' + } `, + ], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.archiveRunsBatch, + ); + } + }, + abort: runsArchiveRef.abort, + }; + } + + function deleteRuns(ids: string[]): { + call: () => Promise; + abort: () => void; + } { + runsDeleteRef = runsService.deleteRuns(ids); + return { + call: async () => { + try { + await runsDeleteRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getParamsData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: ['Runs are successfully deleted'], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.deleteRunsBatch, + ); + } + }, + abort: runsDeleteRef.abort, + }; + } + + const methods = { + initialize, + getAppConfigData: getModelAppConfigData, + getParamsData, + setDefaultAppConfigData: setModelDefaultAppConfigData, + abortRequest, + updateModelData, + onActivePointChange, + onExportTableData, + onBookmarkCreate: onModelBookmarkCreate, + onBookmarkUpdate: onModelBookmarkUpdate, + onNotificationAdd: onModelNotificationAdd, + onNotificationDelete: onModelNotificationDelete, + onResetConfigData: onModelResetConfigData, + onRunsTagsChange: onModelRunsTagsChange, + onSortChange, + destroy, + changeLiveUpdateConfig, + onShuffleChange, + deleteRuns, + archiveRuns, + }; + + if (grouping) { + Object.assign(methods, { + onGroupingSelectChange: onModelGroupingSelectChange, + onGroupingModeChange({ + groupName, + value, + }: IOnGroupingModeChangeParams): void { + let configData = model.getState().config; + + onGroupingModeChange({ + groupName, + value, + model, + appName, + updateModelData, + }); + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + brushExtents: {}, + }, + }; + } + + model.setState({ config: configData }); + }, + onGroupingPaletteChange(index: number): void { + onGroupingPaletteChange({ index, model, appName, updateModelData }); + }, + onGroupingReset(groupName: GroupNameEnum): void { + let configData = model.getState().config; + + onGroupingReset({ groupName, model, appName, updateModelData }); + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + brushExtents: {}, + }, + }; + } + + model.setState({ config: configData }); + }, + onGroupingApplyChange(groupName: GroupNameEnum): void { + let configData = model.getState().config; + + onGroupingApplyChange({ + groupName, + model, + appName, + updateModelData, + }); + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + brushExtents: {}, + }, + }; + } + + model.setState({ config: configData }); + }, + onGroupingPersistenceChange(groupName: GroupNameEnum): void { + onGroupingPersistenceChange({ + groupName, + model, + appName, + updateModelData, + }); + }, + onShuffleChange(name: 'color' | 'stroke'): void { + onShuffleChange({ name, model, updateModelData }); + }, + }); + } + if (selectForm) { + Object.assign(methods, { + onParamsSelectChange(data: D & Partial): void { + onSelectOptionsChange({ data, model }); + }, + onSelectRunQueryChange(query: string): void { + onSelectRunQueryChange({ query, model }); + }, + }); + } + if (components?.charts?.[0]) { + Object.assign(methods, { + onChangeTooltip(tooltip: Partial): void { + onChangeTooltip({ + tooltip, + groupingNames: [ + GroupNameEnum.COLOR, + GroupNameEnum.STROKE, + GroupNameEnum.CHART, + ], + model, + appName, + }); + }, + onColorIndicatorChange(): void { + onColorIndicatorChange({ model, appName, updateModelData }); + }, + onCurveInterpolationChange(): void { + onCurveInterpolationChange({ model, appName, updateModelData }); + }, + onAxisBrushExtentChange( + key: string, + extent: [number, number] | null, + chartIndex: number, + ): void { + onAxisBrushExtentChange({ + key, + extent, + chartIndex, + model, + updateModelData, + }); + }, + }); + } + if (components?.table) { + Object.assign(methods, { + onRowHeightChange(height: RowHeightSize): void { + onRowHeightChange({ height, model, appName }); + }, + onTableRowHover(rowKey?: string): void { + onTableRowHover({ rowKey, model }); + }, + onTableRowClick(rowKey?: string): void { + onTableRowClick({ rowKey, model }); + }, + onSortFieldsChange(sortFields: [string, any][]): void { + onSortFieldsChange({ sortFields, model, appName, updateModelData }); + }, + onParamVisibilityChange(metricsKeys: string[]): void { + onParamVisibilityChange({ + metricsKeys, + model, + appName, + updateModelData, + }); + }, + onColumnsOrderChange(columnsOrder: any): void { + onColumnsOrderChange({ + columnsOrder, + model, + appName, + updateModelData, + }); + }, + onColumnsVisibilityChange(hiddenColumns: string[]): void { + onColumnsVisibilityChange({ + hiddenColumns, + model, + appName, + updateModelData, + }); + }, + onTableResizeModeChange(mode: ResizeModeEnum): void { + onTableResizeModeChange({ mode, model, appName }); + }, + onTableDiffShow(): void { + onTableDiffShow({ model, appName, updateModelData }); + }, + onTableResizeEnd(tableHeight: string): void { + onTableResizeEnd({ tableHeight, model, appName }); + }, + onSortReset(): void { + updateSortFields({ + sortFields: [], + model, + appName, + updateModelData, + }); + }, + updateColumnsWidths(key: string, width: number, isReset: boolean): void { + updateColumnsWidths({ + key, + width, + isReset, + model, + appName, + updateModelData, + }); + }, + onRowSelect({ + actionType, + data, + }: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + }): void { + return onRowSelect({ actionType, data, model }); + }, + onRowsVisibilityChange(metricKeys: string[]): void { + return onRowsVisibilityChange({ + metricKeys, + model, + appName, + updateModelData, + }); + }, + }); + } + + return methods; +} + +export default getParamsModelMethods; diff --git a/src/src/services/models/explorer/runsModelMethods.ts b/src/src/services/models/explorer/runsModelMethods.ts new file mode 100644 index 00000000..45d85e7f --- /dev/null +++ b/src/src/services/models/explorer/runsModelMethods.ts @@ -0,0 +1,1187 @@ +import moment from 'moment'; +import { saveAs } from 'file-saver'; +import _ from 'lodash-es'; + +import COLORS from 'config/colors/colors'; +import DASH_ARRAYS from 'config/dash-arrays/dashArrays'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_EXPORTING_FORMAT, TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { getSuggestionsByExplorer } from 'config/monacoConfig/monacoConfig'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; +import { MetricsValueKeyEnum } from 'config/enums/tableEnums'; + +import { + getRunsTableColumns, + runsTableRowRenderer, +} from 'pages/Runs/components/RunsTableGrid/RunsTableGrid'; + +import * as analytics from 'services/analytics'; +import runsService from 'services/api/runs/runsService'; +import LiveUpdateService from 'services/live-update/examples/LiveUpdateBridge.example'; +import projectsService from 'services/api/projects/projectsService'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { IMetric } from 'types/services/models/metrics/metricModel'; +import { + IMetricsCollection, + IMetricTableRowData, +} from 'types/services/models/metrics/metricsAppModel'; +import { + IMetricTrace, + IParamTrace, + IRun, +} from 'types/services/models/metrics/runModel'; +import { IParam } from 'types/services/models/params/paramsAppModel'; +import { IRunsAppModelState } from 'types/services/models/runs/runsAppModel'; +import { + IAppInitialConfig, + IAppModelConfig, + IAppModelState, +} from 'types/services/models/explorer/createAppModel'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { aggregateGroupData } from 'utils/aggregateGroupData'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import { getFilteredGroupingOptions } from 'utils/app/getFilteredGroupingOptions'; +import getFilteredRow from 'utils/app/getFilteredRow'; +import { getGroupingPersistIndex } from 'utils/app/getGroupingPersistIndex'; +import onColumnsOrderChange from 'utils/app/onColumnsOrderChange'; +import onColumnsVisibilityChange from 'utils/app/onColumnsVisibilityChange'; +import onRowHeightChange from 'utils/app/onRowHeightChange'; +import onSelectRunQueryChange from 'utils/app/onSelectRunQueryChange'; +import { onTableDiffShow } from 'utils/app/onTableDiffShow'; +import updateColumnsWidths from 'utils/app/updateColumnsWidths'; +import updateSortFields from 'utils/app/updateTableSortFields'; +import contextToString from 'utils/contextToString'; +import { + decodeBufferPairs, + decodePathsVals, + iterFoldTree, +} from 'utils/encoder/streamEncoding'; +import { formatValue } from 'utils/formatValue'; +import getObjectPaths from 'utils/getObjectPaths'; +import JsonToCSV from 'utils/JsonToCSV'; +import { setItem } from 'utils/storage'; +import { encode } from 'utils/encoder/encoder'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import updateURL from 'utils/app/updateURL'; +import { getValue } from 'utils/helper'; +import onRowSelect from 'utils/app/onRowSelect'; +import onToggleColumnsColorScales from 'utils/app/onToggleColumnsColorScales'; +import onRunsTagsChange from 'utils/app/onRunsTagsChange'; +import setRequestProgress from 'utils/app/setRequestProgress'; +import { processDurationTime } from 'utils/processDurationTime'; +import { getMetricsInitialRowData } from 'utils/app/getMetricsInitialRowData'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import saveRecentSearches from 'utils/saveRecentSearches'; +import onMetricsValueKeyChange from 'utils/app/onMetricsValueKeyChange'; + +import { InitialAppModelType } from './config'; + +// ************ Runs App Model Methods ************ +function getRunsModelMethods( + initialApp: InitialAppModelType, + appConfig: IAppInitialConfig, +) { + const { appName, grouping, components, selectForm } = appConfig; + const { model, setModelDefaultAppConfigData } = initialApp; + + let runsRequestRef: { + call: ( + exceptionHandler: (detail: any) => void, + ) => Promise[]>>; + abort: () => void; + }; + let runsArchiveRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let runsDeleteRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let liveUpdateInstance: LiveUpdateService | null; + let updateTableTimeoutId: number; + + function initialize(appId: string = '') { + model.init(); + const state: Partial = {}; + if (grouping) { + state.groupingSelectOptions = []; + } + if (components?.table) { + state.refs = { + ...state.refs, + tableRef: { current: null }, + }; + } + if (components?.charts?.[0]) { + state.refs = { + ...state.refs, + chartPanelRef: { current: null }, + }; + } + model.setState({ ...state }); + if (!appId) { + setModelDefaultAppConfigData(); + } + + const liveUpdateState = model.getState()?.config.liveUpdate; + projectsService + .getProjectParams(['metric']) + .call() + .then((data) => { + model.setState({ + selectFormData: { + suggestions: getSuggestionsByExplorer(appName, data), + }, + }); + }); + if (liveUpdateState?.enabled) { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + liveUpdateState.delay, + ); + } + try { + getRunsData().call((detail) => { + exceptionHandler({ detail, model }); + }); + } catch (err: any) { + onNotificationAdd({ + model, + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + }); + } + } + + function abortRequest(): void { + if (runsRequestRef) { + runsRequestRef.abort(); + } + setRequestProgress(model); + model.setState({ + requestStatus: RequestStatusEnum.Ok, + }); + onModelNotificationAdd({ + id: Date.now(), + severity: 'info', + messages: ['Request has been cancelled'], + }); + } + + function onModelRunsTagsChange(runHash: string, tags: ITagInfo[]): void { + onRunsTagsChange({ runHash, tags, model, updateModelData }); + } + + function getRunsData( + shouldUrlUpdate?: boolean, + shouldResetSelectedRows?: boolean, + isInitial = true, + queryString?: string, + ): { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + } { + if (runsRequestRef) { + runsRequestRef.abort(); + } + // isInitial: true --> when search button clicked or data is loading at the first time + const modelState = prepareModelStateToCall(isInitial); + const configData = modelState?.config; + if (queryString) { + configData.select.query = queryString; + } + const query = configData?.select?.query || ''; + const pagination = configData?.pagination; + + liveUpdateInstance?.stop().then(); + + runsRequestRef = runsService.getRunsData(query, 45, pagination?.offset); + let limit = pagination.limit; + setRequestProgress(model); + return { + call: async () => { + try { + const stream = await runsRequestRef.call((detail) => { + exceptionHandler({ detail, model }); + }); + let bufferPairs = decodeBufferPairs(stream as ReadableStream); + let decodedPairs = decodePathsVals(bufferPairs); + let objects = iterFoldTree(decodedPairs, 1); + + const runsData: IRun[] = isInitial + ? [] + : modelState?.rawData; + let count = 0; + for await (let [keys, val] of objects) { + const data = { ...(val as any), hash: keys[0] }; + if (data.hash.startsWith('progress')) { + const { 0: checked, 1: trackedRuns } = data; + setRequestProgress(model, { + matched: runsData.length, + checked, + trackedRuns, + }); + } else { + if (isInitial) { + const runData: any = val; + runsData.push({ ...runData, hash: keys[0] } as any); + } else { + if (count >= 0) { + const runData: any = val; + runsData.push({ ...runData, hash: keys[0] } as any); + } + } + count++; + } + } + const { data, params, metricsColumns, selectedRows } = + processData(runsData); + const tableData = getDataAsTableRows(data, metricsColumns, params); + const tableColumns = getRunsTableColumns( + metricsColumns, + params, + model.getState()?.config?.table.columnsOrder!, + model.getState()?.config?.table.hiddenColumns!, + ); + updateTableData(tableData, tableColumns, configData); + + model.setState({ + data, + selectedRows: shouldResetSelectedRows + ? {} + : selectedRows ?? model.getState()?.selectedRows, + rawData: runsData, + infiniteIsPending: false, + tableColumns, + tableData: tableData.rows, + sameValueColumns: tableData.sameValueColumns, + config: { + ...modelState?.config, + pagination: { + ...modelState?.config.pagination, + isLatest: + !isInitial && count < modelState?.config.pagination.limit, + }, + }, + }); + saveRecentSearches(appName, query); + if (shouldUrlUpdate) { + updateURL({ configData, appName }); + } + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [`${ex.name}, ${ex.message}`], + }, + model, + }); + } + } + const rowDataLength = model.getState()?.tableData?.length || 0; + limit = rowDataLength >= 45 ? rowDataLength : 45; + liveUpdateInstance?.start({ + q: query, + limit, + }); + }, + abort: runsRequestRef.abort, + }; + } + + function updateModelData( + configData = model.getState()!.config!, + shouldURLUpdate?: boolean, + ): void { + const { data, params, metricsColumns, selectedRows } = processData( + model.getState()?.rawData, + ); + const tableData = getDataAsTableRows(data, metricsColumns, params); + const tableColumns: ITableColumn[] = getRunsTableColumns( + metricsColumns, + params, + configData?.table?.columnsOrder!, + configData?.table?.hiddenColumns!, + ); + model.setState({ + config: configData, + data, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + selectedRows, + }); + updateTableData(tableData, tableColumns, configData); + } + + function updateTableData( + tableData: { + rows: any; + sameValueColumns: string[]; + }, + tableColumns: ITableColumn[], + configData: IAppModelConfig | any, + ): void { + if (updateTableTimeoutId) { + clearTimeout(updateTableTimeoutId); + } + + updateTableTimeoutId = window.setTimeout(() => { + model.setState({ requestStatus: RequestStatusEnum.Ok }); + model.getState()?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + hiddenColumns: configData.table.hiddenColumns!, + }); + }, 0); + } + + function prepareModelStateToCall(isInitial: boolean): IRunsAppModelState { + const config = model.getState()?.config; + if (isInitial) { + model.setState({ + config: { + ...config, + pagination: { + limit: 45, + offset: null, + isLatest: false, + }, + }, + notifyData: [], + rawData: [], + tableColumns: [], + tableData: [], + data: [], + }); + } + + model.setState({ + requestStatus: isInitial + ? RequestStatusEnum.Pending + : RequestStatusEnum.Ok, + infiniteIsPending: !isInitial, + }); + + return model.getState(); + } + + function processData(data: any[]): { + data: any[]; + params: string[]; + runProps: string[]; + metricsColumns: any; + selectedRows: any; + runHashArray: string[]; + unselectedRowsCount: number; + } { + const grouping = model.getState()?.config?.grouping; + const paletteIndex: number = grouping?.paletteIndex || 0; + const metricsColumns: Record> = {}; + const runHashArray: string[] = []; + let selectedRows = model.getState()?.selectedRows; + let runs: IParam[] = []; + let params: string[] = []; + let runProps: string[] = []; + let unselectedRowsCount = 0; + data?.forEach((run: IRun, index) => { + params = params.concat(getObjectPaths(run.params, run.params)); + runProps = runProps.concat(getObjectPaths(run.props, run.props)); + const metricsValues: Record< + string, + Record + > = {}; + run.traces.metric.forEach((trace) => { + metricsColumns[trace.name] = { + ...metricsColumns[trace.name], + [contextToString(trace.context) as string]: '-', + }; + const metricHash = getMetricHash(trace.name, trace.context as any); + metricsValues[metricHash] = { + min: trace.values.min, + max: trace.values.max, + last: trace.values.last, + first: trace.values.first, + }; + }); + runHashArray.push(run.hash); + runs.push({ + run, + isHidden: false, + color: COLORS[paletteIndex][index % COLORS[paletteIndex].length], + key: encode({ runHash: run.hash }), + dasharray: DASH_ARRAYS[0], + metricsValues, + }); + }); + + const processedData = groupData(runs); + const uniqParams = _.uniq(params).sort(); + const uniqProps = _.uniq(runProps).sort(); + + const mappedData = + data?.reduce((acc: any, item: any) => { + acc[item.hash] = { runHash: item.hash, ...item.props }; + return acc; + }, {}) || {}; + if (selectedRows && !_.isEmpty(selectedRows)) { + selectedRows = Object.keys(selectedRows).reduce( + (acc: any, key: string) => { + const slicedKey = key.slice(0, key.indexOf('/')); + if (runHashArray.includes(slicedKey)) { + acc[key] = { + selectKey: key, + ...mappedData[slicedKey], + }; + } else { + unselectedRowsCount++; + } + return acc; + }, + {}, + ); + } + return { + data: processedData, + params: uniqParams, + runProps: uniqProps, + metricsColumns, + selectedRows, + runHashArray, + unselectedRowsCount, + }; + } + + function groupData(data: any): IMetricsCollection[] { + const configData = model.getState()!.config; + const grouping = configData!.grouping; + + const groupByColor = getFilteredGroupingOptions({ + groupName: GroupNameEnum.COLOR, + model, + }); + const groupByStroke = getFilteredGroupingOptions({ + groupName: GroupNameEnum.STROKE, + model, + }); + const groupByChart = getFilteredGroupingOptions({ + groupName: GroupNameEnum.CHART, + model, + }); + if ( + groupByColor.length === 0 && + groupByStroke.length === 0 && + groupByChart.length === 0 + ) { + return [ + { + config: null, + color: null, + dasharray: null, + chartIndex: 0, + data: data, + }, + ]; + } + const groupValues: { + [key: string]: IMetricsCollection; + } = {}; + + const groupingFields = _.uniq( + groupByColor.concat(groupByStroke).concat(groupByChart), + ); + + for (let i = 0; i < data.length; i++) { + const groupValue: { [key: string]: string } = {}; + groupingFields.forEach((field) => { + groupValue[field] = getValue(data[i], field); + }); + const groupKey = encode(groupValue); + if (groupValues.hasOwnProperty(groupKey)) { + groupValues[groupKey].data.push(data[i]); + } else { + groupValues[groupKey] = { + key: groupKey, + config: groupValue, + color: null, + dasharray: null, + chartIndex: 0, + data: [data[i]], + }; + } + } + + let colorIndex = 0; + let dasharrayIndex = 0; + let chartIndex = 0; + + const colorConfigsMap: { [key: string]: number } = {}; + const dasharrayConfigsMap: { [key: string]: number } = {}; + const chartIndexConfigsMap: { [key: string]: number } = {}; + const { paletteIndex = 0 } = grouping || {}; + + for (let groupKey in groupValues) { + const groupValue = groupValues[groupKey]; + + if (groupByColor.length > 0) { + const colorConfig = _.pick(groupValue.config, groupByColor); + const colorKey = encode(colorConfig); + + if (grouping.persistence.color && grouping.isApplied.color) { + let index = getGroupingPersistIndex({ + groupConfig: colorConfig, + grouping, + groupName: 'color', + }); + groupValue.color = + COLORS[paletteIndex][ + Number(index % BigInt(COLORS[paletteIndex].length)) + ]; + } else if (colorConfigsMap.hasOwnProperty(colorKey)) { + groupValue.color = + COLORS[paletteIndex][ + colorConfigsMap[colorKey] % COLORS[paletteIndex].length + ]; + } else { + colorConfigsMap[colorKey] = colorIndex; + groupValue.color = + COLORS[paletteIndex][colorIndex % COLORS[paletteIndex].length]; + colorIndex++; + } + } + + if (groupByStroke.length > 0) { + const dasharrayConfig = _.pick(groupValue.config, groupByStroke); + const dasharrayKey = encode(dasharrayConfig); + if (grouping.persistence.stroke && grouping.isApplied.stroke) { + let index = getGroupingPersistIndex({ + groupConfig: dasharrayConfig, + grouping, + groupName: 'stroke', + }); + groupValue.dasharray = + DASH_ARRAYS[Number(index % BigInt(DASH_ARRAYS.length))]; + } else if (dasharrayConfigsMap.hasOwnProperty(dasharrayKey)) { + groupValue.dasharray = + DASH_ARRAYS[dasharrayConfigsMap[dasharrayKey] % DASH_ARRAYS.length]; + } else { + dasharrayConfigsMap[dasharrayKey] = dasharrayIndex; + groupValue.dasharray = + DASH_ARRAYS[dasharrayIndex % DASH_ARRAYS.length]; + dasharrayIndex++; + } + } + + if (groupByChart.length > 0) { + const chartIndexConfig = _.pick(groupValue.config, groupByChart); + const chartIndexKey = encode(chartIndexConfig); + if (chartIndexConfigsMap.hasOwnProperty(chartIndexKey)) { + groupValue.chartIndex = chartIndexConfigsMap[chartIndexKey]; + } else { + chartIndexConfigsMap[chartIndexKey] = chartIndex; + groupValue.chartIndex = chartIndex; + chartIndex++; + } + } + } + + const groups = Object.values(groupValues); + const chartConfig = configData!.chart; + + return aggregateGroupData({ + groupData: groups, + methods: { + area: chartConfig.aggregationConfig.methods.area, + line: chartConfig.aggregationConfig.methods.line, + }, + scale: chartConfig.axesScaleType, + }); + } + + function getDataAsTableRows( + processedData: any, + metricsColumns: any, + paramKeys: string[], + isRawData?: boolean, + ): { rows: IMetricTableRowData[] | any; sameValueColumns: string[] } { + if (!processedData) { + return { + rows: [], + sameValueColumns: [], + }; + } + + const metricsValueKey = + model.getState()?.config?.table.metricsValueKey || + MetricsValueKeyEnum.LAST; + const rows: any = processedData[0]?.config !== null ? {} : []; + let rowIndex = 0; + const sameValueColumns: string[] = []; + const columnsFlattenValues: { [key: string]: Set } = {}; + processedData.forEach((metricsCollection: any) => { + const groupKey = metricsCollection.key; + const columnsValues: { [key: string]: string[] } = {}; + if (metricsCollection.config !== null) { + const groupHeaderRow = { + meta: { + chartIndex: metricsCollection.chartIndex + 1, + }, + key: groupKey!, + color: metricsCollection.color, + dasharray: metricsCollection.dasharray, + experiment: '', + hash: '', + run: '', + metric: '', + context: [], + children: [], + }; + rows[groupKey!] = { + data: groupHeaderRow, + items: [], + }; + } + metricsCollection.data.forEach((metric: any) => { + const metricsRowValues = getMetricsInitialRowData(metricsColumns); + metric.run.traces.metric.forEach((trace: any) => { + const metricHash = getMetricHash(trace.name, trace.context); + metricsRowValues[metricHash] = formatValue( + trace.values[metricsValueKey], + ); + }); + + const rowValues: any = { + key: metric.key, + selectKey: `${metric.run.hash}/${metric.key}`, + hash: metric.run.hash, + index: rowIndex, + color: metricsCollection.color ?? metric.color, + dasharray: metricsCollection.dasharray ?? metric.dasharray, + experiment: metric.run.props.experiment?.name ?? 'default', + experiment_description: + metric.run.props.experiment?.description ?? '-', + experimentId: metric.run.props.experiment?.id ?? '', + run: metric.run.props.name, + description: metric.run.props?.description ?? '-', + date: moment(metric.run.props.creation_time * 1000).format( + TABLE_DATE_FORMAT, + ), + duration: processDurationTime( + metric.run.props.creation_time * 1000, + metric.run.props.end_time + ? metric.run.props.end_time * 1000 + : Date.now(), + ), + active: metric.run.props.active, + metric: metric.name, + tags: metric.run.props.tags.map((tag: any) => ({ + archived: false, + color: tag.color, + id: tag.id, + comment: tag.description, + name: tag.name, + run_count: 0, + })), + ...metricsRowValues, + }; + rowIndex++; + [ + 'experiment', + 'run', + 'hash', + 'date', + 'duration', + 'description', + 'metric', + 'context', + 'step', + 'epoch', + 'time', + ].forEach((key) => { + if (columnsValues.hasOwnProperty(key)) { + if (!_.some(columnsValues[key], rowValues[key])) { + columnsValues[key].push(rowValues[key]); + } + } else { + columnsValues[key] = [rowValues[key]]; + } + }); + paramKeys.forEach((paramKey) => { + const value = getValue(metric.run.params, paramKey, '-'); + rowValues[paramKey] = formatValue(value); + if (columnsValues.hasOwnProperty(paramKey)) { + if ( + _.findIndex(columnsValues[paramKey], (paramValue) => + _.isEqual(value, paramValue), + ) === -1 + ) { + columnsValues[paramKey].push(value); + } + } else { + columnsValues[paramKey] = [value]; + } + }); + if (metricsCollection.config !== null) { + rows[groupKey!].items.push( + isRawData + ? rowValues + : runsTableRowRenderer(rowValues, onModelRunsTagsChange), + ); + } else { + rows.push( + isRawData + ? rowValues + : runsTableRowRenderer(rowValues, onModelRunsTagsChange), + ); + } + }); + + for (let columnKey in columnsValues) { + columnsFlattenValues[columnKey] = new Set([ + ...(columnsFlattenValues[columnKey] || []), + ...(columnsValues[columnKey] || []), + ]); + + if (metricsCollection.config !== null) { + rows[groupKey!].data[columnKey] = + columnsValues[columnKey].length === 1 + ? columnsValues[columnKey][0] + : columnsValues[columnKey]; + } + + if (metricsCollection.config !== null && !isRawData) { + rows[groupKey!].data = runsTableRowRenderer( + rows[groupKey!].data, + onModelRunsTagsChange, + true, + Object.keys(columnsValues), + ); + } + } + }); + for (let columnKey in columnsFlattenValues) { + if (columnsFlattenValues[columnKey].size === 1) { + sameValueColumns.push(columnKey); + } + } + return { rows, sameValueColumns }; + } + + function onModelNotificationAdd(notification: N & INotification): void { + onNotificationAdd({ notification, model }); + } + + function getLastRunsData( + lastRow: any, + ): + | { call: (exception: any) => Promise; abort: () => void } + | undefined { + const modelData: Partial = model.getState(); + const infiniteIsPending = modelData?.infiniteIsPending; + const isLatest = modelData?.config.pagination.isLatest; + + if (!infiniteIsPending && !isLatest) { + const lastRowKey = modelData?.rawData[modelData?.rawData.length - 1].hash; + model.setState({ + config: { + ...modelData?.config, + pagination: { + ...modelData?.config.pagination, + offset: lastRowKey, + }, + }, + }); + + return getRunsData(false, false, false); + } + } + + function onExportTableData(): void { + // @TODO need to get data and params from state not from processData + const { data, params, metricsColumns } = processData( + model.getState()?.rawData, + ); + const tableData = getDataAsTableRows(data, metricsColumns, params, true); + const configData = model.getState()?.config; + const tableColumns: ITableColumn[] = getRunsTableColumns( + metricsColumns, + params, + configData?.table.columnsOrder!, + configData?.table.hiddenColumns!, + ); + const excludedFields: string[] = ['#', 'actions']; + const filteredHeader: string[] = tableColumns.reduce( + (acc: string[], column: ITableColumn) => + acc.concat( + excludedFields.indexOf(column.key) === -1 && !column.isHidden + ? column.key + : [], + ), + [], + ); + + let emptyRow: { [key: string]: string } = {}; + filteredHeader.forEach((column: string) => { + emptyRow[column] = '--'; + }); + + const groupedRows: IMetricTableRowData[][] = + data.length > 1 + ? Object.keys(tableData.rows).map( + (groupedRowKey: string) => tableData.rows[groupedRowKey].items, + ) + : [ + Array.isArray(tableData.rows) + ? tableData.rows + : tableData.rows[Object.keys(tableData.rows)[0]].items, + ]; + + const dataToExport: { [key: string]: string }[] = []; + + groupedRows?.forEach( + (groupedRow: IMetricTableRowData[], groupedRowIndex: number) => { + groupedRow?.forEach((row: IMetricTableRowData) => { + const filteredRow = getFilteredRow({ + columnKeys: filteredHeader, + row, + }); + dataToExport.push(filteredRow); + }); + if (groupedRows?.length - 1 !== groupedRowIndex) { + dataToExport.push(emptyRow); + } + }, + ); + const blob = new Blob([JsonToCSV(dataToExport)], { + type: 'text/csv;charset=utf-8;', + }); + saveAs(blob, `runs-${moment().format(DATE_EXPORTING_FORMAT)}.csv`); + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.exports.csv); + } + + function onModelNotificationDelete(id: number): void { + onNotificationDelete({ id, model }); + } + + function updateData(newData: any): void { + const { data, params, metricsColumns, selectedRows, unselectedRowsCount } = + processData(newData); + if (unselectedRowsCount) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'info', + closeDelay: 5000, + messages: [ + 'Live update: runs have been updated.', + `${unselectedRowsCount} of selected runs have been left out of the table.`, + ], + }, + model, + }); + } + + const modelState = model.getState() as IRunsAppModelState; + const tableData = getDataAsTableRows(data, metricsColumns, params); + const tableColumns = getRunsTableColumns( + metricsColumns, + params, + model.getState()?.config?.table.columnsOrder!, + model.getState()?.config?.table.hiddenColumns!, + ); + const lastRowKey = newData[newData.length - 1].hash; + model.setState({ + requestStatus: RequestStatusEnum.Ok, + data, + rowData: newData, + infiniteIsPending: false, + tableColumns, + tableData: tableData.rows, + selectedRows, + sameValueColumns: tableData.sameValueColumns, + config: { + ...modelState?.config, + pagination: { + ...modelState?.config.pagination, + offset: lastRowKey, + isLatest: false, + }, + }, + }); + + model.getState()?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + hiddenColumns: modelState?.config.table.hiddenColumns!, + }); + } + + function destroy(): void { + runsRequestRef.abort(); + liveUpdateInstance?.clear(); + liveUpdateInstance = null; //@TODO check is this need or not + model.setState({ + ...model.getState(), + selectFormData: { + ...model.getState().selectFormData, + error: null, + }, + }); + } + + function changeLiveUpdateConfig(config: { + enabled?: boolean; + delay?: number; + }): void { + const state = model.getState() as IRunsAppModelState; + const configData = state?.config; + const liveUpdateConfig = configData.liveUpdate; + + if (!liveUpdateConfig?.enabled && config.enabled) { + const query = configData?.select?.query || ''; + const rowDataLength = model.getState()?.tableData?.length || 0; + const limit = rowDataLength >= 45 ? rowDataLength : 45; + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + config?.delay || liveUpdateConfig?.delay, + ); + liveUpdateInstance.start({ + q: query, + limit, + }); + } else { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; + } + const newLiveUpdateConfig = { + ...liveUpdateConfig, + ...config, + }; + model.setState({ + config: { + ...configData, + liveUpdate: newLiveUpdateConfig, + }, + }); + + setItem('runsLUConfig', encode(newLiveUpdateConfig)); + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].liveUpdate} ${ + config.enabled ? 'on' : 'off' + }`, + ); + } + + function archiveRuns( + ids: string[], + archived: boolean, + ): { + call: () => Promise; + abort: () => void; + } { + runsArchiveRef = runsService.archiveRuns(ids, archived); + return { + call: async () => { + try { + await runsArchiveRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getRunsData(false, true).call((detail: any) => { + exceptionHandler({ detail, model }); + }); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [ + `Runs are successfully ${ + archived ? 'archived' : 'unarchived' + } `, + ], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.runs.table.archiveRunsBatch, + ); + } + }, + abort: runsArchiveRef.abort, + }; + } + + function deleteRuns(ids: string[]): { + call: () => Promise; + abort: () => void; + } { + runsDeleteRef = runsService.deleteRuns(ids); + return { + call: async () => { + try { + await runsDeleteRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getRunsData(false, true).call((detail: any) => { + exceptionHandler({ detail, model }); + }); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: ['Runs are successfully deleted'], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.deleteRunsBatch, + ); + } + }, + abort: runsDeleteRef.abort, + }; + } + + const methods = { + destroy, + initialize, + getRunsData, + abortRequest, + updateModelData, + getLastRunsData, + onExportTableData, + onNotificationDelete: onModelNotificationDelete, + setDefaultAppConfigData: setModelDefaultAppConfigData, + onRunsTagsChange: onModelRunsTagsChange, + changeLiveUpdateConfig, + archiveRuns, + deleteRuns, + }; + + if (grouping) { + Object.assign(methods, {}); + } + if (selectForm) { + Object.assign(methods, { + onSelectRunQueryChange(query: string): void { + onSelectRunQueryChange({ query, model }); + }, + }); + } + if (components?.charts?.[0]) { + Object.assign(methods, {}); + } + if (components?.table) { + Object.assign(methods, { + onMetricsValueKeyChange(metricsValueKey: MetricsValueKeyEnum): void { + onMetricsValueKeyChange({ + metricsValueKey, + model, + appName, + updateModelData, + }); + }, + onRowHeightChange(height: RowHeightSize): void { + onRowHeightChange({ height, model, appName }); + }, + onColumnsOrderChange(columnsOrder: any): void { + onColumnsOrderChange({ + columnsOrder, + model, + appName, + updateModelData, + }); + }, + onColumnsVisibilityChange(hiddenColumns: string[]): void { + onColumnsVisibilityChange({ + hiddenColumns, + model, + appName, + updateModelData, + }); + }, + onTableDiffShow(): void { + onTableDiffShow({ model, appName, updateModelData }); + }, + onSortReset(): void { + updateSortFields({ + sortFields: [], + model, + appName, + updateModelData, + }); + }, + updateColumnsWidths(key: string, width: number, isReset: boolean): void { + updateColumnsWidths({ + key, + width, + isReset, + model, + appName, + updateModelData, + }); + }, + onRowSelect({ + actionType, + data, + }: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + }): void { + return onRowSelect({ actionType, data, model }); + }, + onToggleColumnsColorScales(colKey: string): void { + onToggleColumnsColorScales({ + colKey, + model, + appName, + updateModelData, + }); + }, + }); + } + + return methods; +} + +export default getRunsModelMethods; diff --git a/src/src/services/models/explorer/scattersModelMethods.ts b/src/src/services/models/explorer/scattersModelMethods.ts new file mode 100644 index 00000000..575d9e8c --- /dev/null +++ b/src/src/services/models/explorer/scattersModelMethods.ts @@ -0,0 +1,1606 @@ +import moment from 'moment'; +import { saveAs } from 'file-saver'; +import _ from 'lodash-es'; + +import { IPoint } from 'components/ScatterPlot'; + +import COLORS from 'config/colors/colors'; +import DASH_ARRAYS from 'config/dash-arrays/dashArrays'; +import { MetricsValueKeyEnum, ResizeModeEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_EXPORTING_FORMAT, TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { getSuggestionsByExplorer } from 'config/monacoConfig/monacoConfig'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + getParamsTableColumns, + paramsTableRowRenderer, +} from 'pages/Params/components/ParamsTableGrid/ParamsTableGrid'; + +import * as analytics from 'services/analytics'; +import runsService from 'services/api/runs/runsService'; +import LiveUpdateService from 'services/live-update/examples/LiveUpdateBridge.example'; +import projectsService from 'services/api/projects/projectsService'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { + IGroupingSelectOption, + IMetricsCollection, + IMetricTableRowData, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; +import { IParamTrace, IRun } from 'types/services/models/metrics/runModel'; +import { IModel } from 'types/services/models/model'; +import { + IParam, + IParamsAppModelState, +} from 'types/services/models/params/paramsAppModel'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { IDimensionType } from 'types/utils/d3/drawParallelAxes'; +import { + IAppInitialConfig, + IAppModelConfig, + IAppModelState, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { IProjectParamsMetrics } from 'types/services/models/projects/projectsModel'; +import { + IScatterAppModelState, + ITrendlineOptions, +} from 'types/services/models/scatter/scatterAppModel'; +import { ITagInfo, ITagProps } from 'types/pages/tags/Tags'; + +import exceptionHandler from 'utils/app/exceptionHandler'; +import getChartTitleData from 'utils/app/getChartTitleData'; +import { getFilteredGroupingOptions } from 'utils/app/getFilteredGroupingOptions'; +import getFilteredRow from 'utils/app/getFilteredRow'; +import { getGroupingPersistIndex } from 'utils/app/getGroupingPersistIndex'; +import getGroupingSelectOptions from 'utils/app/getGroupingSelectOptions'; +import getRunData from 'utils/app/getRunData'; +import onChangeTooltip from 'utils/app/onChangeTooltip'; +import onColumnsOrderChange from 'utils/app/onColumnsOrderChange'; +import onColumnsVisibilityChange from 'utils/app/onColumnsVisibilityChange'; +import onGroupingApplyChange from 'utils/app/onGroupingApplyChange'; +import onGroupingModeChange from 'utils/app/onGroupingModeChange'; +import onGroupingPaletteChange from 'utils/app/onGroupingPaletteChange'; +import onGroupingPersistenceChange from 'utils/app/onGroupingPersistenceChange'; +import onGroupingReset from 'utils/app/onGroupingReset'; +import onGroupingSelectChange from 'utils/app/onGroupingSelectChange'; +import onSelectOptionsChange from 'utils/app/onSelectOptionsChange'; +import onParamVisibilityChange from 'utils/app/onParamsVisibilityChange'; +import onRowHeightChange from 'utils/app/onRowHeightChange'; +import onRowVisibilityChange from 'utils/app/onRowVisibilityChange'; +import onSelectRunQueryChange from 'utils/app/onSelectRunQueryChange'; +import onSortFieldsChange from 'utils/app/onSortFieldsChange'; +import { onTableDiffShow } from 'utils/app/onTableDiffShow'; +import { onTableResizeEnd } from 'utils/app/onTableResizeEnd'; +import onTableResizeModeChange from 'utils/app/onTableResizeModeChange'; +import onTableRowClick from 'utils/app/onTableRowClick'; +import onTableRowHover from 'utils/app/onTableRowHover'; +import onTableSortChange from 'utils/app/onTableSortChange'; +import updateColumnsWidths from 'utils/app/updateColumnsWidths'; +import updateSortFields from 'utils/app/updateTableSortFields'; +import contextToString from 'utils/contextToString'; +import { ChartTypeEnum, ScaleEnum } from 'utils/d3'; +import { formatValue } from 'utils/formatValue'; +import getObjectPaths from 'utils/getObjectPaths'; +import JsonToCSV from 'utils/JsonToCSV'; +import { setItem } from 'utils/storage'; +import { encode } from 'utils/encoder/encoder'; +import onBookmarkCreate from 'utils/app/onBookmarkCreate'; +import onBookmarkUpdate from 'utils/app/onBookmarkUpdate'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import onResetConfigData from 'utils/app/onResetConfigData'; +import onShuffleChange from 'utils/app/onShuffleChange'; +import updateURL from 'utils/app/updateURL'; +import getValueByField from 'utils/getValueByField'; +import getTooltipContent from 'utils/getTooltipContent'; +import { getValue } from 'utils/helper'; +import onRowSelect from 'utils/app/onRowSelect'; +import { SortField } from 'utils/getSortedFields'; +import onChangeTrendlineOptions from 'utils/app/onChangeTrendlineOptions'; +import onRunsTagsChange from 'utils/app/onRunsTagsChange'; +import setRequestProgress from 'utils/app/setRequestProgress'; +import { minMaxOfArray } from 'utils/minMaxOfArray'; +import { processDurationTime } from 'utils/processDurationTime'; +import getSelectOptions from 'utils/app/getSelectOptions'; +import { getMetricsSelectOptions } from 'utils/app/getMetricsSelectOptions'; +import onRowsVisibilityChange from 'utils/app/onRowsVisibilityChange'; +import { getMetricsInitialRowData } from 'utils/app/getMetricsInitialRowData'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import { getMetricLabel } from 'utils/app/getMetricLabel'; + +import { InitialAppModelType } from './config'; + +import { AppNameEnum } from './index'; + +// ************ Scatters App Model Methods + +function getScattersModelMethods( + initialApp: InitialAppModelType, + appConfig: IAppInitialConfig, +) { + const { appName, grouping, components, selectForm } = appConfig; + const { + model, + getModelAppConfigData, + setModelDefaultAppConfigData, + getConfig, + } = initialApp; + + let runsRequestRef: { + call: ( + exceptionHandler: (detail: any) => void, + ) => Promise[]>>; + abort: () => void; + }; + let runsArchiveRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let runsDeleteRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; + }; + let liveUpdateInstance: LiveUpdateService | null; + + function initialize(appId: string): void { + model.init(); + const state: Partial = {}; + if (grouping) { + state.groupingSelectOptions = []; + } + if (components?.table) { + state.refs = { + ...state.refs, + tableRef: { current: null }, + }; + } + if (components?.charts?.[0]) { + state.refs = { + ...state.refs, + chartPanelRef: { current: null }, + }; + } + model.setState({ ...state }); + if (!appId) { + setModelDefaultAppConfigData(); + } + const liveUpdateState = model.getState()?.config?.liveUpdate; + + projectsService + .getProjectParams(['metric']) + .call() + .then((data: IProjectParamsMetrics) => { + model.setState({ + selectFormData: { + options: getSelectOptions(data), + suggestions: getSuggestionsByExplorer(appName, data), + }, + }); + }); + + if (liveUpdateState?.enabled) { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + liveUpdateState.delay, + ); + } + } + + function updateData(newData: IRun[]): void { + const configData = model.getState()?.config; + if (configData) { + setModelData(newData, configData); + } + } + + function setModelData( + rawData: IRun[], + configData: IAppModelConfig, + ): void { + const { + data, + runProps, + highLevelParams, + params, + metricsColumns, + selectedRows, + } = processData(rawData); + const modelState: IAppModelState = model.getState(); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + runProps, + }), + ]; + const metricsSelectOptions = getMetricsSelectOptions(metricsColumns, model); + const sortOptions = [...groupingSelectOptions, ...metricsSelectOptions]; + + const tableData = getDataAsTableRows( + data, + metricsColumns, + params, + false, + configData, + groupingSelectOptions, + ); + const sortFields = modelState?.config?.table.sortFields; + + const tableColumns = getParamsTableColumns( + sortOptions, + metricsColumns, + params, + data[0]?.config, + configData.table?.columnsOrder!, + configData.table?.hiddenColumns!, + configData.table?.metricsValueKey, + sortFields, + onSortChange, + configData.grouping as any, + onModelGroupingSelectChange, + AppNameEnum.SCATTERS, + ); + + modelState?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + }); + + model.setState({ + requestStatus: RequestStatusEnum.Ok, + data, + chartData: getChartData(data), + chartTitleData: getChartTitleData({ + processedData: data, + groupingSelectOptions, + model: model as IModel, + }), + selectFormData: { ...modelState.selectFormData, error: null }, + params, + metricsColumns, + rawData, + config: configData, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + groupingSelectOptions, + sortOptions, + selectedRows, + }); + } + + function getChartData( + processedData: IMetricsCollection[], + configData = model.getState()?.config, + ): { + dimensions: IDimensionType[]; + data: IPoint[]; + }[] { + if (!processedData || _.isEmpty(configData.select.options)) { + return []; + } + const dimensionsByChartIndex: { + values: number[] | string[]; + scaleType: ScaleEnum; + displayName: string; + dimensionType: string; + }[][] = []; + + const chartData = processedData.map( + ({ chartIndex, color, data }: IMetricsCollection) => { + if (!dimensionsByChartIndex[chartIndex]) { + dimensionsByChartIndex[chartIndex] = []; + } + const dimension: any = dimensionsByChartIndex[chartIndex]; + return data + .filter((run) => !run.isHidden) + .map((run: IParam) => { + const values: any = []; + configData.select.options.forEach( + ({ type, label, value }: ISelectOption, i: number) => { + if (!dimension[i]) { + dimension[i] = { + values: [], + scaleType: ScaleEnum.Linear, + displayName: label, + dimensionType: 'param', + }; + } + if (type === 'metrics') { + run.run.traces.metric.forEach((trace: IParamTrace) => { + if ( + trace.name === value?.option_name && + _.isEqual(trace.context, value?.context) + ) { + let lastValue = trace.values.last; + const formattedLastValue = formatValue(lastValue, '-'); + values[i] = lastValue; + if (formattedLastValue !== '-') { + const metricLabel = getMetricLabel( + trace.name, + trace.context as any, + ); + dimension[i].dimensionType = 'metric'; + dimension[i].displayName = metricLabel; + if (typeof lastValue !== 'number') { + dimension[i].scaleType = ScaleEnum.Point; + values[i] = formattedLastValue; + } else if (isNaN(lastValue) || !isFinite(lastValue)) { + values[i] = formattedLastValue; + dimension[i].scaleType = ScaleEnum.Point; + } + dimension[i].values.push(values[i]); + } + } + }); + } else { + const paramValue = getValue(run.run.params, label, '-'); + const formattedParam = formatValue(paramValue, '-'); + values[i] = paramValue; + if (formattedParam !== '-') { + if (typeof paramValue !== 'number') { + dimension[i].scaleType = ScaleEnum.Point; + values[i] = formattedParam; + } else if (isNaN(paramValue) || !isFinite(paramValue)) { + values[i] = formattedParam; + dimension[i].scaleType = ScaleEnum.Point; + } + dimension[i].values.push(values[i]); + } + } + }, + ); + + return { + chartIndex, + key: run.key, + groupKey: run.key, + color: color ?? run.color, + data: { + yValues: [values[0] ?? '-'], + xValues: [values[1] ?? '-'], + }, + }; + }); + }, + ); + const flattedData = chartData.flat(); + const groupedByChartIndex = Object.values( + _.groupBy(flattedData, 'chartIndex'), + ); + + return dimensionsByChartIndex + .filter((dimension) => !_.isEmpty(dimension)) + .map((chartDimensions, i: number) => { + const dimensions: IDimensionType[] = []; + chartDimensions.forEach((dimension) => { + if (dimension.scaleType === ScaleEnum.Linear) { + const [minDomain = '-', maxDomain = '-'] = minMaxOfArray([ + ...((dimension.values as number[]) || []), + ]); + + dimensions.push({ + scaleType: dimension.scaleType, + domainData: [minDomain, maxDomain] as string[] | number[], + displayName: dimension.displayName, + dimensionType: dimension.dimensionType, + }); + } else { + const numDomain: number[] = []; + const strDomain: string[] = []; + + [...dimension.values].forEach((data) => { + if (typeof data === 'number') { + numDomain.push(data); + } else { + strDomain.push(data); + } + }); + + // sort domain data + numDomain.sort((a, b) => a - b); + strDomain.sort(); + + dimensions.push({ + scaleType: dimension.scaleType, + domainData: numDomain.concat(strDomain as any[]), + displayName: dimension.displayName, + dimensionType: dimension.dimensionType, + }); + } + }); + return { + dimensions, + data: groupedByChartIndex[i], + }; + }); + } + + function getDataAsTableRows( + processedData: IMetricsCollection[], + metricsColumns: any, + paramKeys: string[], + isRowData: boolean, + config: IAppModelConfig, + groupingSelectOptions: IGroupingSelectOption[], + ): { rows: IMetricTableRowData[] | any; sameValueColumns: string[] } { + if (!processedData) { + return { + rows: [], + sameValueColumns: [], + }; + } + + const rows: IMetricTableRowData[] | any = + processedData[0]?.config !== null ? {} : []; + + let rowIndex = 0; + const sameValueColumns: string[] = []; + const columnsFlattenValues: { [key: string]: Set } = {}; + + processedData.forEach((metricsCollection: IMetricsCollection) => { + const groupKey = metricsCollection.key; + const columnsValues: { [key: string]: string[] } = {}; + + if (metricsCollection.config !== null) { + const groupConfigData: { [key: string]: unknown } = {}; + for (let key in metricsCollection.config) { + groupConfigData[getValueByField(groupingSelectOptions, key)] = + metricsCollection.config[key]; + } + const groupHeaderRow = { + meta: { + chartIndex: config?.grouping?.chart?.length + ? metricsCollection.chartIndex + 1 + : null, + //ToDo reverse mode + // config.grouping?.reverseMode?.chart + // ? metricsCollection.chartIndex + 1 + // : null, + color: metricsCollection.color, + dasharray: metricsCollection.dasharray, + itemsCount: metricsCollection.data.length, + config: groupConfigData, + }, + key: groupKey!, + groupRowsKeys: metricsCollection.data.map((metric) => metric.key), + color: metricsCollection.color, + hash: '', + dasharray: metricsCollection.dasharray, + experiment: '', + run: '', + date: '', + description: '', + metric: '', + context: [], + children: [], + groups: groupConfigData, + }; + + rows[groupKey!] = { + data: groupHeaderRow, + items: [], + }; + } + + metricsCollection.data.forEach((metric: any) => { + const metricsRowValues = getMetricsInitialRowData(metricsColumns); + metric.run.traces.metric.forEach((trace: any) => { + const metricHash = getMetricHash(trace.name, trace.context as any); + metricsRowValues[metricHash] = formatValue(trace.values.last); + }); + const rowValues: any = { + rowMeta: { + color: metricsCollection.color ?? metric.color, + }, + key: metric.key, + selectKey: `${metric.run.hash}/${metric.key}`, + hash: metric.run.hash, + isHidden: metric.isHidden, + index: rowIndex, + color: metricsCollection.color ?? metric.color, + dasharray: metricsCollection.dasharray ?? metric.dasharray, + experiment: metric.run.props.experiment?.name ?? 'default', + experimentId: metric.run.props.experiment?.id ?? '', + experiment_description: + metric.run.props.experiment?.description ?? '-', + run: metric.run.props?.name ?? '-', + description: metric.run.props?.description ?? '-', + date: moment(metric.run.props.creation_time * 1000).format( + TABLE_DATE_FORMAT, + ), + tags: metric.run.props.tags.map((tag: ITagProps) => ({ + archived: false, + color: tag.color, + id: tag.id, + comment: tag.description, + name: tag.name, + run_count: 0, + })), + metric: metric.name, + duration: processDurationTime( + metric.run.props.creation_time * 1000, + metric.run.props.end_time + ? metric.run.props.end_time * 1000 + : Date.now(), + ), + active: metric.run.props.active, + ...metricsRowValues, + }; + rowIndex++; + + for (let key in metricsRowValues) { + columnsValues[key] = ['-']; + } + + [ + 'experiment', + 'run', + 'hash', + 'metric', + 'context', + 'date', + 'duration', + 'description', + 'step', + 'epoch', + 'time', + ].forEach((key) => { + if (columnsValues.hasOwnProperty(key)) { + if (!_.some(columnsValues[key], rowValues[key])) { + columnsValues[key].push(rowValues[key]); + } + } else { + columnsValues[key] = [rowValues[key]]; + } + }); + + paramKeys.forEach((paramKey) => { + const value = getValue(metric.run.params, paramKey, '-'); + rowValues[paramKey] = formatValue(value); + if (columnsValues.hasOwnProperty(paramKey)) { + if ( + _.findIndex(columnsValues[paramKey], (paramValue) => + _.isEqual(value, paramValue), + ) === -1 + ) { + columnsValues[paramKey].push(value); + } + } else { + columnsValues[paramKey] = [value]; + } + }); + + if (metricsCollection.config !== null) { + rows[groupKey!].items.push( + isRowData + ? rowValues + : paramsTableRowRenderer(rowValues, onModelRunsTagsChange, { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange({ + metricKey: rowValues.key, + model, + appName, + updateModelData, + }); + }, + }), + ); + } else { + rows.push( + isRowData + ? rowValues + : paramsTableRowRenderer(rowValues, onModelRunsTagsChange, { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange({ + metricKey: rowValues.key, + model, + appName, + updateModelData, + }); + }, + }), + ); + } + }); + + for (let columnKey in columnsValues) { + columnsFlattenValues[columnKey] = new Set([ + ...(columnsFlattenValues[columnKey] || []), + ...(columnsValues[columnKey] || []), + ]); + + if (metricsCollection.config !== null) { + rows[groupKey!].data[columnKey] = + columnsValues[columnKey].length === 1 + ? paramKeys.includes(columnKey) + ? formatValue(columnsValues[columnKey][0]) + : columnsValues[columnKey][0] + : columnsValues[columnKey]; + } + } + + if (metricsCollection.config !== null && !isRowData) { + rows[groupKey!].data = paramsTableRowRenderer( + rows[groupKey!].data, + onModelRunsTagsChange, + {}, + true, + ['groups'].concat(Object.keys(columnsValues)), + ); + } + }); + for (let columnKey in columnsFlattenValues) { + if (columnsFlattenValues[columnKey].size === 1) { + sameValueColumns.push(columnKey); + } + } + return { rows, sameValueColumns }; + } + + function processData(data: IRun[]): { + data: IMetricsCollection[]; + params: string[]; + highLevelParams: string[]; + runProps: string[]; + metricsColumns: any; + selectedRows: any; + } { + const configData = model.getState()?.config; + let selectedRows = model.getState()?.selectedRows; + const grouping = configData?.grouping; + let runs: IParam[] = []; + let params: string[] = []; + let runProps: string[] = []; + let highLevelParams: string[] = []; + const paletteIndex: number = grouping?.paletteIndex || 0; + const metricsColumns: any = {}; + + data?.forEach((run: IRun, index) => { + params = params.concat(getObjectPaths(run.params, run.params)); + runProps = runProps.concat(getObjectPaths(run.props, run.props)); + highLevelParams = highLevelParams.concat( + getObjectPaths(run.params, run.params, '', false, true), + ); + const metricsValues: Record< + string, + Record + > = {}; + + run.traces.metric.forEach((trace) => { + metricsColumns[trace.name] = { + ...metricsColumns[trace.name], + [contextToString(trace.context) as string]: '-', + }; + const metricHash = getMetricHash(trace.name, trace.context as any); + metricsValues[metricHash] = { + min: trace.values.min, + max: trace.values.max, + last: trace.values.last, + first: trace.values.first, + }; + }); + const paramKey = encode({ runHash: run.hash }); + runs.push({ + run, + isHidden: configData!.table.hiddenMetrics!.includes(paramKey), + color: COLORS[paletteIndex][index % COLORS[paletteIndex].length], + key: paramKey, + metricsValues, + dasharray: DASH_ARRAYS[0], + }); + }); + + let sortFields = configData?.table?.sortFields ?? []; + + if (sortFields?.length === 0) { + sortFields = [ + { + value: 'run.props.creation_time', + order: 'desc', + label: '', + group: '', + }, + ]; + } + + const processedData = groupData( + _.orderBy( + runs, + sortFields?.map( + (f: SortField) => + function (run: IParam) { + return getValue(run, f.value, ''); + }, + ), + sortFields?.map((f: SortField) => f.order), + ), + ); + + const uniqProps = _.uniq(runProps).sort(); + const uniqParams = _.uniq(params).sort(); + const uniqHighLevelParams = _.uniq(highLevelParams).sort(); + + const mappedData: Record = {}; + + for (let run of runs) { + mappedData[run.run.hash] = { + runHash: run.run.hash, + ...run.run.props, + ...run, + }; + } + + let selected: Record = {}; + + if (selectedRows && !_.isEmpty(selectedRows)) { + for (let rowKey in selectedRows) { + const slicedKey = rowKey.slice(0, rowKey.indexOf('/')); + if (mappedData[slicedKey]) + selected[rowKey] = { + selectKey: rowKey, + ...mappedData[slicedKey], + }; + } + } + + return { + data: processedData, + params: uniqParams, + highLevelParams: uniqHighLevelParams, + runProps: uniqProps, + metricsColumns, + selectedRows, + }; + } + + function groupData(data: IParam[]): IMetricsCollection[] { + const grouping = model.getState()!.config!.grouping; + const { paletteIndex } = grouping; + const groupByColor = getFilteredGroupingOptions({ + groupName: GroupNameEnum.COLOR, + model, + }); + const groupByStroke = getFilteredGroupingOptions({ + groupName: GroupNameEnum.STROKE, + model, + }); + const groupByChart = getFilteredGroupingOptions({ + groupName: GroupNameEnum.CHART, + model, + }); + if ( + groupByColor.length === 0 && + groupByStroke.length === 0 && + groupByChart.length === 0 + ) { + return [ + { + config: null, + color: null, + dasharray: null, + chartIndex: 0, + data, + }, + ]; + } + + const groupValues: { + [key: string]: IMetricsCollection | any; + } = {}; + + const groupingFields = _.uniq( + groupByColor.concat(groupByStroke).concat(groupByChart), + ); + + for (let i = 0; i < data.length; i++) { + const groupValue: { [key: string]: unknown } = {}; + groupingFields.forEach((field) => { + groupValue[field] = getValue(data[i], field); + }); + const groupKey = encode(groupValue); + if (groupValues.hasOwnProperty(groupKey)) { + groupValues[groupKey].data.push(data[i]); + } else { + groupValues[groupKey] = { + key: groupKey, + config: groupValue, + color: null, + dasharray: null, + chartIndex: 0, + data: [data[i]], + }; + } + } + + let colorIndex = 0; + let dasharrayIndex = 0; + let chartIndex = 0; + + const colorConfigsMap: { [key: string]: number } = {}; + const dasharrayConfigsMap: { [key: string]: number } = {}; + const chartIndexConfigsMap: { [key: string]: number } = {}; + + for (let groupKey in groupValues) { + const groupValue = groupValues[groupKey]; + + if (groupByColor.length > 0) { + const colorConfig = _.pick(groupValue.config, groupByColor); + const colorKey = encode(colorConfig); + + if (grouping.persistence.color && grouping.isApplied.color) { + let index = getGroupingPersistIndex({ + groupConfig: colorConfig, + grouping, + groupName: 'color', + }); + groupValue.color = + COLORS[paletteIndex][ + Number(index % BigInt(COLORS[paletteIndex].length)) + ]; + } else if (colorConfigsMap.hasOwnProperty(colorKey)) { + groupValue.color = + COLORS[paletteIndex][ + colorConfigsMap[colorKey] % COLORS[paletteIndex].length + ]; + } else { + colorConfigsMap[colorKey] = colorIndex; + groupValue.color = + COLORS[paletteIndex][colorIndex % COLORS[paletteIndex].length]; + colorIndex++; + } + } + + if (groupByStroke.length > 0) { + const dasharrayConfig = _.pick(groupValue.config, groupByStroke); + const dasharrayKey = encode(dasharrayConfig); + if (grouping.persistence.stroke && grouping.isApplied.stroke) { + let index = getGroupingPersistIndex({ + groupConfig: dasharrayConfig, + grouping, + groupName: 'stroke', + }); + groupValue.dasharray = + DASH_ARRAYS[Number(index % BigInt(DASH_ARRAYS.length))]; + } else if (dasharrayConfigsMap.hasOwnProperty(dasharrayKey)) { + groupValue.dasharray = + DASH_ARRAYS[dasharrayConfigsMap[dasharrayKey] % DASH_ARRAYS.length]; + } else { + dasharrayConfigsMap[dasharrayKey] = dasharrayIndex; + groupValue.dasharray = + DASH_ARRAYS[dasharrayIndex % DASH_ARRAYS.length]; + dasharrayIndex++; + } + } + + if (groupByChart.length > 0) { + const chartIndexConfig = _.pick(groupValue.config, groupByChart); + const chartIndexKey = encode(chartIndexConfig); + if (chartIndexConfigsMap.hasOwnProperty(chartIndexKey)) { + groupValue.chartIndex = chartIndexConfigsMap[chartIndexKey]; + } else { + chartIndexConfigsMap[chartIndexKey] = chartIndex; + groupValue.chartIndex = chartIndex; + chartIndex++; + } + } + } + return Object.values(groupValues); + } + + function updateModelData( + configData = model.getState()!.config!, + shouldURLUpdate?: boolean, + ): void { + const { + data, + params, + runProps, + highLevelParams, + metricsColumns, + selectedRows, + } = processData(model.getState()?.rawData as IRun[]); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + runProps, + }), + ]; + const metricsSelectOptions = getMetricsSelectOptions(metricsColumns, model); + const sortOptions = [...groupingSelectOptions, ...metricsSelectOptions]; + + const tableData = getDataAsTableRows( + data, + metricsColumns, + params, + false, + configData, + groupingSelectOptions, + ); + const tableColumns = getParamsTableColumns( + sortOptions, + metricsColumns, + params, + data[0]?.config, + configData.table?.columnsOrder!, + configData.table?.hiddenColumns!, + configData.table?.metricsValueKey, + configData.table?.sortFields, + onSortChange, + configData.grouping as any, + onModelGroupingSelectChange, + AppNameEnum.SCATTERS, + ); + + model.getState()?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + hiddenColumns: configData.table?.hiddenColumns!, + }); + + if (shouldURLUpdate) { + updateURL({ configData, appName }); + } + + model.setState({ + config: configData, + data, + chartData: getChartData(data), + chartTitleData: getChartTitleData({ + processedData: data, + groupingSelectOptions, + model: model as IModel, + }), + groupingSelectOptions, + sortOptions, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + selectedRows, + }); + } + + function abortRequest(): void { + if (runsRequestRef) { + runsRequestRef.abort(); + } + setRequestProgress(model); + model.setState({ + requestStatus: RequestStatusEnum.Ok, + }); + onModelNotificationAdd({ + id: Date.now(), + severity: 'info', + messages: ['Request has been cancelled'], + }); + } + + function getScattersData( + shouldUrlUpdate?: boolean, + shouldResetSelectedRows?: boolean, + ): { + call: () => Promise; + abort: () => void; + } { + if (runsRequestRef) { + runsRequestRef.abort(); + } + const configData = { ...model.getState()?.config }; + + runsRequestRef = runsService.getRunsData(configData?.select?.query); + setRequestProgress(model); + return { + call: async () => { + if (_.isEmpty(configData?.select?.options)) { + resetModelState(configData, shouldResetSelectedRows!); + } else { + model.setState({ + requestStatus: RequestStatusEnum.Pending, + queryIsEmpty: false, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + }); + liveUpdateInstance?.stop().then(); + try { + const stream = await runsRequestRef.call((detail) => { + exceptionHandler({ detail, model }); + resetModelState(configData, shouldResetSelectedRows!); + }); + const runData = await getRunData(stream, (progress) => + setRequestProgress(model, progress), + ); + updateData(runData); + if (shouldUrlUpdate) { + updateURL({ configData, appName }); + } + liveUpdateInstance?.start({ + q: configData?.select?.query, + }); + //Changed the layout/styles of the experiments and tags tables to look more like lists|| Extend the contributions section (add activity feed under the contributions) + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + messages: [ex.message], + id: Date.now(), + severity: 'error', + }, + model, + }); + } + } + } + }, + abort: runsRequestRef.abort, + }; + } + + function resetModelState( + configData: any, + shouldResetSelectedRows: boolean, + ): void { + let state: Partial = {}; + if (components?.charts?.indexOf(ChartTypeEnum.ScatterPlot) !== -1) { + state.chartData = []; + } + if (components.table) { + state.tableData = []; + state.config = { + ...configData, + table: { + ...configData?.table, + resizeMode: ResizeModeEnum.Resizable, + }, + }; + } + model.setState({ + queryIsEmpty: true, + rawData: [], + tableColumns: [], + selectFormData: { + ...model.getState().selectFormData, + error: null, + }, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + ...state, + }); + } + + function onExportTableData(): void { + const { data, params, config, metricsColumns, groupingSelectOptions } = + model.getState() as IParamsAppModelState; + const tableData = getDataAsTableRows( + data, + metricsColumns, + params, + true, + config, + groupingSelectOptions, + ); + const metricsSelectOptions = getMetricsSelectOptions(metricsColumns, model); + const sortOptions = [...groupingSelectOptions, ...metricsSelectOptions]; + + const tableColumns: ITableColumn[] = getParamsTableColumns( + sortOptions, + metricsColumns, + params, + data[0]?.config, + config.table?.columnsOrder!, + config.table?.hiddenColumns!, + config.table?.metricsValueKey, + config.table?.sortFields, + onSortChange, + config.grouping as any, + onModelGroupingSelectChange, + AppNameEnum.SCATTERS, + ); + + const excludedFields: string[] = ['#', 'actions']; + const filteredHeader: string[] = tableColumns.reduce( + (acc: string[], column: ITableColumn) => + acc.concat( + excludedFields.indexOf(column.key) === -1 && !column.isHidden + ? column.key + : [], + ), + [], + ); + + let emptyRow: { [key: string]: string } = {}; + filteredHeader.forEach((column: string) => { + emptyRow[column] = '--'; + }); + + const groupedRows: IMetricTableRowData[][] = + data.length > 1 + ? Object.keys(tableData.rows).map( + (groupedRowKey: string) => tableData.rows[groupedRowKey].items, + ) + : [ + Array.isArray(tableData.rows) + ? tableData.rows + : tableData.rows[Object.keys(tableData.rows)[0]].items, + ]; + + const dataToExport: { [key: string]: string }[] = []; + + groupedRows?.forEach( + (groupedRow: IMetricTableRowData[], groupedRowIndex: number) => { + groupedRow?.forEach((row: IMetricTableRowData) => { + const filteredRow = getFilteredRow({ + columnKeys: filteredHeader, + row, + }); + dataToExport.push(filteredRow); + }); + if (groupedRows?.length - 1 !== groupedRowIndex) { + dataToExport.push(emptyRow); + } + }, + ); + const blob = new Blob([JsonToCSV(dataToExport)], { + type: 'text/csv;charset=utf-8;', + }); + saveAs(blob, `${appName}-${moment().format(DATE_EXPORTING_FORMAT)}.csv`); + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.exports.csv); + } + + function onActivePointChange( + activePoint: IActivePoint, + focusedStateActive: boolean = false, + ): void { + const { data, refs, config, groupingSelectOptions } = model.getState(); + if (config.table.resizeMode !== ResizeModeEnum.Hide) { + const tableRef: any = refs?.tableRef; + if (tableRef) { + if (focusedStateActive) { + tableRef.current?.scrollToRow?.(activePoint.key); + tableRef.current?.setActiveRow?.( + focusedStateActive ? activePoint.key : null, + ); + } else { + tableRef.current?.setHoveredRow?.(activePoint.key); + } + } + } + let configData = config; + if (configData?.chart) { + // TODO remove this later + // remove unnecessary content prop from tooltip config + if (configData.chart.tooltip?.hasOwnProperty('content')) { + delete configData.chart.tooltip.content; + } + + configData = { + ...configData, + chart: { + ...configData.chart, + focusedState: { + active: focusedStateActive, + key: activePoint.key, + xValue: activePoint.xValue, + yValue: activePoint.yValue, + chartIndex: activePoint.chartIndex, + }, + }, + }; + + if ( + config.chart.focusedState.active !== focusedStateActive || + (config.chart.focusedState.active && + (activePoint.key !== config.chart.focusedState.key || + activePoint.xValue !== config.chart.focusedState.xValue)) + ) { + updateURL({ configData, appName }); + } + } + + const tooltipData = { + ...configData?.chart?.tooltip, + content: getTooltipContent({ + groupingNames: [GroupNameEnum.COLOR, GroupNameEnum.CHART], + groupingSelectOptions, + data, + configData, + activePointKey: configData.chart?.focusedState?.key, + selectedFields: configData.chart?.tooltip?.selectedFields, + }), + }; + model.setState({ config: configData, tooltip: tooltipData }); + } + + function onModelRunsTagsChange(runHash: string, tags: ITagInfo[]): void { + onRunsTagsChange({ runHash, tags, model, updateModelData }); + } + + function onModelGroupingSelectChange({ + groupName, + list, + }: IOnGroupingSelectChangeParams): void { + onGroupingSelectChange({ + groupName, + list, + model, + appName, + updateModelData, + }); + } + + function onSortChange({ + sortFields, + order, + index, + actionType, + field, + }: any): void { + onTableSortChange({ + sortFields, + order, + index, + field, + actionType, + model, + appName, + updateModelData, + }); + } + + function onModelBookmarkCreate({ + name, + description, + }: { + name: string; + description: string; + }): Promise { + return onBookmarkCreate({ name, description, model, appName }); + } + + function onModelBookmarkUpdate(id: string): void { + onBookmarkUpdate({ id, model, appName }); + } + + function onModelNotificationDelete(id: number): void { + onNotificationDelete({ id, model }); + } + + function onModelNotificationAdd(notification: N & INotification): void { + onNotificationAdd({ notification, model }); + } + + function onModelResetConfigData(): void { + onResetConfigData({ model, getConfig, updateModelData }); + } + + function changeLiveUpdateConfig(config: { + enabled?: boolean; + delay?: number; + }): void { + const state = model.getState(); + const configData = state?.config; + const query = configData.select?.query; + const liveUpdateConfig = configData.liveUpdate; + if (!liveUpdateConfig?.enabled && config.enabled && query !== '()') { + liveUpdateInstance = new LiveUpdateService( + appName, + updateData, + config?.delay || liveUpdateConfig?.delay, + ); + liveUpdateInstance?.start({ + q: query, + }); + } else { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; + } + + const newLiveUpdateConfig = { + ...liveUpdateConfig, + ...config, + }; + model.setState({ + config: { + ...configData, + liveUpdate: newLiveUpdateConfig, + }, + }); + + setItem('scattersLUConfig', encode(newLiveUpdateConfig)); + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].liveUpdate} ${ + config.enabled ? 'on' : 'off' + }`, + ); + } + + function destroy(): void { + liveUpdateInstance?.clear(); + liveUpdateInstance = null; //@TODO check is this need or not + } + + function archiveRuns( + ids: string[], + archived: boolean, + ): { + call: () => Promise; + abort: () => void; + } { + runsArchiveRef = runsService.archiveRuns(ids, archived); + return { + call: async () => { + try { + await runsArchiveRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getScattersData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [ + `Runs are successfully ${ + archived ? 'archived' : 'unarchived' + } `, + ], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.archiveRunsBatch, + ); + } + }, + abort: runsArchiveRef.abort, + }; + } + + function deleteRuns(ids: string[]): { + call: () => Promise; + abort: () => void; + } { + runsDeleteRef = runsService.deleteRuns(ids); + return { + call: async () => { + try { + await runsDeleteRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getScattersData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: ['Runs are successfully deleted'], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS[appName].table.deleteRunsBatch, + ); + } + }, + abort: runsDeleteRef.abort, + }; + } + + const methods = { + initialize, + getAppConfigData: getModelAppConfigData, + getScattersData, + abortRequest, + setDefaultAppConfigData: setModelDefaultAppConfigData, + updateModelData, + onActivePointChange, + onExportTableData, + onBookmarkCreate: onModelBookmarkCreate, + onBookmarkUpdate: onModelBookmarkUpdate, + onNotificationAdd: onModelNotificationAdd, + onNotificationDelete: onModelNotificationDelete, + onResetConfigData: onModelResetConfigData, + onRunsTagsChange: onModelRunsTagsChange, + onSortChange, + destroy, + changeLiveUpdateConfig, + archiveRuns, + deleteRuns, + }; + + if (grouping) { + Object.assign(methods, { + onGroupingSelectChange: onModelGroupingSelectChange, + onGroupingModeChange({ + groupName, + value, + }: IOnGroupingModeChangeParams): void { + onGroupingModeChange({ + groupName, + value, + model, + appName, + updateModelData, + }); + }, + onGroupingPaletteChange(index: number): void { + onGroupingPaletteChange({ index, model, appName, updateModelData }); + }, + onGroupingReset(groupName: GroupNameEnum): void { + onGroupingReset({ groupName, model, appName, updateModelData }); + }, + onGroupingApplyChange(groupName: GroupNameEnum): void { + onGroupingApplyChange({ + groupName, + model, + appName, + updateModelData, + }); + }, + onGroupingPersistenceChange(groupName: GroupNameEnum): void { + onGroupingPersistenceChange({ + groupName, + model, + appName, + updateModelData, + }); + }, + onShuffleChange(name: 'color' | 'stroke'): void { + onShuffleChange({ name, model, updateModelData }); + }, + }); + } + if (selectForm) { + Object.assign(methods, { + onSelectOptionsChange(data: D & Partial): void { + onSelectOptionsChange({ data, model }); + }, + onSelectRunQueryChange(query: string): void { + onSelectRunQueryChange({ query, model }); + }, + }); + } + if (components?.charts?.[0]) { + Object.assign(methods, { + onChangeTooltip(tooltip: Partial): void { + onChangeTooltip({ + tooltip, + groupingNames: [GroupNameEnum.COLOR, GroupNameEnum.CHART], + model, + appName, + }); + }, + onChangeTrendlineOptions( + trendlineOptions: Partial, + ): void { + onChangeTrendlineOptions({ trendlineOptions, model, appName }); + }, + }); + } + if (components?.table) { + Object.assign(methods, { + onRowHeightChange(height: RowHeightSize): void { + onRowHeightChange({ height, model, appName }); + }, + onTableRowHover(rowKey?: string): void { + onTableRowHover({ rowKey, model }); + }, + onTableRowClick(rowKey?: string): void { + onTableRowClick({ rowKey, model }); + }, + onSortFieldsChange(sortFields: [string, any][]): void { + onSortFieldsChange({ sortFields, model, appName, updateModelData }); + }, + onColumnsOrderChange(columnsOrder: any): void { + onColumnsOrderChange({ + columnsOrder, + model, + appName, + updateModelData, + }); + }, + onColumnsVisibilityChange(hiddenColumns: string[]): void { + onColumnsVisibilityChange({ + hiddenColumns, + model, + appName, + updateModelData, + }); + }, + onTableResizeModeChange(mode: ResizeModeEnum): void { + onTableResizeModeChange({ mode, model, appName }); + }, + onTableDiffShow(): void { + onTableDiffShow({ model, appName, updateModelData }); + }, + onTableResizeEnd(tableHeight: string): void { + onTableResizeEnd({ tableHeight, model, appName }); + }, + onSortReset(): void { + updateSortFields({ + sortFields: [], + model, + appName, + updateModelData, + }); + }, + updateColumnsWidths(key: string, width: number, isReset: boolean): void { + updateColumnsWidths({ + key, + width, + isReset, + model, + appName, + updateModelData, + }); + }, + onParamVisibilityChange(metricsKeys: string[]): void { + onParamVisibilityChange({ + metricsKeys, + model, + appName, + updateModelData, + }); + }, + onRowSelect({ + actionType, + data, + }: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + }): void { + return onRowSelect({ actionType, data, model }); + }, + onRowsVisibilityChange(metricKeys: string[]): void { + return onRowsVisibilityChange({ + metricKeys, + model, + appName, + updateModelData, + }); + }, + }); + } + + return methods; +} + +export default getScattersModelMethods; diff --git a/src/src/services/models/imagesExplore/imagesExploreAppModel.ts b/src/src/services/models/imagesExplore/imagesExploreAppModel.ts new file mode 100644 index 00000000..e4a8b3eb --- /dev/null +++ b/src/src/services/models/imagesExplore/imagesExploreAppModel.ts @@ -0,0 +1,2380 @@ +import React from 'react'; +import _ from 'lodash-es'; +import moment from 'moment'; +import { saveAs } from 'file-saver'; + +import { RowHeightSize } from 'config/table/tableConfigs'; +import { BookmarkNotificationsEnum } from 'config/notification-messages/notificationMessages'; +import { ResizeModeEnum, RowHeightEnum } from 'config/enums/tableEnums'; +import { IMAGE_SIZE_CHANGE_DELAY } from 'config/mediaConfigs/mediaConfigs'; +import { ImageRenderingEnum } from 'config/enums/imageEnums'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import COLORS from 'config/colors/colors'; +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { DATE_EXPORTING_FORMAT, TABLE_DATE_FORMAT } from 'config/dates/dates'; +import { getSuggestionsByExplorer } from 'config/monacoConfig/monacoConfig'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + getImagesExploreTableColumns, + imagesExploreTableRowRenderer, +} from 'pages/ImagesExplore/components/ImagesExploreTableGrid/ImagesExploreTableGrid'; + +import * as analytics from 'services/analytics'; +import imagesExploreService from 'services/api/imagesExplore/imagesExploreService'; +import appsService from 'services/api/apps/appsService'; +import dashboardService from 'services/api/dashboard/dashboardService'; +import blobsURIModel from 'services/models/media/blobsURIModel'; +import projectsService from 'services/api/projects/projectsService'; +import runsService from 'services/api/runs/runsService'; + +import { + IAppData, + IDashboardData, + IGroupingSelectOption, + IMetricsCollection, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; +import { IMetricTrace, IRun } from 'types/services/models/metrics/runModel'; +import { IBookmarkFormState } from 'types/components/BookmarkForm/BookmarkForm'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { + IImageData, + IImageRunData, + IImagesExploreAppConfig, + IImagesExploreAppModelState, +} from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { + IAppModelState, + ISelectConfig, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { IProjectParamsMetrics } from 'types/services/models/projects/projectsModel'; +import { IModel } from 'types/services/models/model'; +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITagInfo, ITagProps } from 'types/pages/tags/Tags'; + +import getAppConfigDataMethod from 'utils/app/getAppConfigData'; +import onRowSelectAction from 'utils/app/onRowSelect'; +import { AIM64_ENCODING_PREFIX, encode } from 'utils/encoder/encoder'; +import getObjectPaths from 'utils/getObjectPaths'; +import getUrlWithParam from 'utils/getUrlWithParam'; +import getStateFromUrl from 'utils/getStateFromUrl'; +import { + decodeBufferPairs, + decodePathsVals, + iterFoldTree, +} from 'utils/encoder/streamEncoding'; +import { getItem, setItem } from 'utils/storage'; +import JsonToCSV from 'utils/JsonToCSV'; +import { formatValue } from 'utils/formatValue'; +import getValueByField from 'utils/getValueByField'; +import arrayBufferToBase64 from 'utils/arrayBufferToBase64'; +import { getDataAsMediaSetNestedObject } from 'utils/app/getDataAsMediaSetNestedObject'; +import { getCompatibleSelectConfig } from 'utils/app/getCompatibleSelectConfig'; +import { getSortedFields, SortField, SortFields } from 'utils/getSortedFields'; +import { getValue } from 'utils/helper'; +import contextToString from 'utils/contextToString'; +import alphabeticalSortComparator from 'utils/alphabeticalSortComparator'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import getGroupingSelectOptions from 'utils/app/getGroupingSelectOptions'; +import getAdvancedSuggestion from 'utils/getAdvancedSuggestions'; +import { processDurationTime } from 'utils/processDurationTime'; +import onVisibilityChange from 'utils/app/onColumnsVisibilityChange'; +import setRequestProgress from 'utils/app/setRequestProgress'; +import getRunData from 'utils/app/getRunData'; +import getTooltipContent from 'utils/getTooltipContent'; +import decodeWithBase58Checker from 'utils/decodeWithBase58Checker'; +import { onCopyToClipBoard } from 'utils/onCopyToClipBoard'; +import getFilteredRow from 'utils/app/getFilteredRow'; +import { getMetricHash } from 'utils/app/getMetricHash'; +import onRunsTagsChange from 'utils/app/onRunsTagsChange'; +import saveRecentSearches from 'utils/saveRecentSearches'; + +import createModel from '../model'; +import { AppNameEnum } from '../explorer'; + +const model: IModel = createModel({ + requestStatus: RequestStatusEnum.NotRequested, + requestProgress: { + matched: 0, + checked: 0, + trackedRuns: 0, + }, + searchButtonDisabled: false, + applyButtonDisabled: true, + selectFormData: { + options: undefined, + suggestions: [], + error: null, + advancedError: null, + }, + config: getConfig(), +}); + +function getConfig(): IImagesExploreAppConfig { + return { + grouping: { + row: [], + reverseMode: { + row: false, + }, + isApplied: { + row: true, + }, + }, + select: { + options: [], + query: '', + advancedMode: false, + advancedQuery: '', + }, + images: { + indexDensity: '5', + recordDensity: '50', + tooltip: { + appearance: CONTROLS_DEFAULT_CONFIG.images.tooltip.appearance, + display: CONTROLS_DEFAULT_CONFIG.images.tooltip.display, + selectedFields: CONTROLS_DEFAULT_CONFIG.images.tooltip.selectedFields, + }, + additionalProperties: { + alignmentType: CONTROLS_DEFAULT_CONFIG.images.alignmentType, + mediaItemSize: CONTROLS_DEFAULT_CONFIG.images.mediaItemSize, + imageRendering: CONTROLS_DEFAULT_CONFIG.images.imageRendering, + stacking: CONTROLS_DEFAULT_CONFIG.images.stacking, + }, + focusedState: { + active: false, + key: null, + }, + sortFields: [], + sortFieldsDict: {}, + inputsValidations: {}, + }, + table: { + resizeMode: ResizeModeEnum.Resizable, + rowHeight: RowHeightSize.md, + sortFields: [], + hiddenMetrics: [], + hiddenColumns: [], + hideSystemMetrics: undefined, + columnsWidths: { tags: 300 }, + columnsOrder: { + left: [], + middle: [], + right: [], + }, + height: '0.5', + }, + }; +} + +let appRequestRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; +}; + +let runsArchiveRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; +}; +let runsDeleteRef: { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; +}; + +function initialize(appId: string): void { + model.init(); + model.setState({ + refs: { + tableRef: { current: null }, + }, + groupingSelectOptions: [], + }); + if (!appId) { + setDefaultAppConfigData(); + } + projectsService + .getProjectParams(['images']) + .call() + .then((data: IProjectParamsMetrics) => { + const advancedSuggestions: Record = getAdvancedSuggestion( + data.images, + ); + model.setState({ + selectFormData: { + options: getSelectFormOptions(data), + suggestions: getSuggestionsByExplorer(AppNameEnum.IMAGES, data), + advancedSuggestions: { + ...getSuggestionsByExplorer(AppNameEnum.IMAGES, data), + images: { + name: '', + context: _.isEmpty(advancedSuggestions) + ? '' + : { ...advancedSuggestions }, + }, + }, + }, + }); + }); +} + +function setDefaultAppConfigData(recoverTableState: boolean = true) { + const defaultConfig: Partial = {}; + const searchParam = new URLSearchParams(window.location.search); + + const grouping: IImagesExploreAppConfig['grouping'] = + getStateFromUrl('grouping') ?? {}; + + defaultConfig.grouping = grouping; + + const compatibleSelectConfig = getCompatibleSelectConfig( + ['images'], + getStateFromUrl('select'), + ); + const select: ISelectConfig = compatibleSelectConfig ?? {}; + + defaultConfig.select = select; + + const images: IImagesExploreAppConfig['images'] = + getStateFromUrl('images') ?? {}; + + defaultConfig.images = images; + + if (recoverTableState) { + const tableConfigHash = + getItem('imagesTable') || getItem('imagesExploreTable'); + const table = tableConfigHash + ? JSON.parse( + decodeWithBase58Checker({ + value: tableConfigHash ?? '', + localStorageKey: getItem('imagesTable') + ? 'imagesTable' + : 'imagesExploreTable', + }), + ) + : getConfig().table; + + defaultConfig.table = table; + } + + const configData = _.mergeWith( + {}, + model.getState().config, + defaultConfig, + (objValue, srcValue) => { + if (_.isArray(objValue)) { + return srcValue; + } + }, + ); + if ( + (searchParam.get('grouping') && + !searchParam.get('grouping')?.startsWith(AIM64_ENCODING_PREFIX)) || + (searchParam.get('chart') && + !searchParam.get('chart')?.startsWith(AIM64_ENCODING_PREFIX)) || + (searchParam.get('select') && + !searchParam.get('select')?.startsWith(AIM64_ENCODING_PREFIX)) + ) { + updateURL(configData); + } + + model.setState({ config: configData }); +} + +let imagesRequestRef: { + call: ( + exceptionHandler: (detail: any) => void, + ) => Promise[]>>; + abort: () => void; +}; + +function getAppConfigData(appId: string) { + return getAppConfigDataMethod({ + appId, + appRequest: appRequestRef, + config: getConfig(), + model, + }); +} + +function resetModelState() { + model.setState({ + ...model.getState(), + data: [], + selectFormData: { + ...model.getState().selectFormData, + error: null, + advancedError: null, + }, + params: [], + imagesData: {}, + tableData: [], + tableColumns: [], + rawData: [], + }); +} + +function abortRequest(): void { + if (imagesRequestRef) { + imagesRequestRef.abort(); + } + setRequestProgress(model); + model.setState({ + requestStatus: RequestStatusEnum.Ok, + }); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'info', + messages: ['Request has been cancelled'], + }, + model, + }); +} + +function getImagesData( + shouldUrlUpdate?: boolean, + shouldResetSelectedRows?: boolean, + queryString?: string, +) { + if (imagesRequestRef) { + imagesRequestRef.abort(); + } + + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (queryString) { + if (configData?.select?.advancedMode) { + configData.select.advancedQuery = queryString; + } else { + configData!.select.query = queryString; + } + } + const recordSlice: number[] | undefined = configData?.images?.recordSlice as + | number[] + | undefined; + const indexSlice: number[] | undefined = configData?.images?.indexSlice as + | number[] + | undefined; + const recordDensity = configData?.images?.recordDensity; + const indexDensity = configData?.images?.indexDensity; + let query = getQueryStringFromSelect(configData!.select); + let imageDataBody: any = { + q: query !== '()' ? query : '', + }; + if (recordSlice) { + //TODO check values nullability + imageDataBody = { + ...imageDataBody, + record_range: + !_.isEmpty(recordSlice) && + !_.isNil(recordSlice?.[0]) && + !_.isNil(recordSlice[1]) + ? `${recordSlice[0]}:${recordSlice[1] + 1}` + : '', + index_range: + !_.isEmpty(indexSlice) && + !_.isNil(recordSlice?.[0]) && + !_.isNil(recordSlice[1]) + ? `${indexSlice?.[0]}:${(indexSlice?.[1] || 0) + 1}` + : '', + record_density: + !_.isNil(recordDensity) && +recordDensity > 0 ? recordDensity : '', + index_density: + !_.isNil(indexDensity) && +indexDensity > 0 ? indexDensity : '', + }; + } + imagesRequestRef = imagesExploreService.getImagesExploreData(imageDataBody); + setRequestProgress(model); + return { + call: async () => { + if (query !== '()') { + model.setState({ + requestStatus: RequestStatusEnum.Pending, + queryIsEmpty: false, + applyButtonDisabled: false, + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + }); + blobsURIModel.init(); + try { + const stream = await imagesRequestRef.call((detail) => { + exceptionHandler({ detail, model }); + resetModelState(); + }); + const runData = await getRunData(stream, (progress) => + setRequestProgress(model, progress), + ); + + if (configData) { + setModelData(runData, configData); + } + if (shouldUrlUpdate) { + updateURL(configData); + } + saveRecentSearches(AppNameEnum.IMAGES, query!); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + // Abort Error + } else { + // eslint-disable-next-line no-console + console.log('Unhandled error: ', ex); + } + } + } else { + model.setState({ + selectedRows: shouldResetSelectedRows + ? {} + : model.getState()?.selectedRows, + queryIsEmpty: true, + imagesData: {}, + tableData: [], + images: { + tooltip: { + display: true, + selectedFields: [], + }, + focusedState: { + active: false, + key: null, + }, + }, + config: { + ...configData, + grouping: { ...getConfig().grouping }, + table: { + ...configData?.table, + resizeMode: ResizeModeEnum.Resizable, + }, + }, + }); + } + }, + abort: imagesRequestRef.abort, + }; +} + +function getSelectFormOptions(projectsData: IProjectParamsMetrics) { + let data: ISelectOption[] = []; + let index: number = 0; + if (projectsData?.images) { + for (let seqName in projectsData.images) { + data.push({ + label: seqName, + group: seqName, + color: COLORS[0][index % COLORS[0].length], + key: getMetricHash(seqName, {}), + + value: { + option_name: seqName, + context: null, + }, + }); + index++; + + for (let val of projectsData.images[seqName]) { + if (!_.isEmpty(val)) { + let label = contextToString(val); + data.push({ + label: `${seqName} ${label}`, + group: seqName, + color: COLORS[0][index % COLORS[0].length], + key: getMetricHash(seqName, val), + value: { + option_name: seqName, + context: val, + }, + }); + index++; + } + } + } + } + + return data.sort( + alphabeticalSortComparator({ orderBy: 'label' }), + ); +} + +function processData(data: any[]): { + data: IMetricsCollection[]; + params: string[]; + runProps: string[]; + highLevelParams: string[]; + contexts: string[]; + selectedRows: any; +} { + const configData = model.getState()?.config; + let selectedRows = model.getState()?.selectedRows; + let metrics: any[] = []; + let params: string[] = []; + let runProps: string[] = []; + let highLevelParams: string[] = []; + let contexts: string[] = []; + data?.forEach((run: IImageRunData) => { + params = params.concat(getObjectPaths(run.params, run.params)); + runProps = runProps.concat(getObjectPaths(run.props, run.props)); + highLevelParams = highLevelParams.concat( + getObjectPaths(run.params, run.params, '', false, true), + ); + run.traces.forEach((trace: any) => { + contexts = contexts.concat(getObjectPaths(trace.context, trace.context)); + trace.values.forEach((stepData: IImageData[], stepIndex: number) => { + stepData.forEach((image: IImageData) => { + const imageKey = encode({ + name: trace.name, + runHash: run.hash, + traceContext: trace.context, + index: image.index, + step: trace.iters[stepIndex], + caption: image.caption, + }); + const seqKey = encode({ + name: trace.name, + runHash: run.hash, + traceContext: trace.context, + }); + metrics.push({ + ...image, + name: trace.name, + step: trace.iters[stepIndex], + context: trace.context, + run: _.omit(run, 'traces'), + key: imageKey, + seqKey: seqKey, + }); + }); + }); + }); + }); + + let sortFields = configData?.table?.sortFields ?? []; + + if (sortFields?.length === 0) { + sortFields = [ + { + value: 'run.props.creation_time', + order: 'desc', + label: '', + group: '', + }, + ]; + } + + const processedData = groupData( + _.orderBy( + metrics, + sortFields?.map( + (f: SortField) => + function (metric: SortField) { + return getValue(metric, f.value, ''); + }, + ), + sortFields?.map((f: any) => f.order), + ), + ); + const uniqProps = _.uniq(runProps).sort(); + const uniqParams = _.uniq(params).sort(); + const uniqHighLevelParams = _.uniq(highLevelParams).sort(); + const uniqContexts = _.uniq(contexts).sort(); + + const mappedData = + data?.reduce((acc: any, item: any) => { + acc[item.hash] = { runHash: item.hash, ...item.props }; + return acc; + }, {}) || {}; + if (selectedRows && !_.isEmpty(selectedRows)) { + selectedRows = Object.keys(selectedRows).reduce((acc: any, key: string) => { + const slicedKey = key.slice(0, key.indexOf('/')); + acc[key] = { + selectKey: key, + ...mappedData[slicedKey], + }; + return acc; + }, {}); + } + return { + data: processedData, + runProps: uniqProps, + params: uniqParams, + highLevelParams: uniqHighLevelParams, + contexts: uniqContexts, + selectedRows, + }; +} + +function setModelData(rawData: any[], configData: IImagesExploreAppConfig) { + const modelState = model.getState(); + const sortFields = modelState?.config?.table.sortFields; + const { data, params, runProps, highLevelParams, contexts, selectedRows } = + processData(rawData); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + contexts, + runProps, + sequenceName: 'images', + }), + ]; + const { mediaSetData, orderedMap } = getDataAsMediaSetNestedObject({ + data, + groupingSelectOptions, + model, + }); + const ranges = rawData?.[0]?.ranges; + const tableData = getDataAsTableRows( + data, + params, + false, + configData, + groupingSelectOptions, + ); + const config = configData; + const recordSlice = [ + _.inRange( + ranges?.record_range_used[0], + ranges?.record_range_total[0] - 1, + ranges?.record_range_total[1] + 1, + ) + ? ranges?.record_range_used[0] + : ranges?.record_range_total[0], + _.inRange( + ranges?.record_range_used[1] - 1, + ranges?.record_range_total[0] - 1, + ranges?.record_range_total[1] + 1, + ) + ? ranges?.record_range_used[1] - 1 + : ranges?.record_range_total[1] - 1, + ]; + const indexSlice = [ + _.inRange( + ranges?.index_range_used[0], + ranges?.index_range_total[0] - 1, + ranges?.index_range_total[1] + 1, + ) + ? ranges?.index_range_used[0] + : ranges?.index_range_total[0], + _.inRange( + ranges?.index_range_used[1] - 1, + ranges?.index_range_total[0] - 1, + ranges?.index_range_total[1] + 1, + ) + ? ranges?.index_range_used[1] - 1 + : ranges?.index_range_total[1] - 1, + ]; + const recordRangeTotalCount = + ranges?.record_range_total[1] - 1 - ranges?.record_range_total[0]; + const indexRangeTotalCount = + ranges?.index_range_total[1] - 1 - ranges?.index_range_total[0]; + const recordDensity = + !config.images.recordDensity || + +config.images.recordDensity < ranges?.record_range_total[0] || + +config.images.recordDensity > recordRangeTotalCount + ? `${recordRangeTotalCount === 0 ? 1 : recordRangeTotalCount}` + : config.images.recordDensity; + const indexDensity = + !config.images.indexDensity || + +config.images.indexDensity < ranges?.index_range_total[0] || + +config.images.indexDensity > indexRangeTotalCount + ? `${indexRangeTotalCount === 0 ? 1 : indexRangeTotalCount}` + : config.images.indexDensity; + + config.images = { + ...config.images, + stepRange: !_.isEmpty(rawData) + ? [ranges?.record_range_total[0], ranges?.record_range_total[1] - 1] + : config.images.stepRange, + indexRange: !_.isEmpty(rawData) + ? [ranges?.index_range_total[0], ranges?.index_range_total[1] - 1] + : config.images.indexRange, + recordSlice, + indexSlice, + recordDensity, + indexDensity, + tooltip: config.images.tooltip || { + display: true, + selectedFields: [], + }, + focusedState: config.images.focusedState || { + active: false, + key: null, + }, + additionalProperties: config.images.additionalProperties, + }; + + const tableColumns = getImagesExploreTableColumns( + params, + groupingSelectOptions, + data[0]?.config, + configData.table.columnsOrder!, + configData.table.hiddenColumns!, + sortFields, + onTableSortChange, + config.grouping as any, + onGroupingSelectChange, + ); + + modelState?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + }); + + model.setState({ + requestStatus: RequestStatusEnum.Ok, + rawData, + config, + params, + selectFormData: { + ...modelState?.selectFormData, + [configData.select?.advancedMode ? 'advancedError' : 'error']: null, + }, + data, + selectedRows, + imagesData: mediaSetData, + orderedMap, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + groupingSelectOptions, + }); +} + +function updateModelData( + configData: IImagesExploreAppConfig = model.getState()!.config!, + shouldURLUpdate?: boolean, +): void { + const { data, params, runProps, highLevelParams, contexts, selectedRows } = + processData(model.getState()?.rawData as any[]); + const sortedParams = [...new Set(params.concat(highLevelParams))].sort(); + const groupingSelectOptions = [ + ...getGroupingSelectOptions({ + params: sortedParams, + runProps, + contexts, + sequenceName: 'images', + }), + ]; + const { mediaSetData, orderedMap } = getDataAsMediaSetNestedObject({ + data, + groupingSelectOptions, + model, + }); + const tableData = getDataAsTableRows( + data, + params, + false, + configData, + groupingSelectOptions, + ); + const tableColumns = getImagesExploreTableColumns( + params, + groupingSelectOptions, + data[0]?.config, + configData.table.columnsOrder!, + configData.table.hiddenColumns!, + configData.table.sortFields, + onTableSortChange, + configData.grouping as any, + onGroupingSelectChange, + ); + + model.getState()?.refs?.tableRef.current?.updateData({ + newData: tableData.rows, + newColumns: tableColumns, + hiddenColumns: configData.table.hiddenColumns!, + }); + + if (shouldURLUpdate) { + updateURL(configData); + } + + model.setState({ + config: configData, + data, + imagesData: mediaSetData, + orderedMap, + tableData: tableData.rows, + tableColumns, + sameValueColumns: tableData.sameValueColumns, + groupingSelectOptions, + selectedRows, + }); +} + +function getFilteredGroupingOptions( + grouping: IImagesExploreAppConfig['grouping'], +): string[] { + const { + // reverseMode, + isApplied, + } = grouping; + const groupingSelectOptions: + | IImagesExploreAppModelState['groupingSelectOptions'] + | undefined = model.getState()?.groupingSelectOptions; + if (groupingSelectOptions) { + // const filteredOptions = [...groupingSelectOptions] + // .filter((opt) => grouping['row'].indexOf(opt.value as never) === -1) + // .map((item) => item.value); + //ToDo reverse mode + // return isApplied['row'] + // ? reverseMode['row'] + // ? filteredOptions + // : grouping['row'] + // : []; + return isApplied['row'] ? grouping['row'] : []; + } else { + return []; + } +} + +function groupData(data: any[]): any { + const configData: IImagesExploreAppConfig | undefined = + model.getState()!.config; + const grouping = configData!.grouping; + const groupingFields = getFilteredGroupingOptions(grouping); + if (groupingFields.length === 0) { + return [ + { + config: null, + chartIndex: 0, + data: data, + }, + ]; + } + + const groupValues: { [key: string]: any } = {}; + + for (let i = 0; i < data.length; i++) { + const groupValue: { [key: string]: string } = {}; + groupingFields.forEach((field) => { + groupValue[field] = getValue(data[i], field); + }); + const groupKey = encode(groupValue); + if (groupValues.hasOwnProperty(groupKey)) { + groupValues[groupKey].data.push(data[i]); + } else { + groupValues[groupKey] = { + key: groupKey, + config: groupValue, + data: [data[i]], + }; + } + } + return Object.values(groupValues); +} + +function setComponentRefs( + refElement: React.MutableRefObject | object, +) { + const modelState = model.getState(); + if (modelState?.refs) { + modelState.refs = Object.assign(modelState.refs, refElement); + model.setState({ refs: modelState.refs }); + } +} + +function onGroupingSelectChange({ + groupName, + list, +}: IOnGroupingSelectChangeParams) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { ...configData.grouping, [groupName]: list }; + updateModelData(configData, true); + //ToDo reverse mode + // if ( + // configData.images?.additionalProperties?.stacking && + // (_.isEmpty(configData.grouping.row) || + // configData.grouping.reverseMode.row) + // ) { + // onStackingToggle(); + // } + if ( + configData.images?.additionalProperties?.stacking && + _.isEmpty(configData.grouping.row) + ) { + onStackingToggle(); + } + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS.images.groupings[groupName].select}`, + ); +} + +function onGroupingModeChange({ value }: IOnGroupingModeChangeParams): void { + const configData = model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { + ...configData.grouping, + reverseMode: { + ...configData.grouping.reverseMode, + row: value, + }, + }; + updateModelData(configData, true); + //ToDo reverse mode + // if ( + // configData.images?.additionalProperties?.stacking && + // (_.isEmpty(configData.grouping.row) || + // configData.grouping.reverseMode.row) + // ) { + // onStackingToggle(); + // } + if ( + configData.images?.additionalProperties?.stacking && + _.isEmpty(configData.grouping.row) + ) { + onStackingToggle(); + } + } + if (value) { + analytics.trackEvent( + // @ts-ignore + ANALYTICS_EVENT_KEYS.images.groupings.row.modeChange, + //@TODO change group to dynamic groupName when adding grouping type + ); + } +} + +function onGroupingReset(groupName: GroupNameEnum) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.grouping) { + const { reverseMode, isApplied } = configData.grouping; + configData.grouping = { + ...configData.grouping, + reverseMode: { ...reverseMode, [groupName]: false }, + [groupName]: [], + isApplied: { ...isApplied, [groupName]: true }, + }; + updateModelData(configData, true); + //ToDo reverse mode + // if ( + // configData.images?.additionalProperties?.stacking && + // (_.isEmpty(configData.grouping.row) || + // configData.grouping.reverseMode.row) + // ) { + // onStackingToggle(); + // } + if ( + configData.images?.additionalProperties?.stacking && + _.isEmpty(configData.grouping.row) + ) { + onStackingToggle(); + } + } +} + +function onGroupingApplyChange(): void { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { + ...configData.grouping, + isApplied: { + ...configData.grouping.isApplied, + row: !configData.grouping.isApplied['row'], + }, + }; + updateModelData(configData, true); + } +} + +/** + * function updateURL has 2 major functionalities: + * 1. Keeps URL in sync with the app config + * 2. Stores updated URL in localStorage if App is not in the bookmark state + * @param {IImagesExploreAppConfig} configData - the current state of the app config + */ +function updateURL( + configData: IImagesExploreAppConfig = model.getState()!.config!, +) { + const { grouping, select, images } = configData; + const url: string = getUrlWithParam({ + grouping: encode(grouping), + select: encode(select as {}), + images: encode(images), + }); + + if (url === `${window.location.pathname}${window.location.search}`) { + return; + } + + const appId: string = window.location.pathname.split('/')[2]; + if (!appId) { + setItem('imagesUrl', url); + } + + window.history.pushState(null, '', url); +} + +function onResetConfigData(): void { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData) { + configData.grouping = { + ...getConfig().grouping, + }; + updateModelData(configData, true); + } +} + +function getImagesBlobsData(uris: string[]) { + const request = imagesExploreService.getImagesByURIs(uris); + return { + abort: request.abort, + call: () => { + return request + .call((detail: any) => { + exceptionHandler({ detail, model }); + }) + .then(async (stream) => { + let bufferPairs = decodeBufferPairs(stream); + let decodedPairs = decodePathsVals(bufferPairs); + let objects = iterFoldTree(decodedPairs, 1); + + for await (let [keys, val] of objects) { + const URI = keys[0]; + blobsURIModel.emit(URI as string, { + [URI]: arrayBufferToBase64(val as ArrayBuffer) as string, + }); + } + }) + .catch((ex) => { + if (ex.name === 'AbortError') { + // Abort Error + } else { + // eslint-disable-next-line no-console + console.log('Unhandled error: '); + } + }); + }, + }; +} + +function getDataAsImageSet( + data: any[], + groupingSelectOptions: IGroupingSelectOption[], + defaultGroupFields?: string[], +) { + if (!_.isEmpty(data)) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + const imageSetData: object = {}; + const group: string[] = [...(configData?.grouping?.row || [])]; + //ToDo reverse mode + // const groupFields = + // defaultGroupFields || + // (configData?.grouping?.reverseMode?.row + // ? groupingSelectOptions + // .filter( + // (option: IGroupingSelectOption) => !group.includes(option.label), + // ) + // .map((option) => option.value) + // : group); + const groupFields = defaultGroupFields || group; + const imagesDataForOrdering = {}; + data.forEach((group: any) => { + const path = groupFields?.reduce( + (acc: string[], field: string, index: number) => { + const value = getValue(group.data[0], field); + _.set( + imagesDataForOrdering, + acc.concat(['ordering']), + new Set([ + ...(getValue(imagesDataForOrdering, acc.concat(['ordering'])) || + []), + value, + ]), + ); + _.set( + imagesDataForOrdering, + acc.concat(['key']), + getValueByField(groupingSelectOptions, field), + ); + acc.push( + `${getValueByField(groupingSelectOptions, field)} = ${formatValue( + value, + )}`, + ); + return acc; + }, + [], + ); + _.set( + imageSetData, + path, + _.sortBy(group.data, [ + ...groupFields, + ...groupingSelectOptions + .map((option: IGroupingSelectOption) => option.value) + .filter((field) => !groupFields.includes(field)), + 'caption', + ]), + ); + }); + + return { + imageSetData: _.isEmpty(imageSetData) ? data[0].data : imageSetData, + orderedMap: imagesDataForOrdering, + }; + } else { + return {}; + } +} + +function onActivePointChange( + activePoint: any, + focusedStateActive: boolean = false, +): void { + const { data, refs, config, groupingSelectOptions, tooltip } = + model.getState(); + + if (config?.table.resizeMode !== ResizeModeEnum.Hide) { + const tableRef: any = refs?.tableRef; + if (tableRef && activePoint.seqKey) { + tableRef.current?.setHoveredRow?.(activePoint.seqKey); + tableRef.current?.setActiveRow?.( + focusedStateActive ? activePoint.seqKey : null, + ); + if (focusedStateActive) { + tableRef.current?.scrollToRow?.(activePoint.seqKey); + } + } + } + let configData = config; + if (configData?.images) { + // TODO remove this later + // remove unnecessary content prop from tooltip config + if (configData.images.tooltip?.hasOwnProperty('content')) { + delete configData.images.tooltip.content; + } + + configData = { + ...configData, + images: { + ...configData.images, + focusedState: { + active: focusedStateActive, + key: activePoint.key, + }, + }, + }; + + if ( + config.images.focusedState.active !== focusedStateActive || + (config.images.focusedState.active && + activePoint.key !== config.images.focusedState.key) + ) { + updateURL(configData); + } + } + + const tooltipContent = configData.images?.focusedState?.key + ? getTooltipContent({ + groupingNames: [GroupNameEnum.ROW], + groupingSelectOptions, + data, + configData, + activePointKey: configData.images?.focusedState?.key, + selectedFields: configData.images?.tooltip?.selectedFields, + }) + : tooltip.content; + + model.setState({ + config: configData, + tooltip: { + ...configData?.images?.tooltip, + content: tooltipContent, + }, + }); +} + +function onChangeTooltip(tooltipObj: Partial): void { + let { + config: configData, + data, + groupingSelectOptions = [], + tooltip, + } = model.getState(); + + if (configData?.images) { + // TODO remove this later + // remove unnecessary content prop from tooltip config + if (configData.images.tooltip?.hasOwnProperty('content')) { + delete configData.images.tooltip.content; + } + + configData = { + ...configData, + images: { + ...configData.images, + tooltip: { + ...configData.images.tooltip, + ...tooltipObj, + }, + }, + }; + + const tooltipContent = configData.images?.focusedState?.key + ? getTooltipContent({ + groupingNames: [GroupNameEnum.ROW], + groupingSelectOptions, + data, + configData, + activePointKey: configData.images?.focusedState?.key, + selectedFields: configData.images?.tooltip?.selectedFields, + }) + : tooltip.content; + + model.setState({ + config: configData, + tooltip: { + ...configData?.images?.tooltip, + content: tooltipContent, + }, + }); + updateURL(configData); + } + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.images.imagesPanel.controls.tooltip + .changeTooltipContent, + ); +} + +function getDataAsTableRows( + processedData: IMetricsCollection[], + paramKeys: string[], + isRawData: boolean, + config: IImagesExploreAppConfig, + groupingSelectOptions: any, + dynamicUpdate?: boolean, +): { rows: any[] | any; sameValueColumns: string[] } { + if (!processedData) { + return { + rows: [], + sameValueColumns: [], + }; + } + + const rows: any[] | any = processedData[0]?.config !== null ? {} : []; + + let rowIndex = 0; + const sameValueColumns: string[] = []; + const columnsFlattenValues: { [key: string]: Set } = {}; + + const tableData = groupData( + Object.values( + _.groupBy( + Object.values(processedData) + .map((v) => v.data) + .flat(), + 'seqKey', + ), + ).map((v) => v[0]), + ); + tableData.forEach((metricsCollection: IMetricsCollection) => { + const groupKey = metricsCollection.key; + const columnsValues: { [key: string]: string[] } = {}; + + if (metricsCollection.config !== null) { + const groupConfigData: { [key: string]: unknown } = {}; + for (let key in metricsCollection.config) { + groupConfigData[getValueByField(groupingSelectOptions, key)] = + metricsCollection.config[key]; + } + const groupHeaderRow = { + meta: { + dasharray: null, + itemsCount: metricsCollection.data.length, + config: groupConfigData, + }, + key: groupKey!, + groupRowsKeys: metricsCollection.data.map( + (metric) => (metric as any).seqKey, + ), + experiment: '', + run: '', + date: '', + description: '', + metric: '', + context: [], + children: [], + groups: groupConfigData, + }; + + rows[groupKey!] = { + data: groupHeaderRow, + items: [], + }; + } + + Object.values(_.groupBy(metricsCollection.data, 'seqKey')) + .map((v) => v[0]) + .forEach((metric: any) => { + const rowValues: any = { + rowMeta: { + color: metricsCollection.color ?? metric.color, + }, + key: metric.seqKey, + selectKey: `${metric.run.hash}/${metric.seqKey}`, + hash: metric.run.hash, + isHidden: config?.table?.hiddenMetrics?.includes(metric.key), + index: rowIndex, + color: metricsCollection.color ?? metric.color, + dasharray: metricsCollection.dasharray ?? metric.dasharray, + experiment: metric.run.props.experiment?.name ?? 'default', + experimentId: metric.run.props.experiment?.id ?? '', + experiment_description: + metric.run.props.experiment?.description ?? '-', + run: metric.run.props?.name ?? '-', + description: metric.run.props?.description ?? '-', + date: moment(metric.run.props.creation_time * 1000).format( + TABLE_DATE_FORMAT, + ), + tags: metric.run.props.tags.map((tag: ITagProps) => ({ + archived: false, + color: tag.color, + id: tag.id, + comment: tag.description, + name: tag.name, + run_count: 0, + })), + duration: processDurationTime( + metric.run.props.creation_time * 1000, + metric.run.props.end_time + ? metric.run.props.end_time * 1000 + : Date.now(), + ), + name: metric.name, + context: Object.entries(metric.context).map((entry) => + entry.join(':'), + ), + parentId: groupKey, + }; + rowIndex++; + + [ + 'experiment', + 'run', + 'hash', + 'duration', + 'date', + 'metric', + 'context', + 'step', + 'epoch', + 'time', + 'name', + ].forEach((key) => { + if (columnsValues.hasOwnProperty(key)) { + if ( + _.findIndex(columnsValues[key], (value) => + _.isEqual(rowValues[key], value), + ) === -1 + ) { + columnsValues[key].push(rowValues[key]); + } + } else { + columnsValues[key] = [rowValues[key]]; + } + }); + + if (!dynamicUpdate) { + paramKeys.forEach((paramKey) => { + const value = getValue(metric.run.params, paramKey, '-'); + rowValues[paramKey] = formatValue(value); + if (columnsValues.hasOwnProperty(paramKey)) { + if ( + _.findIndex(columnsValues[paramKey], (paramValue) => + _.isEqual(value, paramValue), + ) === -1 + ) { + columnsValues[paramKey].push(value); + } + } else { + columnsValues[paramKey] = [value]; + } + }); + } + if (metricsCollection.config !== null) { + rows[groupKey!].items.push( + isRawData + ? rowValues + : imagesExploreTableRowRenderer( + rowValues, + onModelRunsTagsChange, + { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange(rowValues.key); + }, + }, + ), + ); + } else { + rows.push( + isRawData + ? rowValues + : imagesExploreTableRowRenderer( + rowValues, + onModelRunsTagsChange, + { + toggleVisibility: (e) => { + e.stopPropagation(); + onRowVisibilityChange(rowValues.key); + }, + }, + ), + ); + } + }); + + for (let columnKey in columnsValues) { + columnsFlattenValues[columnKey] = new Set([ + ...(columnsFlattenValues[columnKey] || []), + ...(columnsValues[columnKey] || []), + ]); + + if (metricsCollection.config !== null) { + rows[groupKey!].data[columnKey] = + columnsValues[columnKey].length === 1 + ? paramKeys.includes(columnKey) + ? formatValue(columnsValues[columnKey][0]) + : columnsValues[columnKey][0] + : columnsValues[columnKey]; + } + } + if (metricsCollection.config !== null && !isRawData) { + rows[groupKey!].data = imagesExploreTableRowRenderer( + rows[groupKey!].data, + onModelRunsTagsChange, + {}, + true, + ['value', 'name', 'groups'].concat(Object.keys(columnsValues)), + ); + } + }); + for (let columnKey in columnsFlattenValues) { + if (columnsFlattenValues[columnKey].size === 1) { + sameValueColumns.push(columnKey); + } + } + return { rows, sameValueColumns }; +} + +function onModelRunsTagsChange(runHash: string, tags: ITagInfo[]): void { + onRunsTagsChange({ runHash, tags, model, updateModelData }); +} + +async function onBookmarkCreate({ name, description }: IBookmarkFormState) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData) { + const app: IAppData | any = await appsService + .createApp({ state: configData, type: 'images' }) + .call((detail: any) => { + exceptionHandler({ detail, model }); + }); + if (app.id) { + const bookmark: IDashboardData = await dashboardService + .createDashboard({ app_id: app.id, name, description }) + .call((detail: any) => { + exceptionHandler({ detail, model }); + }); + if (bookmark.name) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [BookmarkNotificationsEnum.CREATE], + }, + model, + }); + } else { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [BookmarkNotificationsEnum.ERROR], + }, + model, + }); + } + } + } + analytics.trackEvent(ANALYTICS_EVENT_KEYS.images.createBookmark); +} + +function onBookmarkUpdate(id: string) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData) { + appsService + .updateApp(id, { state: configData, type: 'images' }) + .call((detail: any) => { + exceptionHandler({ detail, model }); + }) + .then((res: IDashboardData | any) => { + if (res.id) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [BookmarkNotificationsEnum.UPDATE], + }, + model, + }); + } + }); + } +} + +function updateColumnsWidths(key: string, width: number, isReset: boolean) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table && configData?.table?.columnsWidths) { + let columnsWidths = configData?.table?.columnsWidths; + if (isReset) { + columnsWidths = _.omit(columnsWidths, [key]); + } else { + columnsWidths = { ...columnsWidths, [key]: width }; + } + const table = { + ...configData.table, + columnsWidths, + }; + const config = { + ...configData, + table, + }; + model.setState({ + config, + }); + setItem('imagesTable', encode(table)); + updateModelData(config); + } +} + +// internal function to update config.table.sortFields and cache data +function updateTableSortFields(sortFields: SortFields) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + sortFields, + }; + const configUpdate = { + ...configData, + table, + }; + model.setState({ + config: configUpdate, + }); + + setItem('imagesTable', encode(table)); + updateModelData(configUpdate, true); + } + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.table.changeSorting} ${ + _.isEmpty(sortFields) ? 'Reset' : 'Apply' + }`, + ); +} +// internal function to update config.table.sortFields and cache data +function updateImagesSortFields(sortFields: SortFields, sortFieldsDict: any) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + const images = { + ...configData.images, + sortFields, + sortFieldsDict, + }; + const configUpdate = { + ...configData, + images, + }; + model.setState({ + config: configUpdate, + }); + + updateModelData(configUpdate, true); + } + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.imagesPanel.controls.changeSorting} ${ + _.isEmpty(sortFields) ? 'Reset' : 'Apply' + } images sorting by a key`, + ); +} + +// set empty array to config.table.sortFields +function onSortReset() { + updateTableSortFields([]); +} + +function onImagesSortReset() { + updateImagesSortFields([], {}); +} + +/** + * function onTableSortChange has 3 major functionalities + * 1. if only field param passed, the function will change sort option with the following cycle ('asc' -> 'desc' -> none -> 'asc) + * 2. if value param passed 'asc' or 'desc', the function will replace the sort option of the field in sortFields + * 3. if value param passed 'none', the function will delete the field from sortFields + * @param {String} field - the name of the field (i.e params.dataset.preproc) + * @param {'asc' | 'desc' | 'none'} value - 'asc' | 'desc' | 'none' + */ +function onTableSortChange({ + sortFields, + order, + index, + actionType, + field, +}: any) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + + updateTableSortFields( + getSortedFields({ + sortFields: sortFields || configData?.table.sortFields || [], + order, + index, + actionType, + field, + }), + ); +} + +function onImagesSortChange({ + sortFields, + order, + index, + actionType, + field, +}: any) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + const resultSortFields = getSortedFields({ + sortFields: sortFields || configData?.images.sortFields || [], + order, + index, + actionType, + field, + }); + updateImagesSortFields( + resultSortFields, + resultSortFields.reduce((acc: any, field: any) => { + acc[field.value] = field; + return acc; + }, {}), + ); +} + +function onExportTableData(e: React.ChangeEvent): void { + const { data, params, config, groupingSelectOptions } = + model.getState() as IImagesExploreAppModelState; + const tableData = getDataAsTableRows( + data, + params, + true, + config, + groupingSelectOptions, + ); + const tableColumns: ITableColumn[] = getImagesExploreTableColumns( + params, + groupingSelectOptions, + data[0]?.config, + config?.table.columnsOrder!, + config?.table.hiddenColumns!, + config?.table.sortFields, + onTableSortChange, + config.grouping as any, + onGroupingSelectChange, + ); + + const excludedFields: string[] = ['#', 'actions']; + const filteredHeader: string[] = tableColumns.reduce( + (acc: string[], column: ITableColumn) => + acc.concat( + excludedFields.indexOf(column.key) === -1 && !column.isHidden + ? column.key + : [], + ), + [], + ); + + let emptyRow: { [key: string]: string } = {}; + filteredHeader.forEach((column: string) => { + emptyRow[column] = '--'; + }); + + const groupedRows: any[][] = Object.keys(tableData.rows).map( + (groupedRowKey: string) => tableData.rows[groupedRowKey].items, + ); + + const dataToExport: { [key: string]: string }[] = []; + + groupedRows?.forEach((groupedRow: any[], groupedRowIndex: number) => { + groupedRow?.forEach((row: any) => { + const filteredRow: any = getFilteredRow({ + columnKeys: filteredHeader, + row, + }); + dataToExport.push(filteredRow); + }); + if (groupedRows?.length - 1 !== groupedRowIndex) { + dataToExport.push(emptyRow); + } + }); + + const blob = new Blob([JsonToCSV(dataToExport)], { + type: 'text/csv;charset=utf-8;', + }); + saveAs(blob, `images-${moment().format(DATE_EXPORTING_FORMAT)}.csv`); + analytics.trackEvent(ANALYTICS_EVENT_KEYS.images.table.exports.csv); +} + +function onRowVisibilityChange(metricKey: string) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + let hiddenMetrics = configData?.table?.hiddenMetrics || []; + if (hiddenMetrics?.includes(metricKey)) { + hiddenMetrics = hiddenMetrics.filter( + (hiddenMetric: any) => hiddenMetric !== metricKey, + ); + } else { + hiddenMetrics = [...hiddenMetrics, metricKey]; + } + const table = { + ...configData.table, + hiddenMetrics, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem('imagesTable', encode(table)); + updateModelData(config); + } +} + +function onTableResizeEnd(tableHeight: string) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + height: tableHeight, + }; + const config = { + ...configData, + table, + }; + model.setState({ + config, + }); + setItem('imagesTable', encode(table)); + } +} + +function onSelectRunQueryChange(query: string) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.select) { + const newConfig = { + ...configData, + select: { ...configData.select, query }, + images: { ...configData.images }, + }; + + model.setState({ + config: newConfig, + }); + } +} + +function onTableResizeModeChange(mode: ResizeModeEnum): void { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + resizeMode: mode, + }; + const config = { + ...configData, + table, + }; + model.setState({ + config, + }); + setItem('imagesTable', encode(table)); + } + analytics.trackEvent(ANALYTICS_EVENT_KEYS.images.table.changeResizeMode); +} + +function onSearchQueryCopy(): void { + const selectedMetricsData = model.getState()?.config?.select; + let query = getQueryStringFromSelect(selectedMetricsData as any); + if (query) { + onCopyToClipBoard(query, false, () => onNotificationAdd, { + notification: { + id: Date.now(), + severity: 'success', + messages: ['Run Expression Copied'], + }, + model, + }); + } +} + +function getQueryStringFromSelect( + selectData: IImagesExploreAppConfig['select'], + error?: ISyntaxErrorDetails, +) { + let query = '()'; + if (selectData === undefined) { + return query; + } + if (selectData.advancedMode) { + query = selectData.advancedQuery || ''; + } else { + const simpleInput = + selectData.query?.trim() && !error?.message + ? `(${selectData.query.trim()})` + : ''; + const selections = selectData.options?.length + ? `(${selectData.options + .map( + (option: ISelectOption) => + `(images.name == "${option.value?.option_name}"${ + option.value?.context === null + ? '' + : ' and ' + + Object.keys(option.value?.context) + .map( + (item) => + `images.context.${item} == ${formatValue( + (option.value?.context as any)[item], + )}`, + ) + .join(' and ') + })`, + ) + .join(' or ')})` + : ''; + + if (simpleInput && selections) { + query = `${simpleInput} and ${selections}`; + } else { + query = `${simpleInput}${selections}`; + } + } + return query.trim() || '()'; +} + +function onSelectAdvancedQueryChange(query: string) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.select) { + const newConfig = { + ...configData, + select: { ...configData.select, advancedQuery: query }, + images: { ...configData.images }, + }; + + model.setState({ + config: newConfig, + }); + } +} + +function onImagesExploreSelectChange(options: ISelectOption[]) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.select) { + const newConfig = { + ...configData, + select: { ...configData.select, options }, + images: { ...configData.images }, + }; + + model.setState({ + config: newConfig, + }); + } +} + +function toggleSelectAdvancedMode() { + const modelState: IImagesExploreAppModelState | any = model.getState(); + + if (modelState.config?.select) { + let query = + modelState.config.select.advancedQuery || + getQueryStringFromSelect( + modelState.config?.select, + modelState.selectFormData.error, + ); + if (query === '()') { + query = ''; + } + const newConfig = { + ...modelState.config, + select: { + ...modelState.config.select, + advancedQuery: query, + advancedMode: !modelState.config.select.advancedMode, + }, + }; + updateURL(newConfig); + + model.setState({ config: newConfig }); + } + + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.useAdvancedSearch} ${ + !modelState.config?.select.advancedMode ? 'on' : 'off' + }`, + ); +} + +function onColumnsOrderChange(columnsOrder: any) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + columnsOrder: columnsOrder, + }; + const config = { + ...configData, + table, + }; + + model.setState({ + config, + }); + setItem('imagesTable', encode(table)); + updateModelData(config); + } + analytics.trackEvent(ANALYTICS_EVENT_KEYS.images.table.changeColumnsOrder); +} + +function onColumnsVisibilityChange(hiddenColumns: string[] | string | any) { + onVisibilityChange({ + hiddenColumns, + model, + appName: AppNameEnum.IMAGES, + updateModelData, + }); +} + +function onTableDiffShow() { + const sameValueColumns = model.getState()?.sameValueColumns; + if (sameValueColumns) { + onColumnsVisibilityChange(sameValueColumns); + } + analytics.trackEvent(ANALYTICS_EVENT_KEYS.images.table.showDiff); +} + +function onRowHeightChange(height: RowHeightSize) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + rowHeight: height, + }; + const config = { + ...configData, + table, + }; + model.setState({ + config, + }); + setItem('imagesTable', encode(table)); + } + analytics.trackEvent( + `${ + ANALYTICS_EVENT_KEYS.images.table.changeTableRowHeight + } to "${RowHeightEnum[height].toLowerCase()}"`, + ); +} + +function onImageVisibilityChange(metricsKeys: string[]) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + const processedData = model.getState()?.data; + if (configData?.table && processedData) { + const table = { + ...configData.table, + hiddenMetrics: + metricsKeys[0] === 'all' + ? Object.values(processedData) + .map((metricCollection: any) => + metricCollection.data.map((metric: any) => metric.key), + ) + .flat() + : metricsKeys, + }; + const config = { + ...configData, + table, + }; + model.setState({ + config, + }); + setItem('imagesTable', encode(table)); + updateModelData(config); + } + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.table.metricVisibilityChange} ${ + metricsKeys[0] === 'all' + ? 'Visualize all hidden metrics from table' + : 'Hide all metrics from table' + }`, + ); +} + +function onSliceRangeChange(key: string, newValue: number[] | number) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.images) { + const images = { + ...configData.images, + [key]: newValue, + }; + const config = { + ...configData, + images, + }; + + model.setState({ + config, + }); + } +} + +function onDensityChange(name: string, value: number, metaData: any) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.images) { + const images = { + ...configData.images, + [name]: +value, + inputsValidations: { + ...configData.images?.inputsValidations, + [name]: metaData?.isValid, + }, + }; + const config = { + ...configData, + images, + }; + model.setState({ + config, + }); + } + applyBtnDisabledHandler(); +} + +function applyBtnDisabledHandler() { + const state = model.getState(); + const inputsValidations = state.config?.images?.inputsValidations || {}; + + const isInputsValid = + _.size( + Object.keys(inputsValidations).filter((key) => { + return inputsValidations[key] === false; + }), + ) <= 0; + + model.setState({ + ...state, + applyButtonDisabled: !isInputsValid, + }); +} + +const onImageSizeChange = _.throttle((value: number) => { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.images) { + const images = { + ...configData.images, + additionalProperties: { + ...configData.images.additionalProperties, + mediaItemSize: value, + }, + }; + const config = { + ...configData, + images, + }; + updateURL(config as IImagesExploreAppConfig); + model.setState({ + config, + }); + } + + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.imagesPanel.controls.changeImageProperties} / size`, + ); +}, IMAGE_SIZE_CHANGE_DELAY); + +function onImageRenderingChange(type: ImageRenderingEnum) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.images) { + const images = { + ...configData.images, + additionalProperties: { + ...configData.images.additionalProperties, + imageRendering: type, + }, + }; + const config = { + ...configData, + images, + }; + + updateURL(config as IImagesExploreAppConfig); + model.setState({ + config, + }); + } + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.imagesPanel.controls.changeImageProperties} / image rendering to ${type}`, + ); +} + +function onImageAlignmentChange( + option: { value: string; label: string } | null, +) { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.images) { + const images = { + ...configData.images, + additionalProperties: { + ...configData.images.additionalProperties, + alignmentType: option?.value, + }, + }; + const config = { + ...configData, + images, + }; + updateURL(config as IImagesExploreAppConfig); + model.setState({ config }); + } + + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.imagesPanel.controls.changeImageProperties} / Alignment to ${option?.label}`, + ); +} + +function showRangePanel() { + return ( + model.getState().requestStatus !== RequestStatusEnum.Pending && + !model.getState().queryIsEmpty + ); +} + +function archiveRuns( + ids: string[], + archived: boolean, +): { + call: () => Promise; + abort: () => void; +} { + runsArchiveRef = runsService.archiveRuns(ids, archived); + return { + call: async () => { + try { + await runsArchiveRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getImagesData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [ + `Runs are successfully ${ + archived ? 'archived' : 'unarchived' + } `, + ], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.images.table.archiveRunsBatch, + ); + } + }, + abort: runsArchiveRef.abort, + }; +} + +function deleteRuns(ids: string[]): { + call: () => Promise; + abort: () => void; +} { + runsDeleteRef = runsService.deleteRuns(ids); + return { + call: async () => { + try { + await runsDeleteRef + .call((detail) => exceptionHandler({ detail, model })) + .then(() => { + getImagesData(false, true).call(); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: ['Runs are successfully deleted'], + }, + model, + }); + }); + } catch (ex: Error | any) { + if (ex.name === 'AbortError') { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [ex.message], + }, + model, + }); + } + } finally { + analytics.trackEvent(ANALYTICS_EVENT_KEYS.images.table.deleteRunsBatch); + } + }, + abort: runsDeleteRef.abort, + }; +} + +function onRowSelect({ + actionType, + data, +}: { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; +}): void { + return onRowSelectAction({ actionType, data, model }); +} + +function onModelNotificationDelete(id: number): void { + onNotificationDelete({ id, model }); +} + +function onStackingToggle(): void { + const configData: IImagesExploreAppConfig | undefined = + model.getState()?.config; + if (configData?.images) { + const images = { + ...configData.images, + additionalProperties: { + ...configData.images.additionalProperties, + stacking: !configData.images.additionalProperties.stacking, + }, + }; + const config = { ...configData, images }; + updateURL(config as IImagesExploreAppConfig); + model.setState({ config }); + analytics.trackEvent( + `${ANALYTICS_EVENT_KEYS.images.imagesPanel.controls.groupStacking} to ${ + !configData.images.additionalProperties.stacking + ? 'Enabled' + : 'Disabled' + }`, + ); + } +} + +const imagesExploreAppModel = { + ...model, + initialize, + getImagesData, + abortRequest, + setComponentRefs, + onGroupingSelectChange, + onGroupingModeChange, + onGroupingReset, + onGroupingApplyChange, + onNotificationDelete: onModelNotificationDelete, + onNotificationAdd, + onResetConfigData, + updateURL, + updateModelData, + onBookmarkUpdate, + onBookmarkCreate, + getAppConfigData, + setDefaultAppConfigData, + updateColumnsWidths, + onTableSortChange, + onSortReset, + onExportTableData, + onRowVisibilityChange, + onTableResizeEnd, + onTableResizeModeChange, + onSearchQueryCopy, + getQueryStringFromSelect, + onSelectRunQueryChange, + onSelectAdvancedQueryChange, + onImagesExploreSelectChange, + toggleSelectAdvancedMode, + onColumnsOrderChange, + onColumnsVisibilityChange, + onTableDiffShow, + onRowHeightChange, + onImageVisibilityChange, + onSliceRangeChange, + onDensityChange, + getImagesBlobsData, + onChangeTooltip, + onActivePointChange, + onImageSizeChange, + onImageRenderingChange, + onImageAlignmentChange, + showRangePanel, + getDataAsImageSet, + onStackingToggle, + onImagesSortChange, + onImagesSortReset, + deleteRuns, + archiveRuns, + onRowSelect, + onRunsTagsChange: onModelRunsTagsChange, +}; + +export default imagesExploreAppModel; diff --git a/src/src/services/models/media/blobsURIModel.ts b/src/src/services/models/media/blobsURIModel.ts new file mode 100644 index 00000000..164b0669 --- /dev/null +++ b/src/src/services/models/media/blobsURIModel.ts @@ -0,0 +1,5 @@ +import createModel from '../model'; + +const blobsURIModel = createModel<{ [key: string]: string }>({}); + +export default blobsURIModel; diff --git a/src/src/services/models/metrics/metricModel.ts b/src/src/services/models/metrics/metricModel.ts new file mode 100644 index 00000000..e45842af --- /dev/null +++ b/src/src/services/models/metrics/metricModel.ts @@ -0,0 +1,7 @@ +import { IMetric } from 'types/services/models/metrics/metricModel'; + +function createMetricModel(metricData: IMetric): IMetric { + return metricData; +} + +export default createMetricModel; diff --git a/src/src/services/models/metrics/metricsAppModel.ts b/src/src/services/models/metrics/metricsAppModel.ts new file mode 100644 index 00000000..f64ad2e5 --- /dev/null +++ b/src/src/services/models/metrics/metricsAppModel.ts @@ -0,0 +1,5 @@ +import { appInitialConfig, createAppModel } from 'services/models/explorer'; + +const metricAppModel = createAppModel(appInitialConfig.METRICS) as any; + +export default metricAppModel; diff --git a/src/src/services/models/metrics/runModel.ts b/src/src/services/models/metrics/runModel.ts new file mode 100644 index 00000000..957fd57f --- /dev/null +++ b/src/src/services/models/metrics/runModel.ts @@ -0,0 +1,11 @@ +import { + IMetricTrace, + IParamTrace, + IRun, +} from 'types/services/models/metrics/runModel'; + +export function createRunModel( + runData: IRun, +): IRun { + return runData; +} diff --git a/src/src/services/models/model.ts b/src/src/services/models/model.ts new file mode 100644 index 00000000..e2fc3f83 --- /dev/null +++ b/src/src/services/models/model.ts @@ -0,0 +1,47 @@ +import { IModel } from 'types/services/models/model'; + +function createModel(initialState: StateType): IModel { + let state: StateType | null = { ...initialState }; + const subscriptions: { [key: string]: { (data: StateType): void }[] } = { + INIT: [], + UPDATE: [], + }; + + function emit(evt: string, stateUpdate: StateType) { + state = Object.assign(state, stateUpdate); + (subscriptions[evt] || []).forEach((fn) => fn(stateUpdate)); + } + + return { + // @TODO think to change model structure and remove init step from model lifecycle + init: () => { + state = Object.assign({}, initialState); + (subscriptions.INIT || []).forEach((fn) => fn(initialState)); + }, + destroy: () => { + subscriptions.INIT = []; + subscriptions.UPDATE = []; + state = { ...initialState }; + }, + getState: () => Object.assign({}, state), + setState: (stateUpdate: StateType) => { + emit('UPDATE', stateUpdate); + }, + emit, + subscribe: (evt: string, fn: (data: StateType) => void) => { + if (subscriptions.hasOwnProperty(evt)) { + subscriptions[evt].push(fn); + } else { + subscriptions[evt] = [fn]; + } + + return { + unsubscribe: () => { + subscriptions[evt].splice(subscriptions[evt].indexOf(fn) >>> 0, 1); + }, + }; + }, + }; +} + +export default createModel; diff --git a/src/src/services/models/notes/notesModel.ts b/src/src/services/models/notes/notesModel.ts new file mode 100644 index 00000000..71c3d9cc --- /dev/null +++ b/src/src/services/models/notes/notesModel.ts @@ -0,0 +1,190 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { NotesNotificationsEnum } from 'config/notification-messages/notificationMessages'; + +import notesService from 'services/api/notes/notesService'; +import * as analytics from 'services/analytics'; + +import { + INote, + INoteReqBody, + INotesAppModelState, + INotesList, +} from 'types/services/models/notes/notes'; +import { IApiRequest } from 'types/services/services'; + +import onNotificationAdd from 'utils/app/onNotificationAdd'; +import exceptionHandler from 'utils/app/exceptionHandler'; +import onNotificationDelete from 'utils/app/onNotificationDelete'; + +import createModel from '../model'; + +const model = createModel>({ + isLoading: true, + noteData: undefined, + notifyData: [], +}); + +// Request references +let getNotesListRequestRef: IApiRequest; + +// Initializing model +function initialize(runId: string): void { + model.init(); + try { + getNotesListRequestRef = onNotesListFetch(runId); + getNotesListRequestRef.call(); + } catch (err: any) { + handleErrorNotification(err); + getNotesListRequestRef?.abort(); + model.setState({ isLoading: false }); + } +} + +// API CRUD functionality + +function onNotesListFetch(runId: string) { + const { call, abort } = notesService.getNotes(runId); + return { + call: async () => { + call((detail: any) => { + exceptionHandler({ detail, model }); + model.setState({ isLoading: false }); + }).then(async (data: INotesList) => { + model.setState({ + noteData: data[0], + isLoading: false, + }); + }); + }, + abort, + }; +} + +function onNoteCreate(runId: string, reqBody: INoteReqBody): void { + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.runDetails.tabs.notes.clickSaveButton, + ); + const { call, abort } = notesService.createNote(runId, reqBody); + try { + model.setState({ isLoading: true }); + call((detail: any) => { + exceptionHandler({ detail, model }); + model.setState({ isLoading: false }); + }).then((noteData: INote) => { + model.setState({ + noteData: { + content: reqBody.content, + id: noteData.id, + created_at: noteData.created_at, + }, + isLoading: false, + }); + handleSuccessNotification(NotesNotificationsEnum.CREATE); + }); + } catch (err: any) { + abort(); + handleErrorNotification(err); + model.setState({ + isLoading: false, + }); + } +} + +function onNoteUpdate(runId: string, reqBody: INoteReqBody): void { + const { id, created_at } = model.getState().noteData!; + const { call, abort } = notesService.updateNote(runId, id, reqBody); + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.runDetails.tabs.notes.clickUpdateButton, + ); + try { + model.setState({ + isLoading: true, + }); + call((detail: any) => { + exceptionHandler({ detail, model }); + model.setState({ isLoading: false }); + }).then((noteData: INote) => { + model.setState({ + noteData: { ...noteData, created_at }, + isLoading: false, + }); + handleSuccessNotification(NotesNotificationsEnum.UPDATE); + }); + } catch (err: any) { + abort(); + handleErrorNotification(err); + model.setState({ isLoading: false }); + } +} + +function onNoteDelete(runId: string): void { + const { id } = model.getState().noteData!; + const { call, abort } = notesService.deleteNote(runId, id); + analytics.trackEvent( + ANALYTICS_EVENT_KEYS.runDetails.tabs.notes.clickDeleteButton, + ); + try { + model.setState({ + isLoading: true, + }); + call((detail: any) => { + exceptionHandler({ detail, model }); + model.setState({ isLoading: false }); + }).then((response: { status: string }) => { + model.setState({ + noteData: null, + isLoading: false, + }); + handleSuccessNotification(NotesNotificationsEnum.DELETE); + }); + } catch (err: any) { + abort(); + handleErrorNotification(err); + model.setState({ isLoading: false }); + } +} + +// Notification Handlers +function handleErrorNotification(err: any): void { + onNotificationAdd({ + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + model, + }); +} + +function handleSuccessNotification(message: NotesNotificationsEnum): void { + onNotificationAdd({ + notification: { + id: Date.now(), + messages: [message], + severity: 'success', + }, + model, + }); +} + +function onNoteNotificationDelete(id: number): void { + onNotificationDelete({ id, model }); +} + +// Destroying model on component unmount +function destroy(): void { + getNotesListRequestRef?.abort(); + model.destroy(); +} + +const notesModel = { + ...model, + initialize, + destroy, + onNoteCreate, + onNoteUpdate, + onNoteDelete, + onNoteNotificationDelete, +}; + +export default notesModel; diff --git a/src/src/services/models/params/paramsAppModel.ts b/src/src/services/models/params/paramsAppModel.ts new file mode 100644 index 00000000..8a556963 --- /dev/null +++ b/src/src/services/models/params/paramsAppModel.ts @@ -0,0 +1,5 @@ +import { appInitialConfig, createAppModel } from 'services/models/explorer'; + +const paramsAppModel = createAppModel(appInitialConfig.PARAMS) as any; + +export default paramsAppModel; diff --git a/src/src/services/models/projects/projectsModel.ts b/src/src/services/models/projects/projectsModel.ts new file mode 100644 index 00000000..4422c903 --- /dev/null +++ b/src/src/services/models/projects/projectsModel.ts @@ -0,0 +1,110 @@ +import projectsService from 'services/api/projects/projectsService'; +import createModel from 'services/models/model'; + +import { + IPinnedSequencesResData, + IProject, + IProjectParamsMetrics, + IProjectsModelState, +} from 'types/services/models/projects/projectsModel'; + +import exceptionHandler from 'utils/app/exceptionHandler'; + +const model = createModel>({}); + +function getProjectsData() { + const { call, abort } = projectsService.getProjectsData(); + + model.init(); + + return { + call: () => + call((detail: any) => { + exceptionHandler({ detail, model }); + }).then((data: IProject) => { + //@ts-ignore + window.telemetry_enabled = data.telemetry_enabled; + model.setState({ + project: data, + }); + }), + abort, + }; +} + +function getProjectParams(sequences: string[] = ['metric']) { + const { call, abort } = projectsService.getProjectParams(sequences); + + return { + call: () => + call((detail: any) => { + exceptionHandler({ detail, model }); + }).then((data: IProjectParamsMetrics) => { + model.setState({ + metrics: data.metric, + images: data.images, + params: removeExampleTypes(data.params), + }); + }), + abort, + }; +} + +function removeExampleTypes(params: IProjectParamsMetrics['params']) { + for (let paramKey in params) { + const param = params[paramKey]; + if (typeof param === 'object') { + if (param.hasOwnProperty('__example_type__')) { + params[paramKey] = true; + } else { + removeExampleTypes(param); + } + } else { + params[paramKey] = true; + } + } + return params; +} + +function getPinnedSequences() { + const { call, abort } = projectsService.getPinnedSequences(); + + return { + call: () => + call((detail: IPinnedSequencesResData | Error) => { + exceptionHandler({ detail, model }); + }).then((data: IPinnedSequencesResData) => { + model.setState({ + pinnedSequences: data.sequences, + }); + }), + abort, + }; +} + +function setPinnedSequences( + pinnedSequences: IPinnedSequencesResData, + errorHandler: (detail: unknown) => void, +) { + const { call, abort } = projectsService.setPinnedSequences(pinnedSequences); + + return { + call: () => + call(errorHandler).then((data: IPinnedSequencesResData) => { + model.setState({ + pinnedSequences: data.sequences, + }); + }), + abort, + }; +} + +const projectsModel = { + ...model, + getProjectsData, + getProjectParams, + getPinnedSequences, + setPinnedSequences, +}; + +export default projectsModel; diff --git a/src/src/services/models/runs/runDetailAppModel.ts b/src/src/services/models/runs/runDetailAppModel.ts new file mode 100644 index 00000000..1a60db76 --- /dev/null +++ b/src/src/services/models/runs/runDetailAppModel.ts @@ -0,0 +1,403 @@ +import _ from 'lodash-es'; + +import { IRunBatch } from 'pages/RunDetail/types'; + +import runsService from 'services/api/runs/runsService'; +import * as analytics from 'services/analytics'; +import experimentsService from 'services/api/experiments/experimentsService'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { IApiRequest } from 'types/services/services'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import exceptionHandler from 'utils/app/exceptionHandler'; +import { encode } from 'utils/encoder/encoder'; +import contextToString from 'utils/contextToString'; +import alphabeticalSortComparator from 'utils/alphabeticalSortComparator'; +import { + decodeBufferPairs, + decodePathsVals, + iterFoldTree, +} from 'utils/encoder/streamEncoding'; +import { filterSingleRunMetricsData } from 'utils/app/filterMetricData'; + +import createModel from '../model'; + +const model = createModel>({ + isRunInfoLoading: true, + isExperimentsLoading: false, + isRunBatchLoading: false, + isRunsOfExperimentLoading: false, + isRunLogsLoading: false, + isLoadMoreButtonShown: true, +}); + +let getRunsInfoRequestRef: IApiRequest; +let getRunsBatchRequestRef: IApiRequest; +let getExperimentsDataRequestRef: IApiRequest; +let getRunsOfExperimentRequestRef: IApiRequest; +let getRunsLogsRequestRef: IApiRequest; + +function initialize() { + model.init(); +} + +function getExperimentsData() { + if (getExperimentsDataRequestRef) { + getExperimentsDataRequestRef.abort(); + } + getExperimentsDataRequestRef = runsService.getExperimentsData(); + return { + call: async () => { + model.setState({ isExperimentsLoading: true }); + const data = await getExperimentsDataRequestRef.call((detail: any) => { + exceptionHandler({ detail, model }); + }); + model.setState({ + isExperimentsLoading: false, + experimentsData: _.orderBy(data, ['name'], ['asc']), + }); + return data; + }, + abort: getExperimentsDataRequestRef.abort, + }; +} + +function getRunInfo(runHash: string): IApiRequest { + if (getRunsInfoRequestRef) { + getRunsInfoRequestRef.abort(); + } + getRunsInfoRequestRef = runsService.getRunInfo(runHash); + return { + call: async () => { + model.setState({ isRunInfoLoading: true }); + const data = await getRunsInfoRequestRef.call((detail: any) => { + exceptionHandler({ detail, model }); + }); + model.setState({ + runParams: data.params, + runTraces: data.traces, + runInfo: data.props, + runArtifacts: data.artifacts, + experimentId: data.props.experiment.id, + isRunInfoLoading: false, + }); + return data; + }, + abort: getRunsInfoRequestRef.abort, + }; +} + +function getRunsOfExperiment( + runHash: string, + params?: { limit: number; offset?: string }, + isLoadingMore?: boolean, +) { + if (getRunsOfExperimentRequestRef) { + getRunsOfExperimentRequestRef.abort(); + } + getRunsOfExperimentRequestRef = experimentsService.getRunsOfExperiment( + runHash, + params, + ); + return { + call: async () => { + model.setState({ isRunsOfExperimentLoading: true }); + const data = await getRunsOfExperimentRequestRef.call((detail: any) => { + exceptionHandler({ detail, model }); + }); + const runsOfExperiment = isLoadingMore + ? [...(model.getState().runsOfExperiment || []), ...data.runs] + : [...data.runs]; + model.setState({ + runsOfExperiment, + isRunsOfExperimentLoading: false, + experimentId: data.id, + isLoadMoreButtonShown: data.runs.length === 10, + }); + }, + abort: getRunsOfExperimentRequestRef.abort, + }; +} + +function processRunBatchData( + data: IRunBatch[], + metricsBatch: IRunBatch[], + systemBatch: IRunBatch[], +): { + runMetricsBatch: IRunBatch[]; + runSystemBatch: IRunBatch[]; +} { + const runMetricsBatch: IRunBatch[] = metricsBatch?.slice() ?? []; + const runSystemBatch: IRunBatch[] = systemBatch?.slice() ?? []; + + for (let run of data) { + const { values, iters } = filterSingleRunMetricsData(run); + const contextName = + contextToString(run.context) === '' + ? '' + : `_${contextToString(run.context)}`; + const metric = { + ...run, + values, + iters, + key: encode({ + name: run.name, + context: run.context, + }), + sortKey: `${run.name}${contextName}`, + }; + if (run.name.startsWith('__system__')) { + runSystemBatch.push(metric); + } else { + runMetricsBatch.push(metric); + } + } + + // sort run batch data + runMetricsBatch.sort(alphabeticalSortComparator({ orderBy: 'sortKey' })); + runSystemBatch.sort(alphabeticalSortComparator({ orderBy: 'sortKey' })); + + return { + runMetricsBatch: _.uniqBy(runMetricsBatch, 'sortKey'), + runSystemBatch: _.uniqBy(runSystemBatch, 'sortKey'), + }; +} + +function getRunMetricsBatch(body: any, runHash: string) { + if (getRunsBatchRequestRef) { + getRunsBatchRequestRef.abort(); + } + getRunsBatchRequestRef = runsService.getRunMetricsBatch(body, runHash); + return { + call: async () => { + try { + const data = await getRunsBatchRequestRef.call(); + const { runMetricsBatch, runSystemBatch } = processRunBatchData( + data, + model.getState().runMetricsBatch, + model.getState().runSystemBatch, + ); + + model.setState({ + ...model.getState(), + runMetricsBatch, + runSystemBatch, + isRunBatchLoading: false, + }); + } catch (ex: Error | any) { + if (ex.name !== 'AbortError') { + exceptionHandler({ detail: ex, model }); + } + } + }, + abort: getRunsBatchRequestRef.abort, + }; +} + +function getRunLogs({ + runHash, + record_range, + isLiveUpdate = false, + isLoadMore = false, +}: { + runHash: string; + record_range?: string; + isLiveUpdate?: boolean; + isLoadMore?: boolean; +}) { + if (getRunsLogsRequestRef) { + getRunsLogsRequestRef.abort(); + } + getRunsLogsRequestRef = runsService.getRunLogs(runHash, record_range); + return { + call: async () => { + const runLogs = model.getState()?.runLogs ?? {}; + if (!isLiveUpdate) { + model.setState({ isRunLogsLoading: true }); + } + + const stream = await getRunsLogsRequestRef.call((detail: any) => { + exceptionHandler({ detail, model }); + }); + let bufferPairs = decodeBufferPairs(stream); + let decodedPairs = decodePathsVals(bufferPairs); + let objects = iterFoldTree(decodedPairs, 1); + const runLogsData: { [key: string]: any } = {}; + for await (let [keys, val] of objects) { + runLogsData[keys[0]] = { index: +keys[0], value: val }; + } + const updatedLogsData: { [key: string]: any } = { + ...runLogs, + ...runLogsData, + }; + + model.setState({ + runLogs: updatedLogsData, + updatedLogsCount: + isLiveUpdate || isLoadMore + ? _.keys(updatedLogsData).length - _.keys(runLogs).length + : 0, + isRunLogsLoading: false, + }); + }, + abort: getRunsLogsRequestRef.abort, + }; +} + +function archiveRun(id: string, archived: boolean = false) { + const state = model.getState(); + runsService + .archiveRun(id, archived) + .call((detail) => { + exceptionHandler({ detail, model }); + }) + .then((res: any) => { + model.setState({ + ...state, + runInfo: { + ...state?.runInfo, + archived, + }, + }); + if (res.id) { + onNotificationAdd({ + id: Date.now(), + severity: 'success', + messages: [ + archived + ? 'Run successfully archived' + : 'Run successfully unarchived', + ], + }); + } else { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: ['Something went wrong'], + }); + } + analytics.trackEvent( + archived ? '[RunDetail] Archive Run' : '[RunDetail] Unarchive Run', + ); + }); +} + +function deleteRun(id: string, successCallback: () => void = _.noop) { + try { + runsService + .deleteRun(id) + .call((detail) => { + exceptionHandler({ model, detail }); + }) + .then((res: any) => { + if (res.id) { + successCallback(); + } else { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: ['Something went wrong'], + }); + } + }); + } catch (err: any) { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: [err.message], + }); + } +} + +function editRunNameAndDescription( + id: string, + name: string, + description: string, + archived: boolean, +) { + try { + runsService + .editRunNameAndDescription(id, name, description, archived) + .call((detail) => { + exceptionHandler({ model, detail }); + }) + .then((res: any) => { + const state = model.getState(); + + model.setState({ + ...state, + runInfo: { + ...state?.runInfo, + name, + description, + }, + }); + if (res.id) { + onNotificationAdd({ + id: Date.now(), + severity: 'success', + messages: ['Changes successfully saved'], + }); + } else { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: ['Something went wrong'], + }); + } + analytics.trackEvent('[RunDetail] Edit Run name and description'); + }); + } catch (err: any) { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: [err.message], + }); + } +} + +function editTags(tags: ITagInfo[]) { + const state = model.getState(); + + model.setState({ + ...state, + runInfo: { + ...state?.runInfo, + tags, + }, + }); +} + +function onNotificationDelete(id: number) { + let notifyData: INotification[] | [] = model.getState()?.notifyData || []; + notifyData = [...notifyData].filter((i) => i.id !== id); + model.setState({ notifyData }); +} + +function onNotificationAdd(notification: INotification) { + let notifyData: INotification[] | [] = model.getState()?.notifyData || []; + notifyData = [...notifyData, notification]; + model.setState({ notifyData }); + setTimeout(() => { + onNotificationDelete(notification.id); + }, 3000); +} + +const runDetailAppModel = { + ...model, + initialize, + getRunInfo, + getRunLogs, + getRunMetricsBatch, + getExperimentsData, + getRunsOfExperiment, + archiveRun, + deleteRun, + onNotificationAdd, + onNotificationDelete, + editRunNameAndDescription, + editTags, +}; + +export default runDetailAppModel; diff --git a/src/src/services/models/runs/runTracesModel.ts b/src/src/services/models/runs/runTracesModel.ts new file mode 100644 index 00000000..1682d21f --- /dev/null +++ b/src/src/services/models/runs/runTracesModel.ts @@ -0,0 +1,347 @@ +// eslint-disable-next-line react-hooks/exhaustive-deps +import _ from 'lodash-es'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import createModel from 'services/models/model'; +import runsService from 'services/api/runs/runsService'; +import { trackEvent } from 'services/analytics'; + +import { + decodeBufferPairs, + decodePathsVals, + iterFoldTree, +} from 'utils/encoder/streamEncoding'; + +import settings from './settings'; +import { + TraceResponseData, + TraceRawDataItem, + IRunTraceModel, + RangePanelItem, + TraceType, + QueryData, + IConfig, +} from './types'; +import { + getContextObjFromMenuActiveKey, + getMenuData, + reformatArrayQueries, + VisualizationMenuTitles, +} from './util'; + +// @TODO implement type +let getTraceBatchRequestRef: any = null; + +const model = createModel>({}); + +function getDefaultQueryAndConfigData(traceType: TraceType) { + const traceSettings = settings[traceType]; + const queryData: QueryData = { + sliders: {}, + inputs: {}, + inputsValidations: {}, + }; + const config: IConfig = { + rangePanel: [], + }; + + const inputKeys = Object.keys(traceSettings?.inputs); + + Object.keys(traceSettings.sliders).forEach((key, index) => { + const item = traceSettings.sliders[key]; + queryData.sliders[key] = item.defaultValue; + const correspondedInput = traceSettings.inputs[inputKeys[index]]; + // inject range panel data + const processedItem: RangePanelItem = { + sliderName: key, + inputName: inputKeys[index], + sliderTitle: item.title, + inputTitle: correspondedInput.title, + sliderTitleTooltip: item.tooltip, + inputTitleTooltip: correspondedInput.tooltip, + sliderType: item.sliderType, + inputValidationPatterns: traceSettings.inputValidation, + infoPropertyName: item?.infoPropertyName, + }; + + config.rangePanel.push(processedItem); + }); + Object.keys(traceSettings.inputs).forEach((key) => { + queryData.inputs[key] = traceSettings.inputs[key].defaultValue; + }); + + return { queryData, config }; +} + +function initialize( + run_id: string, + traceType: TraceType, + traces: TraceRawDataItem[], + runParams?: object, +) { + model.init(); + + const { data, availableIds, title, defaultActiveKey, defaultActiveName } = + getMenuData(traceType, traces); + + const { queryData, config } = getDefaultQueryAndConfigData(traceType); + + // setMenuData + model.setState({ + config, + queryData, + isApplyBtnDisabled: false, + traceType, + runHash: run_id, + isTraceBatchLoading: true, + runParams, + menu: { + title, + items: data, + defaultActiveItemKey: defaultActiveKey, + activeItemKey: defaultActiveKey, + availableKeys: availableIds, + activeItemName: defaultActiveName, + }, + batchRequestOptions: { + trace: getContextObjFromMenuActiveKey(defaultActiveKey, availableIds), + query: null, + }, + }); + + getRunTraceBatch(true).then().catch(); +} + +function changeActiveItemKey(key: string, name: string) { + const state = model.getState(); + const menuState = state.menu; + const batchRequestOptions = state.batchRequestOptions; + const traceType = state.traceType || 'distributions'; + + const batchRequestTrace = getContextObjFromMenuActiveKey( + key || '', + menuState?.availableKeys || [], + ); + + model.setState({ + ...state, + ...getDefaultQueryAndConfigData(traceType), + isTraceContextBatchLoading: true, + menu: { + ...menuState, + activeItemKey: key, + activeItemName: name, + }, + batchRequestOptions: { + ...batchRequestOptions, + trace: batchRequestTrace, + }, + }); + + getRunTraceBatch(true).then().catch(); + + trackEvent( + // @ts-ignore + ANALYTICS_EVENT_KEYS.runDetails.tabs[state.traceType].changeActiveItemKey, + ); +} + +function abortGetTraceBatchBatchRequest() { + if (getTraceBatchRequestRef) { + getTraceBatchRequestRef?.abort(); + getTraceBatchRequestRef = null; + } +} + +function getInitialSliderValues(processedData: any, sliderKeys: string[]) { + const values: Record = {}; + sliderKeys.forEach((key) => { + values[key] = processedData[key]; + }); + + return values; +} + +async function getRunTraceBatch(isInitial = false) { + abortGetTraceBatchBatchRequest(); + + const state = model.getState(); + const traceType = state.traceType || 'distributions'; + const requestOptions = state.batchRequestOptions; + const queryData = state.queryData; + + let paramsToApi = settings[traceType].paramsToApi; + + if (!paramsToApi) { + paramsToApi = (queryData?: QueryData) => { + return { + ...(!isInitial ? reformatArrayQueries(queryData?.sliders) : {}), + ...queryData?.inputs, + }; + }; + } + + if (traceType === 'figures') { + getTraceBatchRequestRef = runsService.getBatchByStep( + state.runHash || '', + traceType, + paramsToApi(queryData), + [requestOptions?.trace], + ); + } else { + getTraceBatchRequestRef = runsService.getBatch( + state.runHash || '', + traceType, + paramsToApi(queryData), + [requestOptions?.trace], + ); + } + try { + model.setState({ + ...state, + batchRequestOptions: { + ...requestOptions, + params: queryData, + }, + isTraceBatchLoading: true, + }); + const stream = await getTraceBatchRequestRef?.call((detail: any) => { + // @TODO add exception + // eslint-disable-next-line no-console + console.error(detail); + }); + + let bufferPairs = decodeBufferPairs(stream); + let decodedPairs = decodePathsVals(bufferPairs); + let objects = iterFoldTree(decodedPairs, 1); + + let data: Partial = {}; + for await (let [keys, val] of objects) { + data = { + ...data, + [keys[0]]: val, + }; + } + const parsed = settings[state.traceType || 'distributions'].dataProcessor( + data, + state?.runParams, + ); + if (isInitial) { + const sliders = getInitialSliderValues( + parsed, + Object.keys(queryData?.sliders || {}), + ); + if (queryData) { + queryData.sliders = sliders; + Object.keys(queryData.inputs).forEach((key: string) => { + const subKey = key.slice(0, key.indexOf('_')); + const range = parsed[`${subKey}_range`]; + if ( + parsed.processedDataType === VisualizationMenuTitles.figures && + (queryData.inputs[key] < range[0] || + queryData.inputs[key] > range[1]) + ) { + queryData.inputs[key] = range[1] ?? 1; + } else if ( + (parsed.processedDataType !== VisualizationMenuTitles.figures && + queryData.inputs[key] < 0) || + queryData.inputs[key] > range[1] + ) { + const rangeLength = _.range(range[0], range[1] + 1).length; + queryData.inputs[key] = rangeLength > 0 ? rangeLength : 1; + } else { + queryData.inputs[key] = queryData.inputs[key] ?? 1; + } + }); + } + } + model.setState({ + ...state, + data: parsed, + queryData, + isTraceBatchLoading: false, + isTraceContextBatchLoading: false, + }); + } catch (e) { + model.setState({ + ...state, + isTraceBatchLoading: false, + }); + // @TODO handle exception + throw e; + } +} + +function applyBtnDisabledHandler() { + const state = model.getState(); + const inputsValidations = state.queryData?.inputsValidations || {}; + + const isInputsValid = + _.size( + Object.keys(inputsValidations).filter((key) => !inputsValidations[key]), + ) <= 0; + + model.setState({ + ...state, + isApplyBtnDisabled: !isInputsValid, + }); +} + +function onInputChange(name: string, value: number, isValid: boolean = true) { + const state = model.getState(); + model.setState({ + ...state, + queryData: { + ...state.queryData, + inputs: { + ...state.queryData?.inputs, + [name]: value, + }, + inputsValidations: { + ...state.queryData?.inputsValidations, + [name]: isValid, + }, + }, + }); + + applyBtnDisabledHandler(); +} + +function onRangeChange(name: string, value: number | number[]) { + const state = model.getState(); + model.setState({ + ...state, + queryData: { + ...state.queryData, + sliders: { + ...state.queryData?.sliders, + [name]: value, + }, + }, + }); +} + +function onApply() { + const { traceType } = model.getState(); + getRunTraceBatch().then().catch(); + // @ts-ignore + trackEvent(ANALYTICS_EVENT_KEYS.runDetails.tabs[traceType].clickApplyButton); +} + +function destroy() { + model.destroy(); + abortGetTraceBatchBatchRequest(); +} + +const runTracesModel = { + ...model, + destroy, + onApply, + initialize, + onInputChange, + onRangeChange, + changeActiveItemKey, +}; + +export default runTracesModel; diff --git a/src/src/services/models/runs/runsAppModel.ts b/src/src/services/models/runs/runsAppModel.ts new file mode 100644 index 00000000..9ee6f8d8 --- /dev/null +++ b/src/src/services/models/runs/runsAppModel.ts @@ -0,0 +1,5 @@ +import { appInitialConfig, createAppModel } from 'services/models/explorer'; + +const runsAppModel = createAppModel(appInitialConfig.RUNS) as any; + +export default runsAppModel; diff --git a/src/src/services/models/runs/settings.ts b/src/src/services/models/runs/settings.ts new file mode 100644 index 00000000..f98d7e2b --- /dev/null +++ b/src/src/services/models/runs/settings.ts @@ -0,0 +1,187 @@ +import { IValidationPatterns } from 'components/kit/Input'; + +import { QueryData } from './types'; +import { + processDistributionsData, + processImagesData, + processTextsData, + processPlotlyData, + processAudiosData, +} from './util'; + +type InputItem = { + title: string; + defaultValue: number; + tooltip: string; +}; + +type SliderItem = { + title: string; + defaultValue: [number, number]; + tooltip: string; + sliderType: 'single' | 'range'; // This type is same as SliderWithInput component sliderType prop type. + infoPropertyName?: string; +}; + +type SettingItem = { + dataProcessor: Function; + sliders: Record; + inputs: Record; + paramsToApi?: (queryData?: QueryData) => Record; + inputValidation?: (...args: any) => IValidationPatterns; +}; + +const settings: Record = { + distributions: { + dataProcessor: processDistributionsData, + sliders: { + record_range: { + defaultValue: [0, 50], + title: 'Steps', + tooltip: 'Training step. Increments every time track() is called', + sliderType: 'range', + infoPropertyName: 'step', + }, + }, + inputs: { + record_density: { + defaultValue: 50, + title: 'Steps', + tooltip: 'Number of steps to display', + }, + }, + }, + images: { + dataProcessor: processImagesData, + sliders: { + record_range: { + defaultValue: [0, 50], + tooltip: 'Training step. Increments every time track() is called', + title: 'Steps', + sliderType: 'range', + infoPropertyName: 'step', + }, + index_range: { + defaultValue: [0, 50], + tooltip: 'Index in the list of images passed to track() call', + title: 'Indices', + sliderType: 'range', + infoPropertyName: 'index', + }, + }, + inputs: { + record_density: { + defaultValue: 50, + title: 'Steps count', + tooltip: 'Number of steps to display', + }, + index_density: { + defaultValue: 5, + title: 'Indices count', + tooltip: 'Number of images per step', + }, + }, + }, + audios: { + dataProcessor: processAudiosData, + sliders: { + record_range: { + defaultValue: [0, 50], + tooltip: 'Training step. Increments every time track() is called', + title: 'Steps', + sliderType: 'range', + infoPropertyName: 'step', + }, + index_range: { + defaultValue: [0, 50], + tooltip: 'Index in the list of audios passed to track() call', + title: 'Indices', + sliderType: 'range', + infoPropertyName: 'index', + }, + }, + inputs: { + record_density: { + defaultValue: 50, + title: 'Steps count', + tooltip: 'Number of steps to display', + }, + index_density: { + defaultValue: 5, + title: 'Indices count', + tooltip: 'Number of audios per step', + }, + }, + }, + texts: { + dataProcessor: processTextsData, + sliders: { + record_range: { + defaultValue: [0, 50], + tooltip: 'Training step. Increments every time track() is called', + title: 'Steps', + sliderType: 'range', + infoPropertyName: 'step', + }, + index_range: { + defaultValue: [0, 50], + tooltip: 'Index in the list of texts passed to track() call', + title: 'Indices', + sliderType: 'range', + infoPropertyName: 'index', + }, + }, + inputs: { + record_density: { + defaultValue: 50, + title: 'Steps count', + tooltip: 'Number of steps to display', + }, + index_density: { + defaultValue: 5, + title: 'Indices count', + tooltip: 'Number of texts per step', + }, + }, + }, + figures: { + dataProcessor: processPlotlyData, + paramsToApi: (queryData?: QueryData) => { + const record_step = queryData?.inputs?.record_range ?? -1; + return record_step !== -1 + ? { + record_step, + record_density: 1, + } + : { record_density: 1 }; + }, + inputValidation: (min: number | string, max: number | string) => [ + { + errorCondition: (value: string | number) => +value < min, + errorText: `Value should be equal or greater then ${min}`, + }, + { + errorCondition: (value: string | number) => +value > max, + errorText: `Value should be equal or smaller then ${max}`, + }, + ], + sliders: { + record_range: { + defaultValue: [0, 0], + tooltip: 'Training step. Increments every time track() is called', + title: 'Step', + sliderType: 'single', + infoPropertyName: 'step', + }, + }, + inputs: { + record_range: { + defaultValue: -1, + tooltip: 'Training step. To see figures tracked in the step.', + title: 'Step', + }, + }, + }, +}; + +export default settings; diff --git a/src/src/services/models/runs/types.d.ts b/src/src/services/models/runs/types.d.ts new file mode 100644 index 00000000..7ef0d945 --- /dev/null +++ b/src/src/services/models/runs/types.d.ts @@ -0,0 +1,138 @@ +import { IValidationPatterns } from 'components/kit/Input'; +import { IMenuItem } from 'components/kit/Menu'; + +export type IRunTraceModel = { + runHash: string; + traceType: TraceType; + isTraceBatchLoading: boolean; + isTraceContextBatchLoading: boolean; + menu: { + title: string; + items: IMenuItem[]; + activeItemKey: string; + activeItemName: string; + defaultActiveItemKey: string; + availableKeys: string[]; + }; + runParams?: object; + queryData: QueryData; + batchRequestOptions: { + trace: TraceRawDataItem; + params: {}; + }; + config: IConfig; + data: any; + isApplyBtnDisabled: boolean; +}; + +export type TraceType = + | 'distributions' + | 'images' + | 'audios' + | 'texts' + | 'videos' + | 'figures' + | 'metric'; + +/** + * The context of info Raw data + * It need to have | {} annotation as well, but it cause problems while working + * Checking its an empty object like this Object.key(context).length > 0 + */ +export type TraceContext = { [key: string]: string }; + +/** + * Raw data coming from run detail's info api call + */ +export type TraceRawDataItem = { + context: TraceContext; + name: string; +}; + +/** + * Distributions api response + */ +export interface DistributionsData extends TraceRawDataItem { + record_range_total: [number, number]; + values: DistributionValue[]; + iters: number[]; +} + +/** + * Images api response + * @TODO make compatible to images data + */ +export interface ImagesData extends DistributionsData { + context: object; + index_range_total: [number, number]; + values: any; +} + +/** + * Texts api response + * @TODO make compatible to texts data + */ +export interface TextsData extends ImagesData { + values: { data: string; index: number }[][]; +} + +/** + * Distributions api response value type + */ +export type DistributionValue = { + bin_count: number; + range: [number, number]; + data: { + blob: Uint8Array; + }; +}; + +/** + * Plotly api response + */ +export interface IPlotlyData extends TraceRawDataItem { + record_range_total: [number, number]; + values: PlotlyValue[]; + iters: number[]; +} + +/** + * Plotly api response value type + */ +export type IPlotlyValue = { + data: { + data: any[]; + layout: any; + }; +}; +export interface TraceProcessedData extends DistributionValue { + data: { + blob: TraceProcessedValue; + }; +} + +export type TraceProcessedValue = number[] | ArrayBuffer; + +export type TraceResponseData = DistributionsData | ImagesData; + +export type QueryData = { + sliders: Record; + inputs: Record; + inputsValidations: Record; +}; + +export type RangePanelItem = { + sliderName: string; + inputName: string; + sliderTitle: string; + inputTitle: string; + sliderTitleTooltip: string; + inputTitleTooltip: string; + sliderType: 'single' | 'range'; // This type is same as SliderWithInput component sliderType prop type. + inputValidationPatterns?: (...args: any) => IValidationPatterns; + infoPropertyName?: string; +}; + +export type IConfig = { + rangePanel: RangePanelItem[]; +}; diff --git a/src/src/services/models/runs/util.test.ts b/src/src/services/models/runs/util.test.ts new file mode 100644 index 00000000..81424ffe --- /dev/null +++ b/src/src/services/models/runs/util.test.ts @@ -0,0 +1,128 @@ +import { IMenuItem } from 'components/kit/Menu'; + +import { shouldMatchObject } from 'tests/utils'; + +import { TraceRawDataItem } from './types'; +import { getMenuItemFromRawInfo, getContextObjFromMenuActiveKey } from './util'; + +//@TODO: The next action on this may try to solve the testing issues by going further with the components used here. + +describe('first', () => { + it('should match object', () => {}); +}); +// describe('[getMenuItemFromRawInfo]', () => { +// it('should return the right data if context is empty', () => { +// const rawData: TraceRawDataItem[] = [ +// { +// context: {}, +// name: 'dist_test', +// }, +// { +// context: {}, +// name: 'dist_test', +// }, +// { +// context: {}, +// name: 'dist_test1', +// }, +// ]; + +// const actualResult = getMenuItemFromRawInfo(rawData); + +// const expectedMenuData: IMenuItem[] = [ +// { +// name: 'dist_test', +// id: 'dist_test', +// }, +// { +// name: 'dist_test1', +// id: 'dist_test1', +// }, +// ]; +// const availableIds = ['dist_test', 'dist_test1']; +// shouldMatchObject( +// { +// availableIds, +// data: expectedMenuData, +// }, +// actualResult, +// ); +// }); + +// it('should return the right data if context is not empty', () => { +// const rawData: TraceRawDataItem[] = [ +// { +// context: { subset: 'val', test: 'test' }, +// name: 'dist_test', +// }, +// { +// context: { subset: 'test', test1: 'test1' }, +// name: 'dist_test', +// }, +// ]; + +// const actualResult = getMenuItemFromRawInfo(rawData); + +// const expectedMenuData: IMenuItem[] = [ +// { +// name: 'dist_test', +// id: 'dist_test', +// children: [ +// { +// name: 'subset = val', +// id: 'subset=val', +// }, +// { +// name: 'test = test', +// id: 'test=test', +// }, +// { +// name: 'subset = test', +// id: 'subset=test', +// }, +// { +// name: 'test1 = test1', +// id: 'test1=test1', +// }, +// ], +// }, +// ]; +// const availableIds = ['dist_test']; + +// shouldMatchObject({ data: expectedMenuData, availableIds }, actualResult); +// }); +// }); + +// describe('[getContextObjFromMenuActiveKey]', () => { +// it('should return the right object', () => { +// const rawData: TraceRawDataItem[] = [ +// { +// context: { subset: 'val', test: 'test' }, +// name: 'dist_test', +// }, +// { +// context: { subset: 'test', test1: 'test1' }, +// name: 'dist_test', +// }, +// ]; + +// const { availableIds } = getMenuItemFromRawInfo(rawData); + +// const result1 = getContextObjFromMenuActiveKey( +// 'dist_test.subset=val', +// availableIds, +// ); +// const result2 = getContextObjFromMenuActiveKey( +// 'dist_test.test1=test1', +// availableIds, +// ); +// shouldMatchObject( +// { name: 'dist_test', context: { subset: 'val' } }, +// result1, +// ); +// shouldMatchObject( +// { name: 'dist_test', context: { test1: 'test1' } }, +// result2, +// ); +// }); +// }); diff --git a/src/src/services/models/runs/util.ts b/src/src/services/models/runs/util.ts new file mode 100644 index 00000000..cc85b646 --- /dev/null +++ b/src/src/services/models/runs/util.ts @@ -0,0 +1,464 @@ +import bs58check from 'bs58check'; +import _ from 'lodash-es'; + +import { IMenuItem } from 'components/kit/Menu'; + +import { + IImageData, + IProcessedImageData, +} from 'types/services/models/imagesExplore/imagesExploreAppModel'; + +import contextToString from 'utils/contextToString'; +import alphabeticalSortComparator from 'utils/alphabeticalSortComparator'; +import { encode } from 'utils/encoder/encoder'; +import getObjectPaths from 'utils/getObjectPaths'; +import { getDataAsMediaSetNestedObject } from 'utils/app/getDataAsMediaSetNestedObject'; +import { float64FromUint8, getValue } from 'utils/helper'; +import getGroupingSelectOptions from 'utils/app/getGroupingSelectOptions'; + +import { + DistributionsData, + DistributionValue, + ImagesData, + IPlotlyData, + TextsData, + TraceProcessedData, + TraceRawDataItem, + TraceType, +} from './types'; + +/** + * getMenuItemFromRawInfo + * --------- Complexity analyse ----------- + * The runtime is quadratic + * O(n) - Best case + * O(n * k) - Worst case where k is the maximum length of all children + * --------- Complexity analyse ----------- + * We assume info already has length + * @param info {TraceRawDataItem[]} - raw info data + * @param separator {string} - key value separator + * @returns - compatible Menu data, availableIds for the first layer + */ +export function getMenuItemFromRawInfo( + info: TraceRawDataItem[], + separator: string = '=', +): { + data: IMenuItem[]; + availableIds: string[]; +} { + // for checking duplications + const checkedItemIds: string[] = []; + + const data: IMenuItem[] = []; + + const sortOrder = alphabeticalSortComparator({ + orderBy: 'name', + additionalCompare: (name1: string, name2: string) => { + if (name2 === 'EMPTY CONTEXT') { + return 0; + } + + return null; + }, + }); + // doesn't destructuring item, because we are not sure it has context + info.forEach((item: TraceRawDataItem) => { + const id: string = bs58check.encode(Buffer.from(`${item.name}`)); + let menuItem: IMenuItem = { + name: item.name, + id, + }; + + // this check is for ensure raw data has context + if (item.context) { + const keys: string[] = Object.keys(item.context); + if (keys.length) { + const children: IMenuItem[] = []; + const child: IMenuItem = { + name: `${contextToString(item.context)}`, + id: bs58check.encode(Buffer.from(JSON.stringify(item.context))), + }; + children.push(child); + /*keys.forEach((key: string) => { + const childItem = { + name: `${key} ${separator} ${item.context[key]}`, + // remove whitespaces from id + id: `${key}${separator}${item.context[key]}`, + }; + children.push(childItem); + });*/ + + menuItem.children = children; + } else { + menuItem.children = [ + { + name: 'empty context', + id: bs58check.encode(Buffer.from(JSON.stringify({}))), + }, + ]; + } + } + /* Group children under the same id + * Currently this function supports only the first layer of the array + * To solve problem for nested items run recursively, not checked, that is not reliable right now + * Or iterate through the children and remove if duplicate + */ + if (checkedItemIds.includes(id)) { + data.forEach((it: IMenuItem, index: number) => { + if (it.id === id) { + const itemChildren = data[index].children || []; + const currentChildren = menuItem.children || []; + // spreading order will let to order "empty context" to the first of all + // cause if there empty context it will be in currentChildren + data[index].children = [...currentChildren, ...itemChildren].sort( + sortOrder, + ); + + // clear empty array + // @ts-ignore because we already set it minimum empty array + if (!data[index].children.length) { + delete data[index].children; + } + } + }); + } else { + data.push(menuItem); + checkedItemIds.push(id); + } + }); + + data.sort(sortOrder); + + return { + availableIds: checkedItemIds, + data, + }; +} + +/** + * Generates api call request compatible data from menu's active key + * 'dist_test.subset:value' -> { name: 'dist_test', context: { subset: 'val' } } + * @param key {String} - active key + * @param data {IMenuItem[]} - data + * @param separator {string} - key value separator + * @returns TraceRawDataItem - the object compatible to api call + */ +export function getContextObjFromMenuActiveKey( + key: string, + data: string[], + separator: string = '=', +): TraceRawDataItem { + let name = ''; + let contextKey = ''; + let context = {}; + + for (let i = 0; i < key.length; i++) { + // check includes to ensure we have not a wrong string + // It is the case when the actual name has '.' inside + if (!data.includes(name)) { + name += key[i]; + } else { + contextKey += key[i]; + } + } + + name = bs58check.decode(name).toString(); + if (contextKey) { + // remove contextKey[0] because it is '.' + context = JSON.parse( + bs58check.decode(contextKey.substring(1, contextKey.length)).toString(), + ); + // const keyValue: string[] = contextKey.split(separator); + // assumed there are separated string width "->" + // @TODO check if the actual string may have "separator" inside, it's very hard case + // @ts-ignore + } + + return { + name, + context, + }; +} + +export function getMenuData(traceType: TraceType, traces: TraceRawDataItem[]) { + let title = + VisualizationMenuTitles[traceType as Exclude]; + + let defaultActiveKey = ''; + let defaultActiveName = ''; + + const { data, availableIds } = getMenuItemFromRawInfo(traces); + + if (data[0].children && data[0].children.length) { + defaultActiveKey = data[0].id + '.' + data[0].children[0].id; + defaultActiveName = data[0].children[0].name; + } else { + defaultActiveKey = data[0].id + ''; // make string + defaultActiveName = data[0].name; + } + + return { data, defaultActiveKey, availableIds, title, defaultActiveName }; +} + +/** + * process distributions data + */ +export function processDistributionsData(data: Partial) { + const { record_range_total, iters, values } = data; + const processedValues: any[] = []; + const originalValues: TraceProcessedData[] = []; + + if (values) { + values.forEach((value: DistributionValue) => { + const parsedBlob: number[] = [...float64FromUint8(value.data.blob)]; + + const bin = []; + const xMin = value.range[0]; + const xMax = value.range[1]; + const binSize = (xMax - xMin) / value.bin_count; + for (let i = 0; i <= value.bin_count; i++) { + bin.push(xMin + i * binSize); + } + + processedValues.push([parsedBlob, bin]); + originalValues.push({ + ...value, + data: { + blob: parsedBlob, + }, + }); + }); + } + + return { + iters, + record_range: [record_range_total?.[0], (record_range_total?.[1] || 0) - 1], + processedValues, + originalValues, + processedDataType: VisualizationMenuTitles.distributions, + }; +} + +/** + * process texts data + */ +export function processTextsData(data: Partial) { + const { record_range_total, index_range_total, iters, values } = data; + const processedValues: any[] = []; + if (values) { + let count = 0; + values.forEach((stepValues, stepIndex) => { + stepValues.forEach((text) => { + processedValues.push({ + step: iters?.[stepIndex], + index: text.index, + text: text.data, + key: count, // Table row ID + }); + count++; + }); + }); + } + + return { + iters, + record_range: [record_range_total?.[0], (record_range_total?.[1] || 0) - 1], + index_range: [index_range_total?.[0], (index_range_total?.[1] || 0) - 1], + processedValues: _.orderBy(processedValues, ['step'], ['desc']), + processedDataType: VisualizationMenuTitles.texts, + }; +} + +/** + * process images data + */ +export function processImagesData( + data: Partial, + params?: { [key: string]: unknown }, +) { + const { + record_range_total, + iters, + values, + index_range_total, + context, + name, + } = data; + const groupingSelectOptions = params + ? getGroupingSelectOptions({ + params: getObjectPaths(params, params), + sequenceName: 'images', + }) + : []; + let images: IProcessedImageData[] = []; + values?.forEach((stepData: IImageData[], stepIndex: number) => { + stepData.forEach((image: IImageData) => { + const imageKey = encode({ + name, + traceContext: context, + index: image.index, + step: iters?.[stepIndex], + caption: image.caption, + }); + const seqKey = encode({ + name, + traceContext: context, + }); + images.push({ + ...image, + name, + step: iters?.[stepIndex], + context: context, + key: imageKey, + seqKey: seqKey, + }); + }); + }); + const { mediaSetData, orderedMap } = getDataAsMediaSetNestedObject({ + data: groupData(_.orderBy(images)), + groupingSelectOptions, + defaultGroupFields: ['step'], + }); + return { + imageSetData: mediaSetData, + orderedMap, + record_range: [record_range_total?.[0], (record_range_total?.[1] || 0) - 1], + index_range: [index_range_total?.[0], (index_range_total?.[1] || 0) - 1], + processedDataType: VisualizationMenuTitles.images, + }; +} + +export function processAudiosData( + data: Partial, + params?: { [key: string]: unknown }, +) { + const { + record_range_total, + iters, + values, + index_range_total, + context, + name, + } = data; + const groupingSelectOptions = params + ? getGroupingSelectOptions({ + params: getObjectPaths(params, params), + sequenceName: 'audios', + }) + : []; + let audiosSetData: any[] = []; + + values?.forEach((stepData: IImageData[], stepIndex: number) => { + stepData.forEach((audio: IImageData) => { + const audioKey = encode({ + name, + traceContext: context, + index: audio.index, + step: iters?.[stepIndex], + caption: audio.caption, + }); + const seqKey = encode({ + name, + traceContext: context, + }); + audiosSetData.push({ + ...audio, + audio_name: name, + step: iters?.[stepIndex], + context: context, + key: audioKey, + seqKey: seqKey, + }); + }); + }); + const { mediaSetData, orderedMap } = getDataAsMediaSetNestedObject({ + data: groupData(_.orderBy(audiosSetData)), + groupingSelectOptions, + defaultGroupFields: ['step'], + }); + return { + audiosSetData: mediaSetData, + orderedMap, + record_range: [record_range_total?.[0], (record_range_total?.[1] || 0) - 1], + index_range: [index_range_total?.[0], (index_range_total?.[1] || 0) - 1], + processedDataType: VisualizationMenuTitles.audios, + }; +} + +function groupData(data: IProcessedImageData[]): { + key: string; + config: { [key: string]: string }; + data: IProcessedImageData[]; +}[] { + const groupValues: { + [key: string]: { + key: string; + config: { [key: string]: string }; + data: IProcessedImageData[]; + }; + } = {}; + + for (let i = 0; i < data.length; i++) { + const groupValue: { [key: string]: string } = {}; + ['step'].forEach((field) => { + groupValue[field] = getValue(data[i], field); + }); + const groupKey = encode(groupValue); + if (groupValues.hasOwnProperty(groupKey)) { + groupValues[groupKey].data.push(data[i]); + } else { + groupValues[groupKey] = { + key: groupKey, + config: groupValue, + data: [data[i]], + }; + } + } + return Object.values(groupValues); +} + +export function reformatArrayQueries( + queryObj: Record = {}, +) { + const formattedQueryObject: Record = {}; + Object.keys(queryObj).forEach((key) => { + const item = queryObj[key]; + formattedQueryObject[key] = `${item[0]}:${item[1] + 1}`; + }); + + return formattedQueryObject; +} + +/** + * process plotly data + */ +export function processPlotlyData(data: Partial) { + const { record_range_total, iters, values } = data; + let processedValue = null; + let originalValues = null; + if (_.head(values)?.data) { + processedValue = JSON.parse(_.head(values)?.data); + originalValues = values; + processedValue.layout.autosize = true; + } else { + processedValue = {}; + originalValues = []; + } + + return { + iters, + record_range: [record_range_total?.[0], (record_range_total?.[1] || 0) - 1], + processedValue, + originalValues, + processedDataType: VisualizationMenuTitles.figures, + }; +} + +export const VisualizationMenuTitles = { + images: 'Images', + distributions: 'Distributions', + audios: 'Audios', + videos: 'Videos', + texts: 'Texts', + figures: 'Plotly', +}; diff --git a/src/src/services/models/scatters/mockData.ts b/src/src/services/models/scatters/mockData.ts new file mode 100644 index 00000000..21e931cf --- /dev/null +++ b/src/src/services/models/scatters/mockData.ts @@ -0,0 +1,17 @@ +import COLORS from 'config/colors/colors'; + +function getScattersMockData(count: number = 100) { + return new Array(count).fill('').map((v, i) => ({ + key: `${i}`, + data: { + xValues: [Math.random() * 1.5 + Math.random() * 5], + yValues: [Math.random() * 2.5 + Math.random() * 10], + }, + color: COLORS[0][i % COLORS[0].length], + selectors: [`${i}`], + groupKey: `${i}`, + chartIndex: 0, + })); +} + +export default getScattersMockData; diff --git a/src/src/services/models/scatters/scattersAppModel.ts b/src/src/services/models/scatters/scattersAppModel.ts new file mode 100644 index 00000000..aaf72466 --- /dev/null +++ b/src/src/services/models/scatters/scattersAppModel.ts @@ -0,0 +1,5 @@ +import { appInitialConfig, createAppModel } from 'services/models/explorer'; + +const scattersAppModel = createAppModel(appInitialConfig.SCATTERS) as any; + +export default scattersAppModel; diff --git a/src/src/services/models/tags/tagsAppModel.ts b/src/src/services/models/tags/tagsAppModel.ts new file mode 100644 index 00000000..306b3194 --- /dev/null +++ b/src/src/services/models/tags/tagsAppModel.ts @@ -0,0 +1,192 @@ +import tagsService from 'services/api/tags/tagsService'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITagProps } from 'types/pages/tags/Tags'; + +import createModel from '../model'; + +const model = createModel({ + isTagsDataLoading: false, + isRunsDataLoading: false, + isTagInfoDataLoading: false, + notifyData: [], +}); + +function initialize() { + model.init(); +} + +function getTagsData() { + const { call, abort } = tagsService.getTags(); + + return { + call: () => { + model.setState({ isTagsDataLoading: true }); + call().then((data: any) => { + model.setState({ tagsList: data, isTagsDataLoading: false }); + }); + }, + abort, + }; +} + +let getTagRunsRequestRef: { + call: () => Promise; + abort: () => void; +}; + +let getTagByIdRequestRef: { + call: () => Promise; + abort: () => void; +}; + +function onNotificationDelete(id: number) { + let notifyData: INotification[] | [] = model.getState()?.notifyData || []; + notifyData = [...notifyData].filter((i) => i.id !== id); + model.setState({ notifyData }); +} + +function onNotificationAdd(notification: INotification) { + let notifyData: INotification[] | [] = model.getState()?.notifyData || []; + notifyData = [...notifyData, notification]; + model.setState({ notifyData }); + setTimeout(() => { + onNotificationDelete(notification.id); + }, 3000); +} + +function getTagById(id: string) { + if (getTagByIdRequestRef) { + getTagByIdRequestRef?.abort(); + } + getTagByIdRequestRef = tagsService.getTagById(id); + + return { + call: async () => { + model.setState({ isTagInfoDataLoading: true }); + + const data = await getTagByIdRequestRef.call(); + model.setState({ tagInfo: data, isTagInfoDataLoading: false }); + }, + abort: getTagByIdRequestRef?.abort, + }; +} + +function getTagRuns(id: string) { + if (getTagRunsRequestRef) { + getTagRunsRequestRef?.abort(); + } + getTagRunsRequestRef = tagsService.getTagRuns(id); + + return { + call: async () => { + model.setState({ isRunsDataLoading: true }); + const data = await getTagRunsRequestRef.call(); + model.setState({ tagRuns: data.runs, isRunsDataLoading: false }); + }, + abort: getTagRunsRequestRef?.abort, + }; +} + +function archiveTag(id: string, archived: boolean = false) { + const state = model.getState(); + return tagsService + .hideTag(id, archived) + .call() + .then(() => { + model.setState({ + ...state, + tagInfo: { ...state?.tagInfo, archived }, + }); + onNotificationAdd({ + id: Date.now(), + severity: 'success', + messages: [ + archived + ? 'Tag successfully archived' + : 'Tag successfully unarchived', + ], + }); + }); +} + +function createTag(body: object) { + return tagsService + .createTag(body) + .call() + .then((res: any) => { + if (res.id) { + onNotificationAdd({ + id: Date.now(), + severity: 'success', + messages: ['Tag successfully created'], + }); + } else { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: [res.detail], + }); + } + return res; + }); +} + +function updateTag(body: object, id: string) { + return tagsService + .updateTag(body, id) + .call() + .then((res: any) => { + if (res.id) { + onNotificationAdd({ + id: Date.now(), + severity: 'success', + messages: ['Tag successfully updated'], + }); + } else { + onNotificationAdd({ + id: Date.now(), + severity: 'error', + messages: [res.detail], + }); + } + return res; + }); +} + +function deleteTag(id: string) { + return tagsService + .deleteTag(id) + .call() + .then(() => { + onNotificationAdd({ + id: Date.now(), + severity: 'success', + messages: ['Tag successfully deleted'], + }); + }); +} + +function updateTagInfo(tagInfo: ITagProps) { + const state = model.getState(); + model.setState({ + ...state, + tagInfo, + }); +} + +const tagsAppModel = { + ...model, + initialize, + getTagsData, + getTagRuns, + archiveTag, + getTagById, + updateTagInfo, + onNotificationDelete, + deleteTag, + createTag, + updateTag, +}; + +export default tagsAppModel; diff --git a/src/src/setupTests.ts b/src/src/setupTests.ts new file mode 100644 index 00000000..5dead2b4 --- /dev/null +++ b/src/src/setupTests.ts @@ -0,0 +1,7 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import 'jest-canvas-mock'; + +import '@testing-library/jest-dom'; diff --git a/src/src/stories/Badge.stories.tsx b/src/src/stories/Badge.stories.tsx new file mode 100644 index 00000000..7527fa59 --- /dev/null +++ b/src/src/stories/Badge.stories.tsx @@ -0,0 +1,30 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import BadgeComponent from 'components/kit_v2/Badge'; + +export default { + title: 'Kit/Data Display', + component: BadgeComponent, + argTypes: { + color: { + control: 'select', + }, + size: { + control: 'select', + }, + onDelete: { + control: 'string', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Badge = Template.bind({}); + +Badge.args = { + label: 'Badge', + onDelete: () => {}, +}; diff --git a/src/src/stories/Box.stories.tsx b/src/src/stories/Box.stories.tsx new file mode 100644 index 00000000..10deaf2c --- /dev/null +++ b/src/src/stories/Box.stories.tsx @@ -0,0 +1,26 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import BoxComponent from 'components/kit_v2/Box'; + +export default { + title: 'Kit/Data Display', + component: BoxComponent, + argTypes: {}, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Box = Template.bind({}); + +Box.args = { + children: 'Polymorphic Box component', + as: 'div', + css: { + bc: '$secondary20', + color: '$primary80', + p: '$4', + br: '$2', + }, +}; diff --git a/src/src/stories/Button.stories.tsx b/src/src/stories/Button.stories.tsx new file mode 100644 index 00000000..80df3c29 --- /dev/null +++ b/src/src/stories/Button.stories.tsx @@ -0,0 +1,48 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { IconSearch } from '@tabler/icons-react'; + +import Button from 'components/kit_v2/Button'; + +export default { + title: 'Kit/Inputs/Button', + component: Button, + argTypes: { + color: { + control: 'select', + }, + variant: { + control: 'select', + }, + size: { + control: 'select', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => + + Dialog Content + + + ); +}; + +export const UncontrolledDialog = Template.bind({}); +export const ControlledDialog = Template2.bind({}); + +UncontrolledDialog.args = { + description: 'Dialog description', + title: 'Dialog title', + trigger: , + titleIcon: } />, +}; + +ControlledDialog.args = { + description: 'Dialog description', + title: 'Dialog title', +}; diff --git a/src/src/stories/Icon.stories.tsx b/src/src/stories/Icon.stories.tsx new file mode 100644 index 00000000..0503c5e8 --- /dev/null +++ b/src/src/stories/Icon.stories.tsx @@ -0,0 +1,30 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { IconChartHistogram } from '@tabler/icons-react'; + +import IconComponent from 'components/kit_v2/Icon'; + +import { config } from 'config/stitches'; + +export default { + title: 'Kit/Data Display', + component: IconComponent, + argTypes: { + color: { + control: 'select', + options: Object.keys((config.theme as { colors: {} }).colors).map( + (key) => `$${key}`, + ), + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + } /> +); + +export const Icon = Template.bind({}); + +Icon.args = { + size: 'lg', + color: '$primary100', +}; diff --git a/src/src/stories/IconButton.stories.tsx b/src/src/stories/IconButton.stories.tsx new file mode 100644 index 00000000..5064ed5c --- /dev/null +++ b/src/src/stories/IconButton.stories.tsx @@ -0,0 +1,46 @@ +import { IconSearch } from '@tabler/icons-react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import IconButton from 'components/kit_v2/IconButton'; + +export default { + title: 'Kit/Inputs/IconButton', + component: IconButton, + argTypes: { + color: { + control: 'select', + }, + variant: { + control: 'select', + }, + size: { + control: 'select', + }, + disabled: { + control: 'boolean', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Contained = Template.bind({}); + +Contained.args = { + icon: , + variant: 'contained', +}; +export const Outlined = Template.bind({}); + +Outlined.args = { + icon: , + variant: 'outlined', +}; +export const Ghost = Template.bind({}); + +Ghost.args = { + icon: , + variant: 'ghost', +}; diff --git a/src/src/stories/Input.stories.tsx b/src/src/stories/Input.stories.tsx new file mode 100644 index 00000000..af50e575 --- /dev/null +++ b/src/src/stories/Input.stories.tsx @@ -0,0 +1,69 @@ +import { useFormik } from 'formik'; +import * as yup from 'yup'; + +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { IconSearch } from '@tabler/icons-react'; + +import Input from 'components/kit_v2/Input'; + +export default { + title: 'Kit/Inputs/Input', + component: Input, + argTypes: { + inputSize: { + control: 'select', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => { + const formik = useFormik({ + initialValues: { name: 'name' }, + onSubmit: () => {}, + validationSchema: yup.object({ + name: yup + .string() + .required('Required field') + .max(50, 'Must be 50 characters or fewer'), + comment: yup.string().max(100, 'Must be 100 characters or fewer'), + }), + }); + const { values, errors, setFieldValue } = formik; + + const { name } = values; + + function onChange(e: any) { + const { name, value } = e.target; + setFieldValue(name, value); + } + + return ( + + ); +}; + +export const Medium = Template.bind({}); + +Medium.args = { + inputSize: 'md', + value: 'Default Input', + leftIcon: , +}; +export const Large = Template.bind({}); + +Large.args = { + inputSize: 'lg', + value: 'Large Input', +}; +export const XLarge = Template.bind({}); + +XLarge.args = { + inputSize: 'xl', + value: 'xLarge Input', +}; diff --git a/src/src/stories/ListItem.stories.tsx b/src/src/stories/ListItem.stories.tsx new file mode 100644 index 00000000..2263e8ce --- /dev/null +++ b/src/src/stories/ListItem.stories.tsx @@ -0,0 +1,56 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import { Icon } from 'components/kit'; +import ListItemComponent from 'components/kit_v2/ListItem'; + +export default { + title: 'Kit/Data Display/ListItem', + component: ListItemComponent, + argTypes: { + size: { + control: 'select', + }, + }, +} as ComponentMeta; + +const IconNode = ( + +); +const Template1: ComponentStory = (args) => ( + List Item +); + +export const Default = Template1.bind({}); + +Default.args = { + size: 'md', +}; + +const Template2: ComponentStory = (args) => ( + + List Item + +); + +export const WithLeftNode = Template2.bind({ + size: 'lg', +}); + +const Template3: ComponentStory = (args) => ( + + List Item + +); + +export const WithRightNode = Template3.bind({ + size: 'xl', +}); diff --git a/src/src/stories/QueryBadge.stories.tsx b/src/src/stories/QueryBadge.stories.tsx new file mode 100644 index 00000000..4ac08c0c --- /dev/null +++ b/src/src/stories/QueryBadge.stories.tsx @@ -0,0 +1,26 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import QueryBadgeComponent from 'components/kit_v2/QueryBadge'; + +export default { + title: 'Kit/Inputs/QueryBadge', + component: QueryBadgeComponent, + argTypes: { + color: { + control: 'select', + }, + size: { + control: 'select', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const QueryBadge = Template.bind({}); + +QueryBadge.args = { + children: 'Contained Button', +}; diff --git a/src/src/stories/Radio.stories.tsx b/src/src/stories/Radio.stories.tsx new file mode 100644 index 00000000..2c86f3a0 --- /dev/null +++ b/src/src/stories/Radio.stories.tsx @@ -0,0 +1,76 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import { Text } from 'components/kit_v2'; +import RadioComponent, { + RadioGroup as Group, +} from 'components/kit_v2/Radio/Radio'; + +export default { + title: 'Kit/Inputs', + component: RadioComponent, + argTypes: { + name: { + control: { + type: 'text', + }, + description: + 'The name of the group. Submitted with its owning form as part of a name/value pair.', + }, + defaultValue: { + control: { + type: 'select', + options: ['1', '2'], + }, + description: + 'The value of the radio item that should be checked when initially rendered. Use when you do not need to control the state of the radio items.', + }, + value: { + control: { + type: 'select', + options: ['1', '2'], + }, + description: + 'The controlled value of the radio item to check. Should be used in conjunction with `onValueChange`.', + }, + disabled: { + control: { + type: 'boolean', + }, + description: 'Disables the radio group', + }, + onValueChange: { + control: { + type: 'text', + }, + description: 'Event handler called when the value changes.', + }, + dir: { + control: { + type: 'select', + options: ['ltr', 'rtl'], + }, + description: + 'The reading direction of the radio group. If omitted, inherits globally from `DirectionProvider` or assumes LTR (left-to-right) reading mode.', + }, + orientation: { + control: { + type: 'select', + options: ['horizontal', 'vertical'], + }, + description: 'The orientation of the component.', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + + + First + + + Second + + +); + +export const RadioGroup = Template.bind({}); diff --git a/src/src/stories/Select.stories.tsx b/src/src/stories/Select.stories.tsx new file mode 100644 index 00000000..2ab12f65 --- /dev/null +++ b/src/src/stories/Select.stories.tsx @@ -0,0 +1,113 @@ +import React from 'react'; + +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import SelectComponent from 'components/kit_v2/Select/Select'; +import Button from 'components/kit_v2/Button'; + +export default { + title: 'Kit/Inputs', + component: SelectComponent, + argTypes: {}, +} as ComponentMeta; + +const Template: ComponentStory = (args) => { + const [multipleValues, setMultipleValues] = React.useState([]); + const [singleValue, setSingleValue] = React.useState(''); + + const handleChange = (val: string) => { + if (args.multiple) { + if (multipleValues.indexOf(val) === -1) { + setMultipleValues([...multipleValues, val]); + } else { + const filteredValues = multipleValues.filter((v) => v !== val); + setMultipleValues(filteredValues); + } + } + setSingleValue(val); + }; + + return ( + Open Select} + /> + ); +}; + +export const Select = Template.bind({}); + +Select.args = { + multiple: true, + searchable: true, + options: [ + { + group: 'Group 1', + options: [ + { label: 'Option 1', value: 'option-1' }, + { + label: 'Option 2', + value: 'option-2', + }, + { + label: 'Option 3', + value: 'option-3', + }, + { + label: 'Option 4', + value: 'option-4', + }, + { + label: 'Option 5', + value: 'option-5', + }, + { label: 'Option 6', value: 'option-6' }, + { label: 'Option 7', value: 'option-7' }, + ], + }, + { + group: 'Group 2', + options: [ + { label: 'Option 1', value: 'option2-1' }, + { + label: 'Option 2', + value: 'option2-2', + }, + { + label: 'Option 3', + value: 'option2-3', + }, + ], + }, + { + group: 'Group 3', + options: [ + { label: 'Option 1', value: 'option3-1' }, + { + label: 'Option 2', + value: 'option3-2', + }, + { + label: 'Option 3', + value: 'option3-3', + }, + ], + }, + { + group: 'Group 4', + options: [ + { label: 'Option 1', value: 'option4-1' }, + { + label: 'Option 2', + value: 'option4-2', + }, + { + label: 'Option 3', + value: 'option4-3', + }, + ], + }, + ], +}; diff --git a/src/src/stories/Separator.stories.tsx b/src/src/stories/Separator.stories.tsx new file mode 100644 index 00000000..36064a4c --- /dev/null +++ b/src/src/stories/Separator.stories.tsx @@ -0,0 +1,52 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import SeparatorComponent from 'components/kit_v2/Separator'; +import Box from 'components/kit_v2/Box'; +import Text from 'components/kit_v2/Text'; + +import { config } from 'config/stitches'; + +export default { + title: 'Kit/Data Display/Separator', + component: SeparatorComponent, + argTypes: { + color: { + control: 'select', + options: Object.keys((config.theme as { colors: {} }).colors).map( + (key) => `$${key}`, + ), + }, + orientation: { + control: 'select', + options: ['horizontal', 'vertical'], + }, + margin: { + control: 'select', + options: Object.keys((config.theme as { space: {} }).space).map( + (key) => `$${key}`, + ), + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + + Aim Ui + + {args.orientation} separator + +); + +export const Horizontal = Template.bind({}); + +Horizontal.args = { + orientation: 'horizontal', + margin: '$4', +}; + +export const Vertical = Template.bind({}); + +Vertical.args = { + orientation: 'vertical', + margin: '$4', +}; diff --git a/src/src/stories/Slider.stories.tsx b/src/src/stories/Slider.stories.tsx new file mode 100644 index 00000000..ffeb62bc --- /dev/null +++ b/src/src/stories/Slider.stories.tsx @@ -0,0 +1,31 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import SliderComponent from 'components/kit_v2/Slider'; + +export default { + title: 'Kit/Inputs', + component: SliderComponent, + argTypes: {}, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Slider = Template.bind({}); + +Slider.args = {}; diff --git a/src/src/stories/Switch.stories.tsx b/src/src/stories/Switch.stories.tsx new file mode 100644 index 00000000..231cae6f --- /dev/null +++ b/src/src/stories/Switch.stories.tsx @@ -0,0 +1,21 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import SwitchComponent from 'components/kit_v2/Switch'; + +export default { + title: 'Kit/Inputs', + component: SwitchComponent, + argTypes: { + size: { + control: 'select', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Switch = Template.bind({}); + +Switch.args = {}; diff --git a/src/src/stories/Text.stories.tsx b/src/src/stories/Text.stories.tsx new file mode 100644 index 00000000..9eda4528 --- /dev/null +++ b/src/src/stories/Text.stories.tsx @@ -0,0 +1,43 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import TextComponent from 'components/kit_v2/Text'; + +import { config } from 'config/stitches'; + +export default { + title: 'Kit/Typography', + component: TextComponent, + argTypes: { + weight: { + control: 'select', + options: Object.keys( + (config.theme as { fontWeights: {} }).fontWeights, + ).map((key) => `$${key}`), + }, + size: { + control: 'select', + options: Object.keys((config.theme as { fontSizes: {} }).fontSizes).map( + (key) => `$${key}`, + ), + }, + color: { + control: 'select', + options: Object.keys((config.theme as { colors: {} }).colors).map( + (key) => `$${key}`, + ), + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Text = Template.bind({}); + +Text.args = { + children: 'Polymorphic Text component', + weight: '$2', + size: '$3', + color: '$textPrimary', +}; diff --git a/src/src/stories/Toast.stories.tsx b/src/src/stories/Toast.stories.tsx new file mode 100644 index 00000000..2f6a7e86 --- /dev/null +++ b/src/src/stories/Toast.stories.tsx @@ -0,0 +1,88 @@ +import React from 'react'; + +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { IconCheck } from '@tabler/icons-react'; + +import { + Toast as ToastComponent, + ToastProvider, +} from 'components/kit_v2/Toast'; +import Button from 'components/kit_v2/Button'; +import { IToastProps } from 'components/kit_v2/Toast/Toast.d'; + +export default { + title: 'Kit/Feedback', + component: ToastComponent, + argTypes: { + placement: { + control: 'radio', + options: ['topLeft', 'topRight', 'bottomLeft', 'bottomRight'], + }, + id: { + control: 'text', + }, + swipeDirection: { + control: 'radio', + options: ['left', 'right', 'up', 'down'], + }, + duration: { + control: 'number', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args: any) => { + const [notifications, setNotifications] = React.useState([]); + + function onAddToast() { + const id = Math.random().toString(36).substr(2, 9); + const notification = { + id, + icon: , + message: + args.message || + 'Aim is an open-source, self-hosted ML experiment tracking tool', + onDelete: () => { + setNotifications((notifications) => + notifications.filter((n) => n.id !== id), + ); + }, + onUndo: () => { + setNotifications((notifications) => + notifications.filter((n) => n.id !== id), + ); + }, + }; + setNotifications((list) => [...list, notification]); + } + + return ( +
+ + + {notifications.map((notification) => ( + { + if (!open && notification.onDelete) { + notification.onDelete(notification.id)!; + } + }} + {...notification} + /> + ))} + +
+ ); +}; + +export const Toast = Template.bind({}); + +Toast.args = { + duration: 5000, +}; diff --git a/src/src/stories/ToggleButton.stories.tsx b/src/src/stories/ToggleButton.stories.tsx new file mode 100644 index 00000000..1d9ee9f3 --- /dev/null +++ b/src/src/stories/ToggleButton.stories.tsx @@ -0,0 +1,23 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import ToggleComponent from 'components/kit_v2/ToggleButton'; + +export default { + title: 'Kit/Inputs', + component: ToggleComponent, + argTypes: {}, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const ToggleButton = Template.bind({}); + +ToggleButton.args = { + leftLabel: 'Left', + rightLabel: 'Right', + rightValue: 'right', + leftValue: 'left', + value: 'left', +}; diff --git a/src/src/stories/Tooltip.stories.tsx b/src/src/stories/Tooltip.stories.tsx new file mode 100644 index 00000000..dcbf10cf --- /dev/null +++ b/src/src/stories/Tooltip.stories.tsx @@ -0,0 +1,22 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import Button from 'components/kit_v2/Button'; +import TooltipComponent from 'components/kit_v2/Tooltip'; + +export default { + title: 'Kit/Data Display', + component: TooltipComponent, + argTypes: {}, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + + + +); + +export const Tooltip = Template.bind({}); + +Tooltip.args = { + content: 'Tooltip', +}; diff --git a/src/src/stories/Tree.stories.tsx b/src/src/stories/Tree.stories.tsx new file mode 100644 index 00000000..9032e3f0 --- /dev/null +++ b/src/src/stories/Tree.stories.tsx @@ -0,0 +1,64 @@ +import { ComponentStory, ComponentMeta } from '@storybook/react'; + +import Button from 'components/kit_v2/Button'; +import Popover from 'components/kit_v2/Popover'; +import TreeComponent from 'components/kit_v2/Tree'; + +export default { + title: 'Kit/Inputs', + component: TreeComponent, + argTypes: {}, +} as ComponentMeta; + +const treeData: any = [ + { + title: 0-0, + key: '0-0', + children: [ + { + title: '0-0-0', + key: '0-0-0', + children: [ + { title: '0-0-0-0', key: '0-0-0-0' }, + { title: '0-0-0-1', key: '0-0-0-1' }, + { title: '0-0-0-2', key: '0-0-0-2' }, + ], + }, + { + title: '0-0-1', + key: '0-0-1', + children: [ + { title: '0-0-1-0', key: '0-0-1-0' }, + { title: '0-0-1-1', key: '0-0-1-1' }, + { title: '0-0-1-2', key: '0-0-1-2' }, + ], + }, + { + title: '0-0-2', + key: '0-0-2', + }, + ], + }, + { + title: '0-1', + key: '0-1', + children: [ + { title: '0-1-0-0', key: '0-1-0-0' }, + { title: '0-1-0-1', key: '0-1-0-1' }, + { title: '0-1-0-2', key: '0-1-0-2' }, + ], + }, + { + title: '0-2', + key: '0-2', + }, +]; + +const Template: ComponentStory = (args: any) => ( + Open the Tree} + content={} + /> +); + +export const Tree = Template.bind({}); diff --git a/src/src/styles/_global.scss b/src/src/styles/_global.scss new file mode 100644 index 00000000..29959f9a --- /dev/null +++ b/src/src/styles/_global.scss @@ -0,0 +1,44 @@ +@use 'src/styles/abstracts' as *; +@import './utils'; + +.ScrollBar__hidden { + --ms-overflow-style: none; + --scrollbar-width: none; + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } +} + +.SelectForm__Popper { + z-index: 6; +} + +.container { + position: relative; + margin: 0 auto; + padding-right: 1rem; + padding-left: 1rem; + width: 100%; + height: 100%; + + @include mq(sm) { + max-width: $col-sm; + } + + @include mq(md) { + max-width: $col-md; + } + + @include mq(lg) { + max-width: $col-lg; + } + + @include mq(xl) { + max-width: $col-xl; + } + + @include mq(xxl) { + max-width: $col-xxl; + } +} diff --git a/src/src/styles/_utils.scss b/src/src/styles/_utils.scss new file mode 100644 index 00000000..2eff97a4 --- /dev/null +++ b/src/src/styles/_utils.scss @@ -0,0 +1,125 @@ +/** + * Common styles + */ +.flex { + display: flex; +} + +.iflex { + display: inline-flex; +} +.m0a { + margin: 0 auto; +} +.fac { + display: flex; + align-items: center; +} + +.fae { + align-items: flex-end; +} +.fjse { + display: flex; + justify-content: space-evenly; +} +.fjb { + display: flex; + justify-content: space-between; +} + +.fja { + justify-content: space-around; +} + +.fjc { + justify-content: center; +} + +.fdc { + display: flex; + flex-direction: column; +} + +.fwrap { + flex-wrap: wrap; +} +.fje { + justify-content: flex-end; +} +.fdr { + flex-direction: row; +} +.fdr-reverse { + flex-direction: row-reverse; +} + +.fdr-reverse { + flex-direction: column-reverse; +} + +.ttu { + text-transform: uppercase; +} + +.tac { + text-align: center; +} + +.taj { + text-align: justify; +} + +.tar { + text-align: right; +} + +.tal { + text-align: left; +} + +.posrel { + position: relative; +} + +.posabs { + position: absolute; +} + +.trans { + transition: all 0.3s; +} + +.transparent { + opacity: 0; +} + +.hidden { + display: none; +} + +.nodrag { + pointer-events: none; +} + +.c-pointer { + cursor: pointer; +} + +.h-full { + height: 100%; +} + +.raw-center { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} + +.col-center { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} diff --git a/src/src/styles/abstracts/_functions.scss b/src/src/styles/abstracts/_functions.scss new file mode 100644 index 00000000..eeb4d61b --- /dev/null +++ b/src/src/styles/abstracts/_functions.scss @@ -0,0 +1,35 @@ +@use "sass:math"; + +@function tint($color, $percentage) { + @return mix(transparent, $color, $percentage); +} + +@function shade($color, $percentage) { + @return mix(black, $color, $percentage); +} + +@function toRem($px) { + @return #{math.div($px, 16px)}rem; +} + +@function rgba-to-rgb($rgba, $opacity: 0, $background: #fff) { + @if $opacity > 0 { + @if $opacity < 1 { + $opacity: $opacity * 100; + } + @return mix( + mix( + rgb(red($rgba), green($rgba), blue($rgba)), + $background, + alpha($rgba) * 100% + ), + rgb(255, 255, 255), + $opacity + ); + } + @return mix( + rgb(red($rgba), green($rgba), blue($rgba)), + $background, + alpha($rgba) * 100% + ); +} diff --git a/src/src/styles/abstracts/_index.scss b/src/src/styles/abstracts/_index.scss new file mode 100644 index 00000000..4323594d --- /dev/null +++ b/src/src/styles/abstracts/_index.scss @@ -0,0 +1,3 @@ +@forward "./variables"; +@forward "./functions"; +@forward './mixins'; diff --git a/src/src/styles/abstracts/_mixins.scss b/src/src/styles/abstracts/_mixins.scss new file mode 100644 index 00000000..a5a5c1f7 --- /dev/null +++ b/src/src/styles/abstracts/_mixins.scss @@ -0,0 +1,21 @@ +@use './variables' as *; + +@mixin mq($breakpoint) { + @if map-has-key($breakpoints, $breakpoint) { + @media (min-width: #{map-get($breakpoints, $breakpoint)}) { + @content; + } + } +} + +@mixin backgroundColorOpacity($color, $opacity: 0.1) { + background-color: rgba($color, $opacity); +} + +@mixin monospaceFontFamily($font-size: 16) { + $min-font-width: 114; + $font-size-unit-width: 2; + font-family: 'Inconsolata', monospace; + font-variation-settings: 'wdth' $min-font-width - + ($font-size * $font-size-unit-width); +} diff --git a/src/src/styles/abstracts/_variables.scss b/src/src/styles/abstracts/_variables.scss new file mode 100644 index 00000000..458b4cac --- /dev/null +++ b/src/src/styles/abstracts/_variables.scss @@ -0,0 +1,172 @@ +@use "./functions" as *; + +$primary-color: #1473e6; +$error-color: #e64e48; +$success-color: #2bc784; +$warning-color: #ffcc00; +// colors +$blue: #4b9bff; +$orange: #ffb46e; +$red: #ff5f5f; +$teal: #50d2a0; +$pink: #ff73c3; +$green: #9be169; +$purple: #af78ff; +$yellow: #ffd76e; +$cyan: #5fc8ff; +$indigo: #7785ff; +$white: #ffffff; +$pico: #1c2852; +$grayish: #dee6f3; +$cuddle: #bdcee8; +$denim: $primary-color; +$black: #000000; +$transparent: transparent; + +$grey: #586069; + +$grey-darker: #24292e; +$grey-bg: #f7f7f7; +$grey-lighter: #e8e8e8; +$grey-light-xx: #d4d4d4; +$primary-dark: #243969; +$primary-darker: #142447; +$primary-bg: #f7faff; +$primary-lighter: #dfe6f7; +$primary-light: #7a94cc; + +// tinted colors +$primary-color-110: #1266cc; +$primary-color-90: #2c81e9; +$primary-color-80: #438feb; +$primary-color-70: #5b9dee; +$primary-color-60: #72abf0; +$primary-color-50: #89b9f2; +$primary-color-40: #a1c7f5; +$primary-color-30: #d0e3fa; +$primary-color-25: #c4dcf9; +$primary-color-20: #dceafb; +$primary-color-10: #e8f1fc; +$primary-color-5: #f3f8fe; + +$pico-100: #1c2852; +$pico-90: #2a355a; +$pico-80: #414b6d; +$pico-70: #606986; +$pico-60: #6b728b; +$pico-50: #83899e; +$pico-40: #a4a9ba; +$pico-30: #b5b9c5; +$pico-20: #d2d4dc; +$pico-10: #e8eaee; +$pico-5: #f4f4f6; +$pico-2: #fafafb; + +$cuddle-110: #90afda; +$cuddle-70: #d1ddef; +$cuddle-50: #dee6f3; +$cuddle-30: #ebf0f8; +$cuddle-20: #f2f5fa; +$cuddle-10: #f8fafd; + +$mark-color: #fffac1; + +$warning-color-80: #edc949; +$warning-color-50: #f4dd8d; +$warning-color-25: #fff2bf; +$warning-color-10: #fffae6; +$warning-color-5: #f7f7f3; + +$success-color-100: #2bc784; +$success-color-80: #55d29d; +$success-color-50: #95e3c2; +$success-color-25: #caf1e0; +$success-color-10: #eaf9f3; +$success-color-5: #eef7f8; + +$error-color-80: #eb716d; +$error-color-50: #f3a7a4; +$error-color-25: #f9d3d1; +$error-color-10: #fdeded; +$error-color-5: #f7f1f5; + +// border +$border-width-main: 0.0625rem solid; +$border-color-main: $primary-color-10; +$border-main: $border-width-main $border-color-main; +$border-separator: $border-width-main $primary-color-20; +$border-main-darker: $border-width-main $primary-color-40; +$border-main-active: $border-width-main $primary-color-50; +$border-grey: $border-width-main $cuddle-50; +$border-grey-light: $border-width-main $cuddle-30; +$border-grey-lighter: $border-width-main $cuddle-20; +$border-transparent: $border-width-main $transparent; +$border-dark: $border-width-main $pico-30; +$border-dark-lighter: $border-width-main $pico-20; +$border-radius-main: 0.375rem; +$radius-main: 0.375rem; + +$border-radius-xss: 0.125rem; +$border-radius-xs: 0.1875rem; +$border-radius-sm: 0.25rem; +$border-radius-md: 0.375rem; +$border-radius-lg: 0.5rem; +$border-radius-xl: 1rem; +$border-radius-circle: 50%; +// text +$text-color: $pico-80; +$text-color-50: $pico-50; +$text-xxxs: 0.5rem; +$text-xxs: 0.625rem; +$text-xs: 0.6875rem; +$text-sm: 0.75rem; +$text-md: 0.875rem; +$text-lg: 1rem; +$text-xl: 1.125rem; +$text-xxl: 1.5rem; +$text-xxxl: 2.25rem; +$xs: 23.5em; // 376px @media (max-width: $xs) {} +$sm: 36em; // (min-width: 576px) +$md: 48em; // (min-width: 768px) +$lg: 62em; // (min-width: 992px) +$gl: 64em; //! gap `lg - xl` (min-width: 1024px) +$xl: 75em; // (min-width: 1200px) +$xxl: 80em; // (min-width: 1280px) + +// font weight + +$font-300: 250; +$font-400: 350; +$font-500: 450; +$font-600: 550; +$font-700: 650; +$font-800: 750; +$font-900: 850; + +// space +$space-unit: 1rem; +$space-xxxxxs: $space-unit * 0.0625; +$space-xxxxs: $space-unit * 0.125; +$space-xxxs: $space-unit * 0.25; +$space-xxs: $space-unit * 0.375; +$space-xs: $space-unit * 0.5; +$space-sm: $space-unit * 0.75; +$space-md: $space-unit * 1.25; +$space-lg: $space-unit * 1.5; +// - to container +$col-sm: 540px; // (max-width: 540px) +$col-md: 720px; // (max-width: 720px) +$col-lg: 960px; // (max-width: 960px) +$col-xl: 1140px; // (max-width: 1140px) +$col-xxl: 1420px; // (max-width: 1420px) +$breakpoints: ( + sm: $sm, + md: $md, + lg: $lg, + xl: $xl, + xxl: $xxl, +); +$run-overview-sidebar-width: 20rem; +$container-max-width-without-paddings: 86.75rem; +$tooltip-max-height: 18.75rem; +$popover-opening-duration: 0.18s; diff --git a/src/src/styles/base/_reset.scss b/src/src/styles/base/_reset.scss new file mode 100644 index 00000000..ca5f828d --- /dev/null +++ b/src/src/styles/base/_reset.scss @@ -0,0 +1,25 @@ +@use 'src/styles/abstracts' as *; + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} +html { + height: 100%; + position: relative; + display: table; + width: 100%; +} +body { + font-size: 1em; + font-family: 'Inter', sans-serif; + font-weight: $font-500; + color: $text-color; + height: 100%; + max-width: 100vw; + overflow: hidden; +} +#root { + height: 100%; +} diff --git a/src/src/styles/components/_autocomplete.scss b/src/src/styles/components/_autocomplete.scss new file mode 100644 index 00000000..44f3661b --- /dev/null +++ b/src/src/styles/components/_autocomplete.scss @@ -0,0 +1,29 @@ +@use 'src/styles/abstracts' as *; + +.MuiAutocomplete-popperDisablePortal { + position: initial !important; +} + +.MuiAutocomplete-listbox { + .MuiAutocomplete-groupUl .MuiAutocomplete-option { + padding: 0.625rem 1rem; + + .MuiCheckbox-root { + padding: 0; + } + + .QueryForm__option, + .SelectForm__option, + .Metrics__SelectForm__option { + display: flex; + width: 100%; + overflow: hidden; + &__label { + margin-left: $space-xs; + max-width: 100%; + overflow: hidden; + word-break: break-all; + } + } + } +} diff --git a/src/src/styles/components/_inputs.scss b/src/src/styles/components/_inputs.scss new file mode 100644 index 00000000..87493792 --- /dev/null +++ b/src/src/styles/components/_inputs.scss @@ -0,0 +1,189 @@ +@use 'src/styles/abstracts' as *; + +body { + .MuiOutlinedInput-root { + border-radius: $border-radius-main; + &:hover { + .MuiOutlinedInput-notchedOutline { + border-color: $cuddle-110; + } + } + + .MuiOutlinedInput-notchedOutline { + border-color: $cuddle; + border-width: 0.0625rem !important; + } + } + + .Mui-disabled { + color: $text-color-50 !important; + .MuiOutlinedInput-notchedOutline { + border-color: $cuddle-70 !important; + } + } + .Mui-focused { + .MuiOutlinedInput-notchedOutline { + border-color: $cuddle-110 !important; + } + } +} + +.TextField { + .MuiOutlinedInput-notchedOutline { + border: 0.0625rem solid $cuddle-70 !important; + } + + &__OutLined { + &__Small { + .MuiInputLabel-outlined.MuiInputLabel-marginDense { + font-weight: $font-500; + font-size: $text-md; + color: $text-color; + transform: translate(14px, 8px) scale(1); + } + + .MuiInputLabel-outlined.MuiInputLabel-shrink { + transform: translate(14px, -6px) scale(0.75); + color: $primary-color; + } + + .MuiInputBase-root { + .MuiInputBase-input { + font-weight: $font-500; + font-size: $text-md; + color: $text-color; + padding: 0.375rem 1rem; + height: 1rem; + } + + .MuiOutlinedInput-notchedOutline { + border-color: #bdcee8; + } + + .PrivateNotchedOutline-legendLabelled-13 { + span { + padding-right: 0; + } + } + } + } + &__Medium { + .MuiInputLabel-outlined.MuiInputLabel-marginDense { + font-weight: $font-500; + font-size: $text-md; + color: $pico-50; + transform: translate(14px, 8px) scale(1); + } + + .MuiInputLabel-outlined.MuiInputLabel-shrink { + transform: translate(14px, -6px) scale(0.75); + color: $pico-80; + &.Mui-error { + color: #f44336 !important; + } + } + + .MuiInputBase-root { + &.Mui-error .MuiOutlinedInput-notchedOutline { + border-color: #f44336 !important; + } + .MuiInputBase-input { + font-weight: $font-500; + font-size: $text-md; + color: $text-color; + padding: 0.375rem 1rem; + height: 1.25rem; + } + + .MuiOutlinedInput-notchedOutline { + border-color: #bdcee8; + } + + .PrivateNotchedOutline-legendLabelled-13 { + span { + padding-right: 0; + } + } + } + } + &__Large { + .MuiInputBase-root { + .MuiInputBase-input { + font-weight: $font-500; + font-size: $text-md; + color: $text-color; + padding: 0.5625rem 1rem 0.625rem; + height: 1rem; + } + + .MuiOutlinedInput-notchedOutline { + border-color: #bdcee8; + } + + .PrivateNotchedOutline-legendLabelled-13 { + span { + padding-right: 0; + } + } + } + } + } + + &__TextArea { + &__OutLined { + &__Small { + min-height: 56px; + .MuiOutlinedInput-root.Mui-error .MuiOutlinedInput-notchedOutline { + border-color: #f44336 !important; + } + .MuiOutlinedInput-multiline { + padding: 10px 1em; + overflow: hidden; + height: 56px; + + .MuiOutlinedInput-inputMultiline { + height: 36px !important; + overflow-y: scroll !important; + } + } + + .MuiInputLabel-outlined { + transform: translate(14px, 14px) scale(1); + &.MuiInputLabel-shrink { + transform: translate(14px, -6px) scale(0.75); + font-size: $text-md; + color: $pico-80; + font-weight: $font-500; + } + } + + .MuiFormLabel-root { + color: $pico-50; + font-weight: $font-500; + font-size: $text-md; + &.Mui-error { + color: #f44336; + } + } + + .MuiInputBase-root { + .MuiInputBase-input { + font-weight: $font-500; + font-size: $text-md; + color: $text-color; + } + + .MuiOutlinedInput-notchedOutline { + border-color: #bdcee8; + } + + .PrivateNotchedOutline-legendLabelled-13 { + span { + padding-right: 0; + } + } + } + } + } + } +} diff --git a/src/src/styles/components/_tooltip.scss b/src/src/styles/components/_tooltip.scss new file mode 100644 index 00000000..720d27a1 --- /dev/null +++ b/src/src/styles/components/_tooltip.scss @@ -0,0 +1,16 @@ +@use 'src/styles/abstracts' as *; + +.MuiTooltip-tooltip { + max-height: $tooltip-max-height; + overflow: hidden; +} + +.MuiTooltip-tooltipPlacementTop, +.MuiTooltip-tooltipPlacementBottom { + margin: 6px 0; +} + +.MuiTooltip-tooltipPlacementLeft, +.MuiTooltip-tooltipPlacementRight { + margin: 0 6px; +} diff --git a/src/src/tests/hooks/model/createModel.test.ts b/src/src/tests/hooks/model/createModel.test.ts new file mode 100644 index 00000000..ea824dc6 --- /dev/null +++ b/src/src/tests/hooks/model/createModel.test.ts @@ -0,0 +1,60 @@ +import createModel from 'services/models/model'; + +import { shouldMatchObject } from 'tests/utils'; + +const initialState = { + test: { + hello: 'hello', + }, +}; + +describe('[function createModel]', () => { + test('should create model correctly width empty state', () => { + const model = createModel({}); + shouldMatchObject(model.getState(), {}); + }); + + test('should create model correctly width state', () => { + const model = createModel(initialState); + shouldMatchObject(model.getState(), initialState); + }); +}); + +describe("[model's methods]", () => { + let model: any; + beforeEach(() => { + model = createModel(initialState); + }); + + test('[setState method] should work properly', () => { + model.setState({ test: 'test' }); + shouldMatchObject({ test: 'test' }, model.getState()); + }); + + test('[subscribe/unsubscribe methods] should work properly', () => { + const mockSubscriber = jest.fn((res) => res); + const { unsubscribe } = model.subscribe('UPDATE', mockSubscriber); + + model.setState({ test: 'test' }); + expect(mockSubscriber).toHaveBeenCalledTimes(1); + + model.setState({ test: 'test2' }); + expect(mockSubscriber).toHaveBeenCalledTimes(2); + + unsubscribe(); + model.setState({ test: 'test3' }); + expect(mockSubscriber).not.toHaveBeenCalledTimes(3); + }); + + test('[destroy method] should re-init the state and remove subscriptions', () => { + const mockSubscriber = jest.fn((res) => res); + model.setState({ empty: true }); + model.subscribe('UPDATE', mockSubscriber); + + model.destroy(); + shouldMatchObject(initialState, model.getState()); + + model.setState({}); + expect(mockSubscriber).not.toHaveBeenCalled(); + }); +}); diff --git a/src/src/tests/hooks/model/useModel.test.ts b/src/src/tests/hooks/model/useModel.test.ts new file mode 100644 index 00000000..a6fb39d3 --- /dev/null +++ b/src/src/tests/hooks/model/useModel.test.ts @@ -0,0 +1,36 @@ +import { renderHook, act } from '@testing-library/react-hooks'; + +import useModel from 'hooks/useModel'; + +import createModel from 'services/models/model'; + +import { shouldMatchObject } from 'tests/utils'; + +import { IModel } from 'types/services/models/model'; + +const initialState = { forHook: true }; +let model: IModel; +beforeAll(() => { + model = createModel(initialState); +}); + +describe('[useModel]', () => { + test('state create/update works properly', () => { + const { result } = renderHook(() => useModel(model)); + act(() => { + model.setState({ test: 'test2' }); + }); + + shouldMatchObject({ ...initialState, test: 'test2' }, result.current); + }); + + test('should re-init the model once unmounting', () => { + const { result, unmount } = renderHook(() => useModel(model)); + act(() => { + model.setState({ test: 'test2' }); + unmount(); + }); + + shouldMatchObject(initialState, result.current); + }); +}); diff --git a/src/src/tests/utils/app/getFilteredSystemMetrics.test.ts b/src/src/tests/utils/app/getFilteredSystemMetrics.test.ts new file mode 100644 index 00000000..5a5ec5a0 --- /dev/null +++ b/src/src/tests/utils/app/getFilteredSystemMetrics.test.ts @@ -0,0 +1,54 @@ +import { toEqual } from 'tests/utils'; + +import getFilteredSystemMetrics from 'utils/app/getFilteredSystemMetrics'; + +describe('[Filter and get system metrics from table columns data]', () => { + it('correctly filtering and returning system metrics keys array', () => { + let columns = [ + 'Loss_type="mel_loss"', + 'Loss_type="duration_loss"', + '__system__cpu', + '__system__disk_percent', + '__system__p_memory_percent', + 'preprocess_config.dataset', + ]; + toEqual(getFilteredSystemMetrics(columns), [ + '__system__cpu', + '__system__disk_percent', + '__system__p_memory_percent', + ]); + }); + + it('correctly filtering and returning empty array', () => { + let columns = [ + 'train_config.path.result_path', + 'train_config.step.save_step', + 'train_config.step.synth_step', + ]; + toEqual(getFilteredSystemMetrics(columns), []); + }); + + it('correctly filtering and returning array without system metrics', () => { + let columns = [ + 'train_config.path.result_path', + 'train_config.step.save_step', + 'train_config.step.synth_step', + '__system__cpu', + '__system__disk_percent', + '__system__p_memory_percent', + ]; + toEqual(getFilteredSystemMetrics(columns, true), [ + 'train_config.path.result_path', + 'train_config.step.save_step', + 'train_config.step.synth_step', + ]); + }); + it('correctly filtering and returning empty array', () => { + let columns = [ + '__system__cpu', + '__system__disk_percent', + '__system__p_memory_percent', + ]; + toEqual(getFilteredSystemMetrics(columns, true), []); + }); +}); diff --git a/src/src/tests/utils/app/getSystemMetricsFromColumns.test.ts b/src/src/tests/utils/app/getSystemMetricsFromColumns.test.ts new file mode 100644 index 00000000..e4e2747c --- /dev/null +++ b/src/src/tests/utils/app/getSystemMetricsFromColumns.test.ts @@ -0,0 +1,148 @@ +import { toEqual } from 'tests/utils'; + +import getSystemMetricsFromColumns from 'utils/app/getSystemMetricsFromColumns'; + +describe('[Filter and get system metrics from table columns data]', () => { + it('correctly filtering and returning system metrics keys array', () => { + let columns = [ + { + key: 'Loss_type="mel_loss"', + content: { + key: null, + ref: null, + props: { + size: 'small', + color: '#3E72E7', + label: 'type="mel_loss"', + }, + }, + topHeader: 'Loss', + pin: null, + isHidden: false, + }, + { + key: 'Loss_type="duration_loss"', + content: { + key: null, + ref: null, + props: { + size: 'small', + color: '#3E72E7', + label: 'type="duration_loss"', + }, + }, + topHeader: 'Loss', + pin: null, + isHidden: false, + }, + { + key: '__system__cpu', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'CPU (%)', + }, + }, + topHeader: 'System Metrics', + pin: null, + isHidden: true, + }, + { + key: '__system__disk_percent', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'Disk (%)', + }, + }, + topHeader: 'System Metrics', + pin: null, + isHidden: true, + }, + { + key: '__system__p_memory_percent', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'Process Memory (%)', + }, + }, + topHeader: 'System Metrics', + pin: null, + isHidden: true, + }, + { + key: 'preprocess_config.dataset', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'preprocess_config.dataset', + }, + }, + topHeader: 'Params', + pin: null, + isHidden: false, + }, + ]; + toEqual( + ['__system__cpu', '__system__disk_percent', '__system__p_memory_percent'], + getSystemMetricsFromColumns(columns), + ); + }); + + it('correctly filtering and returning empty array', () => { + let columns = [ + { + key: 'train_config.path.result_path', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'train_config.path.result_path', + }, + }, + topHeader: 'Params', + pin: null, + isHidden: false, + }, + { + key: 'train_config.step.save_step', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'train_config.step.save_step', + }, + }, + topHeader: 'Params', + pin: null, + isHidden: false, + }, + { + key: 'train_config.step.synth_step', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'train_config.step.synth_step', + }, + }, + topHeader: 'Params', + pin: null, + isHidden: false, + }, + ]; + toEqual([], getSystemMetricsFromColumns(columns)); + }); +}); diff --git a/src/src/tests/utils/index.ts b/src/src/tests/utils/index.ts new file mode 100644 index 00000000..6118788a --- /dev/null +++ b/src/src/tests/utils/index.ts @@ -0,0 +1,48 @@ +export const shouldMatchObject = (expectedValue: any, actualValue: any) => { + expect(expectedValue).toMatchObject(actualValue); +}; + +/** + * [temp] for react-test-renderer + * @TODO delete this code later, after surely working with react testing library + */ +/* + export const getComponentTree = (Component: ReactComponentElement) => { + const component = renderer.create(Component); + return component.toJSON(); + }; + + + export const checkSnapshot = ( + testCase: string, + Component: ReactComponentElement, + ) => { + test(testCase, () => { + const tree = getComponentTree(Component); + expect(tree).toMatchSnapshot(); + }); + }; +*/ + +export const toEqual = (expectedValue: any, actualValue: any) => { + expect(expectedValue).toEqual(actualValue); +}; + +export const toBeGreaterThan = (expectedValue: any, actualValue: any) => { + expect(expectedValue).toBeGreaterThan(actualValue); +}; + +export const toBeLessThan = (expectedValue: any, actualValue: any) => { + expect(expectedValue).toBeLessThan(actualValue); +}; + +export const toBeGreaterThanOrEqual = ( + expectedValue: any, + actualValue: any, +) => { + expect(expectedValue).toBeGreaterThanOrEqual(actualValue); +}; + +export const toBeLessThanOrEqual = (expectedValue: any, actualValue: any) => { + expect(expectedValue).toBeLessThanOrEqual(actualValue); +}; diff --git a/src/src/types/components/AggregationPopover/AggregationPopover.d.ts b/src/src/types/components/AggregationPopover/AggregationPopover.d.ts new file mode 100644 index 00000000..72982fb3 --- /dev/null +++ b/src/src/types/components/AggregationPopover/AggregationPopover.d.ts @@ -0,0 +1,6 @@ +import { IAggregationConfig } from 'types/services/models/metrics/metricsAppModel'; + +export interface IAggregationPopoverProps { + aggregationConfig: IAggregationConfig; + onChange: (aggregationConfig: Partial) => void; +} diff --git a/src/src/types/components/AppBar/AppBar.d.ts b/src/src/types/components/AppBar/AppBar.d.ts new file mode 100644 index 00000000..8ecbc612 --- /dev/null +++ b/src/src/types/components/AppBar/AppBar.d.ts @@ -0,0 +1,8 @@ +import React from 'react'; + +export interface IAppBarProps { + title: string | ReactNode; + className?: string; + disabled?: boolean; + children?: React.ReactChildren | any; +} diff --git a/src/src/types/components/AttachedTagsList/AttachedTagsList.d.ts b/src/src/types/components/AttachedTagsList/AttachedTagsList.d.ts new file mode 100644 index 00000000..bf91c496 --- /dev/null +++ b/src/src/types/components/AttachedTagsList/AttachedTagsList.d.ts @@ -0,0 +1,14 @@ +import * as React from 'react'; + +import { ITagInfo } from 'types/pages/tags/Tags'; + +export interface IAttachedTagsListProps { + runHash: string; + initialTags?: ITagInfo[]; + tags?: ITagInfo[]; + addTagButtonSize?: 'small' | 'xSmall' | 'xxSmall'; + inlineAttachedTagsList?: boolean; + headerRenderer?: (tagsLength: number) => React.ReactNode; + onTagsChange?: (tags: ITagInfo[]) => void; + onRunsTagsChange?: (runHash: string, tags: ITagInfo[]) => void; +} diff --git a/src/src/types/components/AxesScalePopover/AxesScalePopover.d.ts b/src/src/types/components/AxesScalePopover/AxesScalePopover.d.ts new file mode 100644 index 00000000..b0fa2def --- /dev/null +++ b/src/src/types/components/AxesScalePopover/AxesScalePopover.d.ts @@ -0,0 +1,11 @@ +import { ScaleEnum } from 'utils/d3'; + +export interface IAxesScaleState { + xAxis: ScaleEnum; + yAxis: ScaleEnum; +} + +export interface IAxesScalePopoverProps { + onAxesScaleTypeChange: (params: IAxesScaleState) => void; + axesScaleType: IAxesScaleState; +} diff --git a/src/src/types/components/BookmarkForm/BookmarkForm.d.ts b/src/src/types/components/BookmarkForm/BookmarkForm.d.ts new file mode 100644 index 00000000..28f08417 --- /dev/null +++ b/src/src/types/components/BookmarkForm/BookmarkForm.d.ts @@ -0,0 +1,11 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; +export interface IBookmarkFormProps { + open: boolean; + onClose: () => void; + onBookmarkCreate: IMetricProps['onBookmarkCreate']; +} + +export interface IBookmarkFormState { + name: string; + description: string; +} diff --git a/src/src/types/components/BusyLoaderWrapper/BusyLoaderWrapper.d.ts b/src/src/types/components/BusyLoaderWrapper/BusyLoaderWrapper.d.ts new file mode 100644 index 00000000..05cc3062 --- /dev/null +++ b/src/src/types/components/BusyLoaderWrapper/BusyLoaderWrapper.d.ts @@ -0,0 +1,12 @@ +import React from 'react'; + +export interface IBusyLoaderWrapperProps { + isLoading: boolean; + className?: string; + children?: React.ReactElement | any; + loaderComponent?: React.ReactElement; + loaderType?: string; + loaderConfig?: object; + width?: string; + height?: string; +} diff --git a/src/src/types/components/ChartLoader/ChartLoader.d.ts b/src/src/types/components/ChartLoader/ChartLoader.d.ts new file mode 100644 index 00000000..30094af0 --- /dev/null +++ b/src/src/types/components/ChartLoader/ChartLoader.d.ts @@ -0,0 +1,3 @@ +export interface IChartLoaderProps { + controlsCount?: number; +} diff --git a/src/src/types/components/ChartPanel/ChartPanel.d.ts b/src/src/types/components/ChartPanel/ChartPanel.d.ts new file mode 100644 index 00000000..b43a91c2 --- /dev/null +++ b/src/src/types/components/ChartPanel/ChartPanel.d.ts @@ -0,0 +1,73 @@ +import React from 'react'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { ILine, ILineChartProps } from 'types/components/LineChart/LineChart'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { IProcessedData } from 'types/utils/d3/processLineChartData'; +import { + IAggregationConfig, + ITooltip, + IFocusedState, + IAlignmentConfig, + IChartZoom, + IGroupingSelectOption, + LegendsDataType, + LegendsConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { IHighPlotProps } from 'types/components/HighPlot/HighPlot'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { ChartTypeEnum } from 'utils/d3'; + +export interface IChartPanelProps { + chartType: ChartTypeEnum; + // TODO after line model definition change to HighPlot Line type + data: ILine[][] | any; + legendsData?: LegendsDataType; + panelResizing?: boolean; + focusedState: IFocusedState; + tooltip: ITooltip; + legends?: LegendsConfig; + aggregationConfig?: IAggregationConfig; + alignmentConfig?: IAlignmentConfig; + zoom?: Partial; + chartPanelOffsetHeight?: number; + // chartProps: Omit< + // ILineChartProps | IHighPlotProps, + // 'data' | 'index' | 'syncHoverState' + // >[]; + // TODO need to fix type later + chartProps: any[]; + controls: React.ReactNode; + onZoomChange?: (zoom: Partial) => void; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + onActivePointChange?: ( + activePoint: IActivePoint, + focusedStateActive?: boolean, + ) => void; + onChangeTooltip: (tooltip: ITooltip) => void; + onLegendsChange?: (legends: Partial) => void; + resizeMode?: ResizeModeEnum; + selectOptions: IGroupingSelectOption[]; +} + +export interface IChartPanelRef { + setActiveLineAndCircle?: ( + lineKey?: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => void; + updateLines: (data: IProcessedData[]) => void; +} + +export type IMemoizedForwardRefComponent = React.MemoExoticComponent< + React.ForwardRefExoticComponent> +>; + +export interface IChartTypeConfig { + [key: string]: + | IMemoizedForwardRefComponent + | IMemoizedForwardRefComponent + | IMemoizedForwardRefComponent; +} diff --git a/src/src/types/components/ChartPanel/ChartPopover.d.ts b/src/src/types/components/ChartPanel/ChartPopover.d.ts new file mode 100644 index 00000000..bb452195 --- /dev/null +++ b/src/src/types/components/ChartPanel/ChartPopover.d.ts @@ -0,0 +1,37 @@ +import React from 'react'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { + IAlignmentConfig, + IFocusedState, + ITooltip, + ITooltipContent, +} from 'types/services/models/metrics/metricsAppModel'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { ChartTypeEnum } from 'utils/d3'; + +export interface IChartPopover { + id?: string; + children?: React.ReactNode; + activePointRect: { + top: number; + bottom: number; + left: number; + right: number; + } | null; + open: boolean; + forceOpen?: boolean; + className?: string; + containerNode?: HTMLDivElement | null; + tooltipContent: ITooltipContent; + tooltipAppearance?: TooltipAppearanceEnum; + focusedState: IFocusedState; + chartType: ChartTypeEnum; + alignmentConfig?: IAlignmentConfig; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + selectOptions: IGroupingSelectOption[]; + onChangeTooltip: (tooltip: ITooltip) => void; +} diff --git a/src/src/types/components/ChartPanel/PopoverContent.d.ts b/src/src/types/components/ChartPanel/PopoverContent.d.ts new file mode 100644 index 00000000..ffc2066d --- /dev/null +++ b/src/src/types/components/ChartPanel/PopoverContent.d.ts @@ -0,0 +1,25 @@ +import { + ITooltipConfig, + TooltipAppearanceEnum, +} from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { + IAlignmentConfig, + IFocusedState, + IGroupingSelectOption, + ITooltipContent, +} from 'types/services/models/metrics/metricsAppModel'; +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { ChartTypeEnum } from 'utils/d3'; + +export interface IPopoverContentProps { + tooltipContent: ITooltipContent; + tooltipAppearance?: TooltipAppearanceEnum; + focusedState: IFocusedState; + chartType: ChartTypeEnum; + alignmentConfig?: IAlignmentConfig; + selectOptions: IGroupingSelectOption[]; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + onChangeTooltip?: (tooltip: Partial) => void; +} diff --git a/src/src/types/components/CodeBlock/CodeBlock.d.ts b/src/src/types/components/CodeBlock/CodeBlock.d.ts new file mode 100644 index 00000000..7b2de1d0 --- /dev/null +++ b/src/src/types/components/CodeBlock/CodeBlock.d.ts @@ -0,0 +1,5 @@ +export interface ICodeBlockProps { + code: string; + className?: string; + language?: string; +} diff --git a/src/src/types/components/ColorPopoverAdvanced/ColorPopoverAdvanced.d.ts b/src/src/types/components/ColorPopoverAdvanced/ColorPopoverAdvanced.d.ts new file mode 100644 index 00000000..1dcfbcfa --- /dev/null +++ b/src/src/types/components/ColorPopoverAdvanced/ColorPopoverAdvanced.d.ts @@ -0,0 +1,7 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +export interface IColorPopoverAdvancedProps { + persistence: boolean; + onPersistenceChange: IMetricProps['onGroupingPersistenceChange']; + onPaletteChange: (event: React.ChangeEvent) => void; +} diff --git a/src/src/types/components/ConfirmModal/ConfirmModal.d.ts b/src/src/types/components/ConfirmModal/ConfirmModal.d.ts new file mode 100644 index 00000000..80acf65c --- /dev/null +++ b/src/src/types/components/ConfirmModal/ConfirmModal.d.ts @@ -0,0 +1,15 @@ +import React from 'react'; + +export interface IConfirmModalProps { + open: boolean; + text?: string; + description?: string; + icon: React.ReactNode; + title?: string; + cancelBtnText?: string; + confirmBtnText?: string; + children?: React.ReactNode; + onSubmit: () => void; + onCancel: () => void; + statusType?: error | success | warning | info; +} diff --git a/src/src/types/components/ControlPopover/ControlPopover.d.ts b/src/src/types/components/ControlPopover/ControlPopover.d.ts new file mode 100644 index 00000000..6633eb84 --- /dev/null +++ b/src/src/types/components/ControlPopover/ControlPopover.d.ts @@ -0,0 +1,23 @@ +import React from 'react'; + +import { PopoverProps } from '@material-ui/core'; + +export default interface IControlPopoverProps extends Partial { + anchor: (params: { + onAnchorClick: (event: React.MouseEvent) => void; + opened?: boolean; + }) => React.FunctionComponentElement | HTMLElement | null; + component: + | ((params: { + handleClose?: () => void; + opened?: boolean; + }) => + | React.FunctionComponentElement + | HTMLElement + | null) + | React.FunctionComponentElement; + title?: string; + titleClassName?: string; + open?: boolean; + size?: 'small' | 'medium' | 'large'; +} diff --git a/src/src/types/components/CopyToClipBoard/CopyToClipBoard.d.ts b/src/src/types/components/CopyToClipBoard/CopyToClipBoard.d.ts new file mode 100644 index 00000000..ac0f883a --- /dev/null +++ b/src/src/types/components/CopyToClipBoard/CopyToClipBoard.d.ts @@ -0,0 +1,12 @@ +import React from 'react'; + +import { IButtonProps } from 'components/kit'; + +export interface ICopyToClipBoardProps { + contentRef?: React.RefObject; + showSuccessDelay?: number; + className?: string; + copyContent?: string | null; + iconSize?: IButtonProps['size']; + isURL?: bool | null; +} diff --git a/src/src/types/components/ErrorBoundary/ErrorBoundary.d.ts b/src/src/types/components/ErrorBoundary/ErrorBoundary.d.ts new file mode 100644 index 00000000..62926c44 --- /dev/null +++ b/src/src/types/components/ErrorBoundary/ErrorBoundary.d.ts @@ -0,0 +1,9 @@ +import React from 'react'; + +export interface IErrorBoundaryProps { + fallback?: React.ReactElement; +} + +export interface IErrorBoundaryState { + error: Error | null; +} diff --git a/src/src/types/components/GroupConfigPopover/GroupConfigPopover.d.ts b/src/src/types/components/GroupConfigPopover/GroupConfigPopover.d.ts new file mode 100644 index 00000000..be64a0b4 --- /dev/null +++ b/src/src/types/components/GroupConfigPopover/GroupConfigPopover.d.ts @@ -0,0 +1,3 @@ +export interface IGroupConfigPopoverProps { + configData: Array<{ name: string; value: string }>; +} diff --git a/src/src/types/components/GroupingPopover/GroupingPopover.d.ts b/src/src/types/components/GroupingPopover/GroupingPopover.d.ts new file mode 100644 index 00000000..e47d8c47 --- /dev/null +++ b/src/src/types/components/GroupingPopover/GroupingPopover.d.ts @@ -0,0 +1,28 @@ +import React from 'react'; + +import { IGroupingConfig } from 'services/models/explorer/createAppModel'; + +import { IMetricProps } from 'types/pages/metrics/Metrics'; +import { + GroupNameEnum, + IGroupingSelectOption, +} from 'types/services/models/metrics/metricsAppModel'; + +export interface IGroupingPopoverProps { + groupName: GroupNameEnum; + groupingData: IGroupingConfig; + advancedComponent?: React.FunctionComponentElement | null; + groupingSelectOptions: IGroupingSelectOption[]; + onSelect: IMetricProps['onGroupingSelectChange']; + onGroupingModeChange: IMetricProps['onGroupingModeChange']; + inputLabel?: string; +} + +export interface IGroupingPopoverAdvancedProps { + paletteIndex?: number; + persistence?: boolean; + groupingData: IGroupingConfig; + onPersistenceChange: IMetricProps['onGroupingPersistenceChange']; + onGroupingPaletteChange?: IMetricProps['onGroupingPaletteChange']; + onShuffleChange: IMetricProps['onShuffleChange']; +} diff --git a/src/src/types/components/HighPlot/HighPlot.d.ts b/src/src/types/components/HighPlot/HighPlot.d.ts new file mode 100644 index 00000000..11d5df72 --- /dev/null +++ b/src/src/types/components/HighPlot/HighPlot.d.ts @@ -0,0 +1,31 @@ +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { ISyncHoverStateArgs } from 'types/utils/d3/drawHoverAttributes'; +import { IChartTitle } from 'types/services/models/metrics/metricsAppModel'; + +import { CurveEnum } from 'utils/d3'; + +export interface IHighPlotProps { + index: number; + id?: string; + nameKey?: string; + brushExtents: { + [key: string]: { + [key: string]: [number, number] | [string, string]; + }; + }; + curveInterpolation: CurveEnum; + isVisibleColorIndicator: boolean; + syncHoverState: (args: ISyncHoverStateArgs) => void; + onAxisBrushExtentChange: ( + key: string, + extent: [number, number] | [string, string] | null, + chartIndex: number, + ) => void; + data: any; + chartTitle?: IChartTitle; + resizeMode?: ResizeModeEnum; + onMount?: () => void; + readOnly?: boolean; + margin?: { top: number; right: number; bottom: number; left: number }; +} diff --git a/src/src/types/components/HighlightModesPopover/HighlightModesPopover.d.ts b/src/src/types/components/HighlightModesPopover/HighlightModesPopover.d.ts new file mode 100644 index 00000000..b8155c9d --- /dev/null +++ b/src/src/types/components/HighlightModesPopover/HighlightModesPopover.d.ts @@ -0,0 +1,6 @@ +import { HighlightEnum } from 'utils/d3'; + +export interface IHighlightModesPopoverProps { + mode: HighlightEnum; + onChange: (mode: HighlightEnum) => void; +} diff --git a/src/src/types/components/IllustrationBlock/IllustrationBlock.d.ts b/src/src/types/components/IllustrationBlock/IllustrationBlock.d.ts new file mode 100644 index 00000000..b1e15149 --- /dev/null +++ b/src/src/types/components/IllustrationBlock/IllustrationBlock.d.ts @@ -0,0 +1,23 @@ +import React from 'react'; + +import { IllustrationsEnum } from 'config/illustrationConfig/illustrationConfig'; + +export interface IIllustrationBlockProps { + title?: string | React.ReactNode; + content?: string | React.ReactNode; + image?: React.FunctionComponentElement | HTMLImageElement; + className?: string; + page?: + | 'runs' + | 'metrics' + | 'params' + | 'image' + | 'audio' + | 'scatters' + | 'figures' + | 'bookmarks' + | 'tags'; + type?: IllustrationsEnum; + size?: 'small' | 'medium' | 'large' | 'xLarge'; + showImage?: boolean; +} diff --git a/src/src/types/components/LineChart/LineChart.d.ts b/src/src/types/components/LineChart/LineChart.d.ts new file mode 100644 index 00000000..bdbc9be6 --- /dev/null +++ b/src/src/types/components/LineChart/LineChart.d.ts @@ -0,0 +1,97 @@ +import { ResizeModeEnum } from 'config/enums/tableEnums'; + +import { + IActivePoint, + INearestCircle, + ISyncHoverStateArgs, +} from 'types/utils/d3/drawHoverAttributes'; +import { IAxesScaleRange } from 'types/components/AxesPropsPopover/AxesPropsPopover'; +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; +import { + IAggregatedData, + IAggregationConfig, + IAlignmentConfig, + IChartTitle, + IChartZoom, + IFocusedState, +} from 'types/services/models/metrics/metricsAppModel'; +import { IRun } from 'types/services/models/metrics/runModel'; + +import { CurveEnum, HighlightEnum } from 'utils/d3'; + +export interface ILine { + key: string; + data: { + xValues: number[]; + yValues: number[]; + }; + color?: string; + dasharray?: string; + selectors?: string[]; + groupKey?: string; + run?: IRun; + chartIndex?: number; +} + +export interface ILineChartProps { + index?: number; + id?: string; + data: ILine[]; + nameKey?: string; + aggregatedData?: IAggregatedData[]; + alignmentConfig?: IAlignmentConfig; + ignoreOutliers?: boolean; + axesScaleRange?: IAxesScaleRange; + highlightMode?: HighlightEnum; + curveInterpolation?: CurveEnum; + syncHoverState?: (args: ISyncHoverStateArgs) => void; + aggregationConfig?: IAggregationConfig; + chartTitle?: IChartTitle; + zoom?: IChartZoom; + onZoomChange?: (zoom: Partial) => void; + resizeMode?: ResizeModeEnum; + onMount?: () => void; + axesScaleType?: IAxesScaleState; + readOnly?: boolean; + margin?: { top: number; right: number; bottom: number; left: number }; +} + +export interface ILineChartRef { + setActiveLineAndCircle: ( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => void; + updateHoverAttributes: (xValue: number, dataSelector?: string) => void; + clearHoverAttributes: () => void; + setFocusedState: (focusedState: IFocusedState) => void; +} + +export interface IUpdateFocusedChartArgs { + mousePos?: [number, number]; + focusedStateActive?: boolean; + force?: boolean; +} + +export interface IAttributesRef { + focusedState?: IFocusedState; + activePoint?: IActivePoint; + nearestCircles?: INearestCircle[]; + groupKey?: string; + currentXValue?: number | string; + scaledValues?: { x: number; y: number }[][]; + lineKey?: string; + dataSelector?: string; + xScale?: IAxisScale; + yScale?: IAxisScale; + updateScales?: (xScale: IAxisScale, yScale: IAxisScale) => void; + setActiveLineAndCircle?: ( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ) => void; + updateHoverAttributes?: (xValue: number, dataSelector?: string) => void; + updateFocusedChart?: (args?: IUpdateFocusedChartArgs) => void; + clearHoverAttributes?: () => void; +} diff --git a/src/src/types/components/MultiSelect/MultiSelect.d.ts b/src/src/types/components/MultiSelect/MultiSelect.d.ts new file mode 100644 index 00000000..f9d6a8de --- /dev/null +++ b/src/src/types/components/MultiSelect/MultiSelect.d.ts @@ -0,0 +1,23 @@ +import React from 'react'; + +import { SelectProps } from '@material-ui/core'; + +export default interface IMultiSelectProps extends SelectProps { + values: any[]; + label?: string | number | React.ReactNode; + labelId?: string; + options: any[]; + formClassName?: string; + id?: string; + menuListHeight?: number; + onSelect: + | (( + event: React.ChangeEvent<{ + name?: string | undefined; + value: unknown; + }>, + child: React.ReactNode, + ) => void) + | undefined; + renderValue: (selected) => any; +} diff --git a/src/src/types/components/NotificationContainer/NotificationContainer.d.ts b/src/src/types/components/NotificationContainer/NotificationContainer.d.ts new file mode 100644 index 00000000..392b0074 --- /dev/null +++ b/src/src/types/components/NotificationContainer/NotificationContainer.d.ts @@ -0,0 +1,25 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +export interface INotificationContainer { + data: INotification[]; + handleClose: IMetricProps['onNotificationDelete']; +} + +export interface INotification { + id: number; + messages: string[]; + closeDelay?: number; + severity: 'error' | 'info' | 'success' | 'warning'; +} + +export interface ISyntaxErrorDetail { + line: number; + offset: number; + end_offset?: number; + statement: string; +} + +export interface ISyntaxErrorDetails { + detail: ISyntaxErrorDetail; + message: string; +} diff --git a/src/src/types/components/ResizeModeActions/ResizeModeActions.d.ts b/src/src/types/components/ResizeModeActions/ResizeModeActions.d.ts new file mode 100644 index 00000000..0cb65b38 --- /dev/null +++ b/src/src/types/components/ResizeModeActions/ResizeModeActions.d.ts @@ -0,0 +1,7 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +export interface IResizeModeActions { + onTableResizeModeChange: IMetricProps['onTableResizeModeChange']; + resizeMode: IMetricProps['resizeMode']; + className?: string; +} diff --git a/src/src/types/components/ResizePanel/ResizePanel.d.ts b/src/src/types/components/ResizePanel/ResizePanel.d.ts new file mode 100644 index 00000000..92288e9d --- /dev/null +++ b/src/src/types/components/ResizePanel/ResizePanel.d.ts @@ -0,0 +1,9 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +export interface IResizePanelProps { + panelResizing: boolean; + resizeElemRef: IMetricProps['resizeElemRef']; + resizeMode: IMetricProps['resizeMode']; + onTableResizeModeChange: IMetricProps['onTableResizeModeChange']; + className?: string; +} diff --git a/src/src/types/components/SelectTag/SelectTag.d.ts b/src/src/types/components/SelectTag/SelectTag.d.ts new file mode 100644 index 00000000..71299961 --- /dev/null +++ b/src/src/types/components/SelectTag/SelectTag.d.ts @@ -0,0 +1,11 @@ +import { Dispatch, SetStateAction } from 'react'; + +import { ITagInfo } from 'types/pages/tags/Tags'; + +export interface ISelectTagProps { + runHash: string; + attachedTags: ITagInfo[]; + setAttachedTags: Dispatch>; + onRunsTagsChange?: (runHash: string, tags: ITagInfo[]) => void; + updatePopover?: (key: string) => void; +} diff --git a/src/src/types/components/SmoothingPopover/SmoothingPopover.d.ts b/src/src/types/components/SmoothingPopover/SmoothingPopover.d.ts new file mode 100644 index 00000000..27f7a55a --- /dev/null +++ b/src/src/types/components/SmoothingPopover/SmoothingPopover.d.ts @@ -0,0 +1,6 @@ +import { ISmoothing } from 'types/services/models/metrics/metricsAppModel'; + +export interface ISmoothingPopoverProps { + onSmoothingChange: (props: Partial) => void; + smoothing: ISmoothing; +} diff --git a/src/src/types/components/TabPanel/TabPanel.d.ts b/src/src/types/components/TabPanel/TabPanel.d.ts new file mode 100644 index 00000000..86ad3c1b --- /dev/null +++ b/src/src/types/components/TabPanel/TabPanel.d.ts @@ -0,0 +1,6 @@ +export interface ITabPanelProps { + children?: React.ReactNode; + index: number | string; + value: number | string; + className?: string; +} diff --git a/src/src/types/components/Table/Table.d.ts b/src/src/types/components/Table/Table.d.ts new file mode 100644 index 00000000..6aa49da4 --- /dev/null +++ b/src/src/types/components/Table/Table.d.ts @@ -0,0 +1,111 @@ +import React from 'react'; + +import { RowHeight, RowHeightSize } from 'config/table/tableConfigs'; +import { + MetricsValueKeyEnum, + ResizeModeEnum, + VisualizationElementEnum, +} from 'config/enums/tableEnums'; + +import { AppNameEnum } from 'services/models/explorer'; + +import { IMetricProps } from 'types/pages/metrics/Metrics'; +import { IColumnsOrder } from 'types/services/models/explorer/createAppModel'; + +import { IIllustrationBlockProps } from '../IllustrationBlock/IllustrationBlock'; + +export interface ITableProps { + custom?: boolean; + groups?: boolean; + topHeader?: boolean; + data: any[] | null; + columns: any[]; + sameValueColumns?: string[] | []; + height?: string; + metricsValueKey?: MetricsValueKeyEnum; + rowHeight?: RowHeight; + estimatedRowHeight?: number; + onManageColumns?: (order: IColumnsOrderData) => void; + onColumnsVisibilityChange?: (hiddenColumns: string[] | string) => void; + hiddenChartRows?: boolean; + onTableDiffShow?: () => void; + onSort?: (field: string, value: 'asc' | 'desc' | 'none') => void; + onSortReset?: () => void; + onRowsChange?: (keys: string[]) => void; + onExport?: (e: React.ChangeEvent) => void; + onRowHeightChange?: (height: RowHeightSize) => void; + onMetricsValueKeyChange?: (key: MetricsValueKeyEnum) => void; + onTableResizeModeChange?: IMetricProps['onTableResizeModeChange']; + navBarItems?: { + name: string; + callBack: () => void; + }[]; + className?: string; + headerHeight?: number; + sortOptions?: GroupingSelectOptionType[]; + fixed?: boolean; + onRowHover?: (rowKey: string) => void; + onRowClick?: (rowKey?: string) => void; + hideHeaderActions?: boolean; + excludedFields?: string[]; + setExcludedFields?: (fields: string[]) => null; + alwaysVisibleColumns?: string[]; + rowHeightMode?: any; + columnsOrder?: IColumnsOrder; + hiddenColumns?: string[]; + hideSystemMetrics?: boolean; + updateColumns?: any; + columnsWidths?: any; + updateColumnsWidths?: any; + sortFields?: any; + hiddenRows?: string[]; + setSortFields?: any; + isLoading?: boolean; + infiniteLoadHandler?: (data: any) => void; + isInfiniteLoading?: boolean; + allowInfiniteLoading?: boolean; + showRowClickBehaviour?: boolean; + showResizeContainerActionBar?: boolean; + resizeMode?: ResizeModeEnum; + multiSelect?: boolean; + selectedRows?: any; + minHeight?: string; + onRowSelect?: any; + archiveRuns?: (ids: string[], archived: boolean) => void; + deleteRuns?: (ids: string[]) => void; + onRowsVisibilityChange?: (keys: string[]) => void; + onToggleColumnsColorScales?: (colKey: string) => void; + appName?: AppNameEnum; + focusedState?: any; + illustrationConfig?: IIllustrationConfig; + disableRowClick?: boolean; + columnsColorScales?: { [key: string]: boolean }; + visualizationElementType?: VisualizationElementEnum; + noColumnActions?: boolean; +} + +export interface ITableRef { + updateData: (params: { + newData?: any[]; + newColumns?: any[]; + hiddenColumns?: string[] | string; + }) => void; + setHoveredRow: (rowKey: string) => void; + setActiveRow: (rowKey: string) => void; + scrollToRow: (rowKey: string) => void; +} + +export interface IColumnsOrderData { + left: string[]; + middle: string[]; + right: string[]; +} + +export interface IIllustrationConfig { + size?: IIllustrationBlockProps['size']; + page?: IIllustrationBlockProps['page']; + type?: IIllustrationBlockProps['type']; + title?: IIllustrationBlockProps['title']; + content?: IIllustrationBlockProps['content']; + showImage?: IIllustrationBlockProps['showImage']; +} diff --git a/src/src/types/components/TagForm/TagForm.d.ts b/src/src/types/components/TagForm/TagForm.d.ts new file mode 100644 index 00000000..0ed621bb --- /dev/null +++ b/src/src/types/components/TagForm/TagForm.d.ts @@ -0,0 +1,12 @@ +export interface ITagFormProps { + tagData?: { + name: string; + color: string | null; + description: string | null; + archived: boolean; + }; + editMode?: boolean = false; + tagId?: string; + updateTagName?: (name: string) => void; + onCloseModal: () => void; +} diff --git a/src/src/types/components/Theme/Theme.d.ts b/src/src/types/components/Theme/Theme.d.ts new file mode 100644 index 00000000..ae79d768 --- /dev/null +++ b/src/src/types/components/Theme/Theme.d.ts @@ -0,0 +1,10 @@ +import React from 'react'; + +export interface IThemeProps { + children: React.ReactNode; +} + +export interface IThemeContextValues { + dark: boolean; + handleTheme: () => void; +} diff --git a/src/src/types/components/TooltipContentPopover/TooltipContentPopover.d.ts b/src/src/types/components/TooltipContentPopover/TooltipContentPopover.d.ts new file mode 100644 index 00000000..043bcde2 --- /dev/null +++ b/src/src/types/components/TooltipContentPopover/TooltipContentPopover.d.ts @@ -0,0 +1,14 @@ +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { + ITooltip, + IGroupingSelectOption, +} from 'types/services/models/metrics/metricsAppModel'; + +export interface ITooltipContentPopoverProps { + selectOptions: IGroupingSelectOption[]; + selectedFields?: string[]; + isTooltipDisplayed?: boolean; + tooltipAppearance?: TooltipAppearanceEnum; + onChangeTooltip: (tooltip: Partial) => void; +} diff --git a/src/src/types/components/ZoomInPopover/ZoomInPopover.d.ts b/src/src/types/components/ZoomInPopover/ZoomInPopover.d.ts new file mode 100644 index 00000000..6363a5b4 --- /dev/null +++ b/src/src/types/components/ZoomInPopover/ZoomInPopover.d.ts @@ -0,0 +1,8 @@ +import { IChartZoom } from 'types/services/models/metrics/metricsAppModel'; + +import { ZoomEnum } from 'utils/d3'; + +export interface IZoomInPopoverProps { + mode?: ZoomEnum; + onChange?: (zoom: Partial) => void; +} diff --git a/src/src/types/components/ZoomOutPopover/ZoomOutPopover.d.ts b/src/src/types/components/ZoomOutPopover/ZoomOutPopover.d.ts new file mode 100644 index 00000000..900dac2a --- /dev/null +++ b/src/src/types/components/ZoomOutPopover/ZoomOutPopover.d.ts @@ -0,0 +1,6 @@ +import { IChartZoom } from 'types/services/models/metrics/metricsAppModel'; + +export interface IZoomOutPopoverProps { + zoomHistory?: IChartZoom['history']; + onChange?: (zoom: Partial) => void; +} diff --git a/src/src/types/core/AimObjects/AimFlatObjectBase.d.ts b/src/src/types/core/AimObjects/AimFlatObjectBase.d.ts new file mode 100644 index 00000000..23075ff2 --- /dev/null +++ b/src/src/types/core/AimObjects/AimFlatObjectBase.d.ts @@ -0,0 +1,35 @@ +import { ITagInfo } from 'types/pages/tags/Tags'; + +import { Record } from '../shared'; + +export interface AimFlatObjectBase { + key: string; + data: T; + record?: Record; + groups?: { + rows?: string[]; + columns?: string[]; + [key: string]: string[]; + }; + run?: AimFlatObjectBaseRun; + [key: string]: any; +} + +export interface AimFlatObjectBaseRun { + // run props + name: string; + description: string; + experiment: string; + tags: ITagInfo[]; + experimentId: string; + hash: string; + archived: boolean; + creation_time: number; + end_time: number; + active: boolean; + // run params + dataset: Record; + hparams: Record; + v2_params: Record; + [key: string]: any; +} diff --git a/src/src/types/core/AimObjects/Audio.d.ts b/src/src/types/core/AimObjects/Audio.d.ts new file mode 100644 index 00000000..31e9e52a --- /dev/null +++ b/src/src/types/core/AimObjects/Audio.d.ts @@ -0,0 +1,5 @@ +export interface Audio { + caption: string; + blob_uri: string; + index: number; +} diff --git a/src/src/types/core/AimObjects/CustomObject.d.ts b/src/src/types/core/AimObjects/CustomObject.d.ts new file mode 100644 index 00000000..f699bab3 --- /dev/null +++ b/src/src/types/core/AimObjects/CustomObject.d.ts @@ -0,0 +1,29 @@ +import { Tuple } from '../shared'; + +import { SequenceBaseView } from './Sequence'; +import { Params, RunProps } from './Run'; + +export interface BaseRangeInfo { + record_range_used: Tuple; + record_range_total: Tuple; + index_range_used: Tuple | null; + index_range_total: Tuple | null; +} + +export interface ObjectSequenceBase extends BaseRangeInfo, SequenceBaseView { + values: Array; +} + +export interface ObjectSequenceFullView extends SequenceBaseView { + values: Array; + iters: Array; + epochs: Array; + timestamps: Array; +} + +export interface ObjectSearchRunView { + params: Params; + traces: Array; + ranges: BaseRangeInfo; + props: RunProps; +} diff --git a/src/src/types/core/AimObjects/Distribution.d.ts b/src/src/types/core/AimObjects/Distribution.d.ts new file mode 100644 index 00000000..0b198172 --- /dev/null +++ b/src/src/types/core/AimObjects/Distribution.d.ts @@ -0,0 +1,7 @@ +import { EncodedNumpyArray } from '../shared'; + +export interface Distribution { + data: EncodedNumpyArray; + bin_count: number; + range: [number, number]; +} diff --git a/src/src/types/core/AimObjects/Figure.d.ts b/src/src/types/core/AimObjects/Figure.d.ts new file mode 100644 index 00000000..9e979ef2 --- /dev/null +++ b/src/src/types/core/AimObjects/Figure.d.ts @@ -0,0 +1,3 @@ +export interface Figure { + blob_uri: string; +} diff --git a/src/src/types/core/AimObjects/Image.d.ts b/src/src/types/core/AimObjects/Image.d.ts new file mode 100644 index 00000000..17d7c160 --- /dev/null +++ b/src/src/types/core/AimObjects/Image.d.ts @@ -0,0 +1,7 @@ +export interface Image { + caption: string; + width: number; + height: number; + blob_uri: string; + index: number; +} diff --git a/src/src/types/core/AimObjects/Metric.d.ts b/src/src/types/core/AimObjects/Metric.d.ts new file mode 100644 index 00000000..795e3c8c --- /dev/null +++ b/src/src/types/core/AimObjects/Metric.d.ts @@ -0,0 +1,8 @@ +import { SequenceFullView } from './Sequence'; +import { Params, RunProps } from './Run'; + +export interface MetricSearchRunView { + params: Params; + traces: Array; + props: RunProps; +} diff --git a/src/src/types/core/AimObjects/Run.d.ts b/src/src/types/core/AimObjects/Run.d.ts new file mode 100644 index 00000000..ea2c9af4 --- /dev/null +++ b/src/src/types/core/AimObjects/Run.d.ts @@ -0,0 +1,52 @@ +import { SequenceFullView, SequenceOverview } from './Sequence'; + +export type Params = Record; + +export interface Tag { + id: string; + name: string; + color: string; + description: string; +} + +export interface Experiment { + id: string; + name: string; +} + +export interface RunProps { + hash: string; + name: string | null; + description: string | null; + experiment: Experiment | null; + tags: Array | null; + creation_time: number; + end_time: number | null; +} + +export interface RunInfo { + params: Params; + traces: Record>; + props: RunProps; +} + +export interface IndexRanges { + index_range_total?: [number, number]; + index_range_used?: [number, number]; +} + +export interface RecordRanges { + record_range_total?: [number, number]; + record_range_used?: [number, number]; +} + +export interface RunSearchRunView { + hash: string; + values: Array; + params: Params; + traces: Array; + props: RunProps; + ranges?: IndexRanges & RecordRanges; +} + +export interface Container extends RunSearchRunView {} diff --git a/src/src/types/core/AimObjects/Sequence.d.ts b/src/src/types/core/AimObjects/Sequence.d.ts new file mode 100644 index 00000000..27dafda9 --- /dev/null +++ b/src/src/types/core/AimObjects/Sequence.d.ts @@ -0,0 +1,35 @@ +import { Context, EncodedNumpyArray } from '../shared'; + +export interface SequenceBase { + context: Context; + name: string; +} + +export interface SequenceOverview extends SequenceBase { + values: number; +} + +export interface SequenceBaseView extends SequenceBase { + iters: Array; +} + +export interface Sequence extends SequenceBase { + iters: Array; +} + +export interface MetricsBaseView extends SequenceBaseView { + values: Array; +} + +export interface SequenceAlignedView extends SequenceBase { + x_axis_values: EncodedNumpyArray | null; + x_axis_iters: EncodedNumpyArray | null; +} + +export interface SequenceFullView extends SequenceAlignedView { + slice: [number, number, number]; + values: EncodedNumpyArray; + epochs: EncodedNumpyArray; + iters: EncodedNumpyArray; + timestamps: EncodedNumpyArray; +} diff --git a/src/src/types/core/AimObjects/index.d.ts b/src/src/types/core/AimObjects/index.d.ts new file mode 100644 index 00000000..653eeaf1 --- /dev/null +++ b/src/src/types/core/AimObjects/index.d.ts @@ -0,0 +1,9 @@ +export * from './AimFlatObjectBase'; +export * from './CustomObject'; +export * from './Distribution'; +export * from './Sequence'; +export * from './Metric'; +export * from './Audio'; +export * from './Figure'; +export * from './Image'; +export * from './Run'; diff --git a/src/src/types/core/enums/index.ts b/src/src/types/core/enums/index.ts new file mode 100644 index 00000000..3e7b068d --- /dev/null +++ b/src/src/types/core/enums/index.ts @@ -0,0 +1,26 @@ +/** + * Defined sequence names + */ +export enum SequenceTypesEnum { + Distributions = 'distributions', + Figures = 'figures', + Images = 'images', + Audios = 'audios', + Metric = 'metric', + Texts = 'texts', +} + +/** + * Depths of data coming from api, from which level should get the actual value of visualization data + */ +export enum AimObjectDepths { + Container = 0, + Sequence = 1, + Step = 2, + Index = 3, +} + +/** + * Sequence names as union type + */ +export type SequenceTypesUnion = `${SequenceTypesEnum}`; diff --git a/src/src/types/core/shared/index.d.ts b/src/src/types/core/shared/index.d.ts new file mode 100644 index 00000000..123dc348 --- /dev/null +++ b/src/src/types/core/shared/index.d.ts @@ -0,0 +1,31 @@ +export interface EncodedNumpyArray { + type: string; + shape: number; + dtype: string; + blob: Uint8Array; +} + +export type Context = Record; + +export type Union = T | D; + +export type Tuple = [T, T]; + +export type Record = { + index?: number; + step: number; +}; + +export type AllKeys = T extends any ? keyof T : never; + +export type Pick> = NonNullable< + T extends { [key in K]: any } ? T[K] : null +>; + +type PickTypeOf = K extends AllKeys + ? Pick + : Pick>; + +export type MergeUnion = { + [keys in AllKeys]: PickTypeOf; +}; diff --git a/src/src/types/global.d.ts b/src/src/types/global.d.ts new file mode 100644 index 00000000..06dbb196 --- /dev/null +++ b/src/src/types/global.d.ts @@ -0,0 +1,3 @@ +declare global { + const __DEV__: boolean; +} diff --git a/src/src/types/pages/bookmarks/Bookmarks.d.ts b/src/src/types/pages/bookmarks/Bookmarks.d.ts new file mode 100644 index 00000000..82e427c4 --- /dev/null +++ b/src/src/types/pages/bookmarks/Bookmarks.d.ts @@ -0,0 +1,17 @@ +import { ISelectConfig } from 'services/models/explorer/createAppModel'; + +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { IDashboardData } from 'types/services/models/metrics/metricsAppModel'; + +export interface IBookmarksProps { + data: IBookmarksData[]; + onBookmarkDelete: (id) => void; + isLoading: boolean; + notifyData: INotification[]; + onNotificationDelete: (id: number) => void; +} + +interface IBookmarksData extends IDashboardData { + select: ISelectConfig; + type: string; +} diff --git a/src/src/types/pages/bookmarks/components/BookmarkCard.d.ts b/src/src/types/pages/bookmarks/components/BookmarkCard.d.ts new file mode 100644 index 00000000..7e84f1ed --- /dev/null +++ b/src/src/types/pages/bookmarks/components/BookmarkCard.d.ts @@ -0,0 +1,5 @@ +import { IBookmarksData, IBookmarksProps } from '../Bookmarks'; + +export interface IBookmarkCardProps extends IBookmarksData { + onBookmarkDelete: IBookmarksProps['onBookmarkDelete']; +} diff --git a/src/src/types/pages/components/Grouping/Grouping.d.ts b/src/src/types/pages/components/Grouping/Grouping.d.ts new file mode 100644 index 00000000..3d246387 --- /dev/null +++ b/src/src/types/pages/components/Grouping/Grouping.d.ts @@ -0,0 +1,34 @@ +import React from 'react'; + +import { IGroupingPopoverAdvancedProps } from 'components/GroupingPopover/GroupingPopover'; + +import { IGroupingConfig } from 'services/models/explorer/createAppModel'; + +import { + GroupNameEnum, + IGroupingSelectOption, +} from 'types/services/models/metrics/metricsAppModel'; +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +export interface IGroupingProps { + groupingData: IGroupingConfig; + groupingSelectOptions: IGroupingSelectOption[]; + onGroupingSelectChange: IMetricProps['onGroupingSelectChange']; + onGroupingModeChange: IMetricProps['onGroupingModeChange']; + onGroupingPaletteChange: IMetricProps['onGroupingPaletteChange']; + onGroupingReset: IMetricProps['onGroupingReset']; + onGroupingApplyChange: IMetricProps['onGroupingApplyChange']; + onGroupingPersistenceChange: IMetricProps['onGroupingPersistenceChange']; + onShuffleChange: IMetricProps['onShuffleChange']; + groupingPopovers?: IGroupingPopovers[]; + isDisabled?: boolean; +} + +export interface IGroupingPopovers { + groupName: GroupNameEnum; + title: string; + inputLabel?: string; + AdvancedComponent?: ( + props: IGroupingPopoverAdvancedProps, + ) => React.FunctionComponentElement; +} diff --git a/src/src/types/pages/components/GroupingItem/GroupingItem.d.ts b/src/src/types/pages/components/GroupingItem/GroupingItem.d.ts new file mode 100644 index 00000000..e722cc12 --- /dev/null +++ b/src/src/types/pages/components/GroupingItem/GroupingItem.d.ts @@ -0,0 +1,19 @@ +import React from 'react'; + +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { IGroupingPopoverProps } from 'types/components/GroupingPopover/GroupingPopover'; +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; +import { IGroupingConfig } from 'types/services/models/explorer/createAppModel'; + +export interface IGroupingItemProps extends IGroupingPopoverProps { + title: string; + inputLabel?: string; + isDisabled: boolean; + groupName: GroupNameEnum; + groupingData: IGroupingConfig; + advancedComponent?: React.FunctionComponentElement; + groupingSelectOptions: IGroupingSelectOption[]; + onReset: () => void; + onVisibilityChange: () => void; +} diff --git a/src/src/types/pages/imagesExplore/components/Controls/Controls.d.ts b/src/src/types/pages/imagesExplore/components/Controls/Controls.d.ts new file mode 100644 index 00000000..1711ac88 --- /dev/null +++ b/src/src/types/pages/imagesExplore/components/Controls/Controls.d.ts @@ -0,0 +1,25 @@ +import { ImageRenderingEnum } from 'config/enums/imageEnums'; + +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { + ITooltip, + SortField, +} from 'types/services/models/metrics/metricsAppModel'; +import { IImagesExploreAppConfig } from 'types/services/models/imagesExplore/imagesExploreAppModel'; + +export interface IControlProps { + selectOptions: IGroupingSelectOption[]; + tooltip?: ITooltip; + orderedMap: { [key: string]: any }; + onChangeTooltip: (tooltip: Partial) => void; + additionalProperties: IImagesExploreAppConfig['images']['additionalProperties']; + onImageSizeChange: (newValue: number) => void; + onImageRenderingChange: (type: ImageRenderingEnum) => void; + onImageAlignmentChange: ( + value: { value: string; label: string } | null, + ) => void; + onStackingToggle: () => void; + onImagesSortReset: () => void; + onImagesSortChange: any; + sortFields: SortField[]; +} diff --git a/src/src/types/pages/imagesExplore/components/SelectForm/SelectForm.d.ts b/src/src/types/pages/imagesExplore/components/SelectForm/SelectForm.d.ts new file mode 100644 index 00000000..6284ac99 --- /dev/null +++ b/src/src/types/pages/imagesExplore/components/SelectForm/SelectForm.d.ts @@ -0,0 +1,22 @@ +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; +import { ISelectOption } from 'types/services/models/explorer/createAppModel'; + +export interface ISelectFormProps { + // selectedMetricsData: IMetricAppConfig['select']; + requestIsPending: boolean; + isDisabled?: boolean; + selectedImagesData: any; + selectFormData: { + options: ISelectOption[]; + suggestions: Record; + advancedSuggestions: Record; + error: ISyntaxErrorDetails; + advancedError: ISyntaxErrorDetails; + }; + onImagesExploreSelectChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; + onSelectAdvancedQueryChange: (query: string) => void; + toggleSelectAdvancedMode: () => void; + onSearchQueryCopy: () => void; + searchButtonDisabled: boolean; +} diff --git a/src/src/types/pages/metrics/Metrics.d.ts b/src/src/types/pages/metrics/Metrics.d.ts new file mode 100644 index 00000000..4a7d0517 --- /dev/null +++ b/src/src/types/pages/metrics/Metrics.d.ts @@ -0,0 +1,158 @@ +import React from 'react'; +import { RouteChildrenProps } from 'react-router-dom'; + +import { RowHeightSize } from 'config/table/tableConfigs'; +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { DensityOptions } from 'config/enums/densityEnum'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { + IGroupingConfig, + ISelectConfig, +} from 'services/models/explorer/createAppModel'; +import { ISelectOption } from 'services/models/explorer/createAppModel'; + +import { ITableRef } from 'types/components/Table/Table'; +import { + GroupNameEnum, + IMetricTableRowData, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, + IFocusedState, + IMetricAppModelState, + IAggregationConfig, + IAggregatedData, + IAlignmentConfig, + ITooltip, + IChartTitleData, + IGroupingSelectOption, + IChartZoom, + ISmoothing, + LegendsDataType, + LegendsConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { ITableColumn } from 'types/components/TableColumns/TableColumns'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { IBookmarkFormState } from 'types/components/BookmarkForm/BookmarkForm'; +import { + INotification, + ISyntaxErrorDetails, +} from 'types/components/NotificationContainer/NotificationContainer'; +import { ILine } from 'types/components/LineChart/LineChart'; +import { IAxesScaleRange } from 'types/components/AxesPropsPopover/AxesPropsPopover'; +import { IColumnsOrder } from 'types/services/models/explorer/createAppModel'; +import { ITagInfo } from 'types/tags/Tags'; + +import { HighlightEnum } from 'utils/d3'; +import { IRequestProgress } from 'utils/app/setRequestProgress'; + +export interface IMetricProps extends Partial { + tableRef: React.RefObject; + chartPanelRef: React.RefObject; + tableElemRef: React.RefObject; + chartElemRef: React.RefObject; + wrapperElemRef: React.RefObject; + resizeElemRef: React.RefObject; + chartPanelOffsetHeight?: number; + lineChartData: ILine[][]; + panelResizing: boolean; + chartTitleData: IChartTitleData; + legendsData: LegendsDataType; + tableData: IMetricTableRowData[]; + aggregatedData: IAggregatedData[]; + tableColumns: ITableColumn[]; + ignoreOutliers: boolean; + legends: LegendsConfig; + zoom: IChartZoom; + densityType: DensityOptions; + axesScaleType: IAxesScaleState; + axesScaleRange: IAxesScaleRange; + smoothing: ISmoothing; + focusedState: IFocusedState; + highlightMode: HighlightEnum; + groupingData: IGroupingConfig; + notifyData: IMetricAppModelState['notifyData']; + tooltip: ITooltip; + aggregationConfig: IAggregationConfig; + alignmentConfig: IAlignmentConfig; + selectedMetricsData: ISelectConfig; + tableRowHeight: RowHeightSize; + selectedRows: { [key: string]: any }; + sortFields: [string, 'asc' | 'desc' | boolean][]; + hiddenMetrics: string[]; + hiddenColumns: string[]; + hideSystemMetrics: boolean; + sameValueColumns?: string[] | []; + groupingSelectOptions: IGroupingSelectOption[]; + sortOptions: IGroupingSelectOption[]; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + resizeMode: ResizeModeEnum; + selectFormData: { + options: ISelectOption[]; + suggestions: string[]; + error: ISyntaxErrorDetails; + advancedError: ISyntaxErrorDetails; + }; + columnsOrder: IColumnsOrder; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + onChangeTooltip: (tooltip: Partial) => void; + onIgnoreOutliersChange: () => void; + onLegendsChange: (legends: Partial) => void; + onZoomChange: (zoom: Partial) => void; + onActivePointChange?: ( + activePoint: IActivePoint, + focusedStateActive?: boolean, + ) => void; + onHighlightModeChange: (mode: HighlightEnum) => void; + onSmoothingChange: (args: Partial) => void; + onTableRowHover: (rowKey?: string) => void; + onTableRowClick: (rowKey?: string) => void; + onAxesScaleTypeChange: (params: IAxesScaleState) => void; + onAxesScaleRangeChange: (range: Partial) => void; + onAggregationConfigChange: ( + aggregationConfig: Partial, + ) => void; + onGroupingSelectChange: (params: IOnGroupingSelectChangeParams) => void; + onGroupingModeChange: (params: IOnGroupingModeChangeParams) => void; + onGroupingPaletteChange: (index: number) => void; + onGroupingReset: (groupName: GroupNameEnum) => void; + onGroupingApplyChange: (groupName: GroupNameEnum) => void; + onGroupingPersistenceChange: (groupName: 'color' | 'stroke') => void; + onBookmarkCreate: (params: IBookmarkFormState) => void; + onBookmarkUpdate: (id: string) => void; + onNotificationAdd: (notification: INotification) => void; + onNotificationDelete: (id: number) => void; + onResetConfigData: () => void; + onAlignmentMetricChange: (metric: string) => void; + onAlignmentTypeChange: (type: XAlignmentEnum) => void; + onDensityTypeChange: (type: DensityOptions) => void; + onMetricsSelectChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; + onSelectAdvancedQueryChange: (query: string) => void; + onRowsVisibilityChange: (metricKeys: string[]) => void; + toggleSelectAdvancedMode: () => void; + onExportTableData: (e: React.ChangeEvent) => void; + onRowHeightChange: (height: RowHeightSize) => void; + onSortReset: () => void; + onSortChange?: (field: string, value?: 'asc' | 'desc' | 'none') => void; + onMetricVisibilityChange: (metricKeys: string[]) => void; + onColumnsOrderChange: (order: any) => void; + onColumnsVisibilityChange: (hiddenColumns: string[] | string) => void; + onTableDiffShow: () => void; + onTableResizeModeChange: (mode: ResizeModeEnum) => void; + updateColumnsWidths: (key: string, width: number, isReset: boolean) => void; + columnsWidths: { [key: string]: number }; + onShuffleChange: (name: 'stroke' | 'color') => void; + onSearchQueryCopy: () => void; + liveUpdateConfig: { delay: number; enabled: boolean }; + onLiveUpdateConfigChange: (config: { + delay?: number; + enabled?: boolean; + }) => void; + onRowSelect: any; + archiveRuns: (ids: string[], archived: boolean) => void; + deleteRuns: (ids: string[]) => void; +} diff --git a/src/src/types/pages/metrics/components/Controls/Controls.d.ts b/src/src/types/pages/metrics/components/Controls/Controls.d.ts new file mode 100644 index 00000000..d7fa8edd --- /dev/null +++ b/src/src/types/pages/metrics/components/Controls/Controls.d.ts @@ -0,0 +1,55 @@ +import { ILine } from 'components/LineChart/LineChart'; + +import { DensityOptions } from 'config/enums/densityEnum'; + +import { ISelectOption } from 'services/models/explorer/createAppModel'; + +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { IAxesScaleRange } from 'types/components/AxesPropsPopover/AxesPropsPopover'; +import { + IAggregationConfig, + IAlignmentConfig, + ITooltip, + IChartZoom, + IGroupingSelectOption, + ISmoothing, + LegendsDataType, + LegendsConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +import { ChartTypeEnum, HighlightEnum } from 'utils/d3'; + +export interface IControlProps { + chartProps: any[]; + chartType: ChartTypeEnum; + data: ILine[][] | any; + legendsData?: LegendsDataType; + selectOptions: IGroupingSelectOption[]; + tooltip?: ITooltip; + legends?: LegendsConfig; + ignoreOutliers: boolean; + zoom?: IChartZoom; + highlightMode: HighlightEnum; + aggregationConfig: IAggregationConfig; + axesScaleType: IAxesScaleState; + axesScaleRange: IAxesScaleRange; + smoothing: ISmoothing; + alignmentConfig: IAlignmentConfig; + densityType: DensityOptions; + selectFormOptions: ISelectOption[]; + onChangeTooltip: (tooltip: Partial) => void; + onIgnoreOutliersChange: () => void; + onLegendsChange: (legends: Partial) => void; + onHighlightModeChange: (mode: number) => void; + onDensityTypeChange: (type: DensityOptions) => void; + onSmoothingChange: (args: Partial) => void; + onAxesScaleTypeChange: (args: IAxesScaleState) => void; + onAggregationConfigChange: ( + aggregationConfig: Partial, + ) => void; + onZoomChange?: (zoom: Partial) => void; + onAlignmentTypeChange: IMetricProps['onAlignmentTypeChange']; + onAlignmentMetricChange: IMetricProps['onAlignmentMetricChange']; + onAxesScaleRangeChange: IMetricProps['onAxesScaleRangeChange']; +} diff --git a/src/src/types/pages/metrics/components/MetricsBar/MetricsBar.d.ts b/src/src/types/pages/metrics/components/MetricsBar/MetricsBar.d.ts new file mode 100644 index 00000000..6ac87851 --- /dev/null +++ b/src/src/types/pages/metrics/components/MetricsBar/MetricsBar.d.ts @@ -0,0 +1,15 @@ +import { IMetricProps } from 'types/pages/metrics/Metrics'; + +export interface IMetricsBarProps { + onBookmarkCreate: IMetricProps['onBookmarkCreate']; + onBookmarkUpdate: IMetricProps['onBookmarkUpdate']; + onResetConfigData: IMetricProps['onResetConfigData']; + liveUpdateConfig: { delay: number; enabled: boolean }; + explorerName?: 'IMAGES' | 'PARAMS' | 'METRICS' | 'SCATTERS' | 'RUNS'; + disabled?: boolean; + onLiveUpdateConfigChange: (config: { + delay?: number; + enabled?: boolean; + }) => void; + title: string; +} diff --git a/src/src/types/pages/metrics/components/SelectForm/SelectForm.d.ts b/src/src/types/pages/metrics/components/SelectForm/SelectForm.d.ts new file mode 100644 index 00000000..84e2a519 --- /dev/null +++ b/src/src/types/pages/metrics/components/SelectForm/SelectForm.d.ts @@ -0,0 +1,22 @@ +import { ISelectOption } from 'services/models/explorer/createAppModel'; + +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export interface ISelectFormProps { + requestIsPending: boolean; + isDisabled?: boolean; + selectedMetricsData: IAppModelConfig['select']; + selectFormData: { + options: ISelectOption[]; + suggestions: Record; + advancedSuggestions?: Record; + error: ISyntaxErrorDetails; + advancedError: ISyntaxErrorDetails; + }; + onMetricsSelectChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; + onSelectAdvancedQueryChange: (query: string) => void; + toggleSelectAdvancedMode: () => void; + onSearchQueryCopy: () => void; +} diff --git a/src/src/types/pages/metrics/components/SortPopover/SortPopover.d.ts b/src/src/types/pages/metrics/components/SortPopover/SortPopover.d.ts new file mode 100644 index 00000000..92ecf99a --- /dev/null +++ b/src/src/types/pages/metrics/components/SortPopover/SortPopover.d.ts @@ -0,0 +1,20 @@ +import { AppNameEnum } from 'services/models/explorer'; + +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; + +import { SortFields } from 'utils/getSortedFields'; + +export interface ISortPopoverProps { + onSort: any; + onReset: () => void; + sortOptions: IGroupingSelectOption[]; + sortFields: SortFields; + readOnlyFieldsLabel?: string; + appName?: AppNameEnum; +} +export interface ISortPopoverListProps { + onSort: any; + sortFields: SortFields; + filteredSortFields: SortFields; + title?: string; +} diff --git a/src/src/types/pages/metrics/components/TableColumns/TableColumns.d.ts b/src/src/types/pages/metrics/components/TableColumns/TableColumns.d.ts new file mode 100644 index 00000000..75a73505 --- /dev/null +++ b/src/src/types/pages/metrics/components/TableColumns/TableColumns.d.ts @@ -0,0 +1,10 @@ +import React from 'react'; + +export interface ITableColumn { + key: string; + label?: string; + content: React.ReactNode | string; + topHeader: string; + pin?: string | null; + isHidden?: boolean; +} diff --git a/src/src/types/pages/params/Params.d.ts b/src/src/types/pages/params/Params.d.ts new file mode 100644 index 00000000..718c3ba0 --- /dev/null +++ b/src/src/types/pages/params/Params.d.ts @@ -0,0 +1,127 @@ +import React from 'react'; +import { RouteChildrenProps } from 'react-router-dom'; + +import { ITableRef } from 'components/Table/Table'; + +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { + GroupNameEnum, + IChartTitleData, + ITooltip, + IFocusedState, + IGroupingSelectOption, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, +} from 'types/services/models/metrics/metricsAppModel'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { + INotification, + ISyntaxErrorDetails, +} from 'types/components/NotificationContainer/NotificationContainer'; +import { IBookmarkFormState } from 'types/components/BookmarkForm/BookmarkForm'; +import { + IColumnsOrder, + IGroupingConfig, + ISelectConfig, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; + +import { CurveEnum } from 'utils/d3'; +import { IRequestProgress } from 'utils/app/setRequestProgress'; + +export interface IParamsProps extends Partial { + chartElemRef: React.RefObject; + chartPanelRef: React.RefObject; + tableRef: React.RefObject; + tableElemRef: React.RefObject; + wrapperElemRef: React.RefObject; + resizeElemRef: React.RefObject; + chartPanelOffsetHeight?: number; + curveInterpolation: CurveEnum; + panelResizing: boolean; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + highPlotData: any; + groupingData: IGroupingConfig; + groupingSelectOptions: IGroupingSelectOption[]; + sortOptions: IGroupingSelectOption[]; + hiddenMetrics: string[]; + hideSystemMetrics: boolean; + sortFields: [string, 'asc' | 'desc' | boolean][]; + focusedState: IFocusedState; + isVisibleColorIndicator: boolean; + tooltip: ITooltip; + chartTitleData: IChartTitleData; + selectedParamsData: ISelectConfig; + onRowHeightChange: any; + onSortFieldsChange: any; + onParamVisibilityChange: any; + onColumnsOrderChange: any; + tableData: any; + selectedRows: { [key: string]: any }; + brushExtents: { + [key: string]: { + [key: string]: [number, number] | [string, string]; + }; + }; + onTableRowHover?: (rowKey?: string) => void; + onTableRowClick?: (rowKey?: string) => void; + tableColumns: any; + resizeMode: ResizeModeEnum; + notifyData: INotification[]; + tableRowHeight?: any; + hiddenColumns: any; + selectFormData: { + options: ISelectOption[]; + suggestions: string[]; + error: ISyntaxErrorDetails; + }; + columnsOrder: IColumnsOrder; + sameValueColumns: string[] | []; + onNotificationDelete: (id: number) => void; + onCurveInterpolationChange: () => void; + onActivePointChange: ( + activePoint: IActivePoint, + focusedStateActive: boolean = false, + ) => void; + onColorIndicatorChange: () => void; + onParamsSelectChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; + onGroupingSelectChange: (params: IOnGroupingSelectChangeParams) => void; + onGroupingModeChange: (params: IOnGroupingModeChangeParams) => void; + onGroupingPaletteChange: (index: number) => void; + onGroupingReset: (groupName: GroupNameEnum) => void; + onGroupingApplyChange: (groupName: GroupNameEnum) => void; + onGroupingPersistenceChange: (groupName: 'color' | 'stroke') => void; + onBookmarkCreate: (params: IBookmarkFormState) => void; + onBookmarkUpdate: (id: string) => void; + onNotificationAdd: (notification: INotification) => void; + onResetConfigData: () => void; + onChangeTooltip: (tooltip: Partial) => void; + onExportTableData: (e: React.ChangeEvent) => void; + onColumnsVisibilityChange: (order: any) => void; + onTableDiffShow: () => void; + onTableResizeModeChange: (mode: ResizeModeEnum) => void; + onSortReset: () => void; + updateColumnsWidths: (key: string, width: number, isReset: boolean) => void; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + onShuffleChange: (name: 'stroke' | 'color') => void; + onAxisBrushExtentChange: ( + key: string, + extent: [number, number] | [string, string] | null, + chartIndex: number, + ) => void; + columnsWidths: { [key: string]: number }; + liveUpdateConfig: { delay: number; enabled: boolean }; + onLiveUpdateConfigChange: (config: { + delay?: number; + enabled?: boolean; + }) => void; + onRowSelect: any; + archiveRuns: (ids: string[], archived: boolean) => void; + deleteRuns: (ids: string[]) => void; + onRowsVisibilityChange: (metricKeys: string[]) => void; +} diff --git a/src/src/types/pages/params/components/Controls/Controls.d.ts b/src/src/types/pages/params/components/Controls/Controls.d.ts new file mode 100644 index 00000000..1a189246 --- /dev/null +++ b/src/src/types/pages/params/components/Controls/Controls.d.ts @@ -0,0 +1,16 @@ +import { + IGroupingSelectOption, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; + +import { CurveEnum } from 'utils/d3'; + +export interface IControlProps { + curveInterpolation: CurveEnum; + isVisibleColorIndicator: boolean; + selectOptions: IGroupingSelectOption[]; + tooltip?: ITooltip; + onColorIndicatorChange: () => void; + onCurveInterpolationChange: () => void; + onChangeTooltip: (tooltip: Partial) => void; +} diff --git a/src/src/types/pages/params/components/SelectForm/SelectForm.d.ts b/src/src/types/pages/params/components/SelectForm/SelectForm.d.ts new file mode 100644 index 00000000..76eabddd --- /dev/null +++ b/src/src/types/pages/params/components/SelectForm/SelectForm.d.ts @@ -0,0 +1,17 @@ +import { ISelectOption } from 'services/models/explorer/createAppModel'; + +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export interface ISelectFormProps { + selectFormData: { + options: ISelectOption[]; + suggestions: Record; + error: ISyntaxErrorDetails; + }; + requestIsPending: boolean; + isDisabled?: boolean; + selectedParamsData: IAppModelConfig['select']; + onParamsSelectChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; +} diff --git a/src/src/types/pages/runs/Runs.d.ts b/src/src/types/pages/runs/Runs.d.ts new file mode 100644 index 00000000..5423bb66 --- /dev/null +++ b/src/src/types/pages/runs/Runs.d.ts @@ -0,0 +1,48 @@ +import React from 'react'; + +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { MetricsValueKeyEnum } from 'config/enums/tableEnums'; + +import { IColumnsOrder } from 'types/services/models/explorer/createAppModel'; +import { + IMetricTrace, + IParamTrace, + IRun, +} from 'types/services/models/metrics/runModel'; + +import { ITagProps } from '../tags/Tags'; + +export interface IRunsProps { + tableData: IRun[]; +} + +export interface IRunsTableProps { + columnsOrder: IColumnsOrder; + tableRef: React.RefObject; + runsList: ITagProps[]; + isInfiniteLoading: boolean; + hiddenColumns: string[]; + hideSystemMetrics: boolean; + columns: any; + metricsValueKey: MetricsValueKeyEnum; + tableRowHeight: number; + requestStatus: RequestStatusEnum; + sameValueColumns: string[] | []; + onExportTableData: () => void; + onManageColumns: () => void; + onColumnsVisibilityChange: (hiddenColumns: string[] | string) => void; + onTableDiffShow: () => void; + onMetricsValueKeyChange: (key: MetricsValueKeyEnum) => void; + onRowHeightChange: () => void; + getLastRunsData: (row: any) => any; + isLatest?: boolean; + data: any; + columnsWidths: { [key: string]: number }; + columnsColorScales: { [key: string]: boolean }; + updateColumnsWidths: (key: string, width: number, isReset: boolean) => void; + selectedRows: { [key: string]: any }; + onRowSelect: (key: string) => any; + archiveRuns: (ids: string[], archived: boolean) => void; + deleteRuns: (ids: string[]) => void; + onToggleColumnsColorScales: (colKey: string) => void; +} diff --git a/src/src/types/pages/scatters/Scatters.d.ts b/src/src/types/pages/scatters/Scatters.d.ts new file mode 100644 index 00000000..92857a05 --- /dev/null +++ b/src/src/types/pages/scatters/Scatters.d.ts @@ -0,0 +1,121 @@ +import React from 'react'; +import { RouteChildrenProps } from 'react-router-dom'; + +import { RowHeightSize } from 'config/table/tableConfigs'; +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { + ISelectConfig, + ISelectOption, + IGroupingConfig, + IColumnsOrder, +} from 'types/services/models/explorer/createAppModel'; +import { IScatterAppModelState } from 'types/services/models/scatter/scatterAppModel'; +import { ITableRef } from 'types/components/Table/Table'; +import { + GroupNameEnum, + IMetricTableRowData, + IOnGroupingModeChangeParams, + IOnGroupingSelectChangeParams, + IFocusedState, + ITooltip, + IChartTitleData, + IGroupingSelectOption, +} from 'types/services/models/metrics/metricsAppModel'; +import { ITableColumn } from 'types/components/TableColumns/TableColumns'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { IActivePoint } from 'types/utils/d3/drawHoverAttributes'; +import { IBookmarkFormState } from 'types/components/BookmarkForm/BookmarkForm'; +import { + INotification, + ISyntaxErrorDetails, +} from 'types/components/NotificationContainer/NotificationContainer'; +import { IProjectParamsMetrics } from 'types/services/models/projects/projectsModel'; +import { ITrendlineOptions } from 'types/services/models/scatter/scatterAppModel'; + +import { IRequestProgress } from 'utils/app/setRequestProgress'; + +export interface IScattersProps extends Partial { + tableRef: React.RefObject; + chartPanelRef: React.RefObject; + tableElemRef: React.RefObject; + chartElemRef: React.RefObject; + wrapperElemRef: React.RefObject; + resizeElemRef: React.RefObject; + chartPanelOffsetHeight?: number; + scatterPlotData: any[]; + panelResizing: boolean; + chartTitleData: IChartTitleData; + tableData: IMetricTableRowData[]; + tableColumns: ITableColumn[]; + focusedState: IFocusedState; + groupingData: IGroupingConfig; + notifyData: IScatterAppModelState['notifyData']; + tooltip: ITooltip; + selectedOptionsData: ISelectConfig; + tableRowHeight: RowHeightSize; + sortFields: [string, 'asc' | 'desc' | boolean][]; + hiddenMetrics: string[]; + hiddenColumns: string[]; + hideSystemMetrics: boolean; + groupingSelectOptions: IGroupingSelectOption[]; + sortOptions: IGroupingSelectOption[]; + projectsDataMetrics: IProjectParamsMetrics['metrics']; + resizeMode: ResizeModeEnum; + selectFormData: { + options: ISelectOption[]; + suggestions: string[]; + error: ISyntaxErrorDetails; + }; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + trendlineOptions: ITrendlineOptions; + sameValueColumns?: string[] | []; + selectedRows: { [key: string]: any }; + columnsOrder: IColumnsOrder; + onChangeTooltip: (tooltip: Partial) => void; + onChangeTrendlineOptions: (options: Partial) => void; + onActivePointChange?: ( + activePoint: IActivePoint, + focusedStateActive?: boolean, + ) => void; + onTableRowHover: (rowKey?: string) => void; + onTableRowClick: (rowKey?: string) => void; + onGroupingSelectChange: (params: IOnGroupingSelectChangeParams) => void; + onGroupingModeChange: (params: IOnGroupingModeChangeParams) => void; + onGroupingPaletteChange: (index: number) => void; + onGroupingReset: (groupName: GroupNameEnum) => void; + onGroupingApplyChange: (groupName: GroupNameEnum) => void; + onGroupingPersistenceChange: (groupName: 'color' | 'stroke') => void; + onBookmarkCreate: (params: IBookmarkFormState) => void; + onBookmarkUpdate: (id: string) => void; + onNotificationAdd: (notification: INotification) => void; + onNotificationDelete: (id: number) => void; + onResetConfigData: () => void; + onSelectOptionsChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; + onExportTableData: (e: React.ChangeEvent) => void; + onRowHeightChange: (height: RowHeightSize) => void; + onSortReset: () => void; + onSortChange?: (field: string, value?: 'asc' | 'desc' | 'none') => void; + onParamVisibilityChange: (metricKeys: string[]) => void; + onColumnsOrderChange: (order: any) => void; + onColumnsVisibilityChange: (hiddenColumns: string[] | string) => void; + onTableDiffShow: () => void; + onTableResizeModeChange: (mode: ResizeModeEnum) => void; + updateColumnsWidths: (key: string, width: number, isReset: boolean) => void; + columnsWidths: { [key: string]: number }; + onShuffleChange: (name: 'stroke' | 'color') => void; + onSearchQueryCopy: () => void; + liveUpdateConfig: { delay: number; enabled: boolean }; + onRunsTagsChange: (runHash: string, tags: ITagInfo[]) => void; + onLiveUpdateConfigChange: (config: { + delay?: number; + enabled?: boolean; + }) => void; + onRowSelect: any; + archiveRuns: (ids: string[], archived: boolean) => void; + deleteRuns: (ids: string[]) => void; + onRowsVisibilityChange: (metricKeys: string[]) => void; +} diff --git a/src/src/types/pages/scatters/components/Controls/Controls.d.ts b/src/src/types/pages/scatters/components/Controls/Controls.d.ts new file mode 100644 index 00000000..b57c3481 --- /dev/null +++ b/src/src/types/pages/scatters/components/Controls/Controls.d.ts @@ -0,0 +1,21 @@ +import { + ITooltip, + IGroupingSelectOption, +} from 'types/services/models/metrics/metricsAppModel'; +import { IProjectParamsMetrics } from 'types/services/models/projects/projectsModel'; +import { ITrendlineOptions } from 'types/services/models/scatter/scatterAppModel'; +import { IScattersProps } from 'types/pages/scatters/Scatters'; + +import { ChartTypeEnum } from 'utils/d3'; + +export interface IControlProps { + chartProps: any[]; + chartType: ChartTypeEnum; + data: IScattersProps['scatterPlotData']; + selectOptions: IGroupingSelectOption[]; + tooltip?: ITooltip; + projectsDataMetrics: IProjectParamsMetrics['metrics']; + onChangeTooltip: (tooltip: Partial) => void; + trendlineOptions: ITrendlineOptions; + onChangeTrendlineOptions: (options: Partial) => void; +} diff --git a/src/src/types/pages/scatters/components/SelectForm/SelectForm.d.ts b/src/src/types/pages/scatters/components/SelectForm/SelectForm.d.ts new file mode 100644 index 00000000..ef55562e --- /dev/null +++ b/src/src/types/pages/scatters/components/SelectForm/SelectForm.d.ts @@ -0,0 +1,19 @@ +import { + ISelectOption, + ISelectConfig, +} from 'services/models/explorer/createAppModel'; + +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; + +export interface ISelectFormProps { + requestIsPending: boolean; + isDisabled?: boolean; + selectedOptionsData: ISelectConfig; + selectFormData: { + options: ISelectOption[]; + suggestions: string[]; + error: ISyntaxErrorDetails; + }; + onSelectOptionsChange: (options: ISelectOption[]) => void; + onSelectRunQueryChange: (query: string) => void; +} diff --git a/src/src/types/pages/tags/Tags.d.ts b/src/src/types/pages/tags/Tags.d.ts new file mode 100644 index 00000000..07d12b38 --- /dev/null +++ b/src/src/types/pages/tags/Tags.d.ts @@ -0,0 +1,84 @@ +export interface ITagsProps { + tagsListData: ITagProps[]; + isTagsDataLoading: boolean; + tagInfo: any; + tagRuns: any; + onNotificationDelete: any; + notifyData: any; + isTagsDataLoading: any; + isRunsDataLoading: any; + isTagInfoDataLoading: any; +} + +export interface ITagProps { + name: string; + color: string | null; + id: string; + description: string; + run_count: number; + archived: boolean; +} + +export interface ITagRunsProps { + tagHash: string; + tagRuns: ITagRun[]; +} + +export interface ITagSoftDeleteProps { + modalIsOpen: boolean; + tagHash: string; + tagInfo: ITagInfo; + onSoftDeleteModalToggle: () => void; + onTagDetailOverlayToggle: () => void; + isTagDetailOverLayOpened: boolean; +} + +export interface ITagRun { + creation_time: number; + end_time: number | null; + experiment: string | null; + name: string; + run_id: string; +} +export interface ITagInfo { + archived: boolean; + color: string; + id: string; + description: string; + name: string; + run_count: number; +} +export interface ITagInfoWithSelectedProperty extends ITagInfo { + selected: boolean; +} +export interface ITagDetailProps { + id: string; + onSoftDeleteModalToggle: () => void; + onUpdateModalToggle: () => void; + onDeleteModalToggle: () => void; + isTagInfoDataLoading: any; + tagInfo: any; + isRunsDataLoading: any; + tagRuns: any; +} + +export interface ITagsTableProps { + tableRef: React.RefObject; + tagsList: ITagProps[]; + hasSearchValue: boolean; + isTagsDataLoading: boolean; + onTableRunClick: (id: string) => void; + onSoftDeleteModalToggle: () => void; + onUpdateModalToggle: () => void; + onDeleteModalToggle: () => void; +} + +export interface ITagsListProps { + tagsList: ITagProps[]; + isHiddenTagsList?: boolean; + isTagsDataLoading: boolean; + tagInfo: any; + tagRuns: any; + isRunsDataLoading: boolean; + isTagInfoDataLoading: boolean; +} diff --git a/src/src/types/services/models/bookmarks/bookmarksAppModel.d.ts b/src/src/types/services/models/bookmarks/bookmarksAppModel.d.ts new file mode 100644 index 00000000..ff74ef32 --- /dev/null +++ b/src/src/types/services/models/bookmarks/bookmarksAppModel.d.ts @@ -0,0 +1,8 @@ +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { IBookmarksData } from 'types/pages/bookmarks/Bookmarks'; + +export interface IBookmarksAppModelState { + isLoading: boolean; + listData: IBookmarksData[]; + notifyData: INotification[]; +} diff --git a/src/src/types/services/models/explorer/createAppModel.d.ts b/src/src/types/services/models/explorer/createAppModel.d.ts new file mode 100644 index 00000000..0ad3b1d9 --- /dev/null +++ b/src/src/types/services/models/explorer/createAppModel.d.ts @@ -0,0 +1,176 @@ +import { MetricsValueKeyEnum, ResizeModeEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { DensityOptions } from 'config/enums/densityEnum'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { AppDataTypeEnum, AppNameEnum } from 'services/models/explorer'; + +import { IAxesScaleRange } from 'types/components/AxesPropsPopover/AxesPropsPopover'; +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { + IAggregationConfig, + IAlignmentConfig, + ITooltip, + IChartZoom, + IFocusedState, + IMetricAppModelState, + SortField, + ITooltipConfig, + ISmoothing, + LegendsConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { IParamsAppModelState } from 'types/services/models/params/paramsAppModel'; +import { IRunsAppModelState } from 'types/services/models/runs/runsAppModel'; +import { + IScatterAppModelState, + ITrendlineOptions, +} from 'types/services/models/scatter/scatterAppModel'; + +import { ChartTypeEnum, CurveEnum, HighlightEnum } from 'utils/d3'; + +import { IImagesExploreAppModelState } from '../imagesExplore/imagesExploreAppModel'; + +export interface IAppInitialConfig { + dataType: AppDataTypeEnum; + selectForm: AppNameEnum; + grouping: boolean; + appName: AppNameEnum; + components: { + table?: boolean; + charts?: ChartTypeEnum[]; + }; +} + +export type IAppModelState = + | IMetricAppModelState + | IParamsAppModelState + | IScatterAppModelState + | IRunsAppModelState + | IImagesExploreAppModelState; + +export interface IAppModelConfig { + grouping?: IGroupingConfig; + select?: ISelectConfig; + table?: ITableConfig; + pagination?: IPaginationConfig; + liveUpdate?: ILiveUpdateConfig; + chart?: Partial; +} + +export interface IChart + extends ILineChartConfig, + IHighPlotConfig, + IScatterPlotConfig { + trendlineOptions: ITrendlineOptions; +} + +export interface IGroupingConfig { + [GroupNameEnum.COLOR]?: string[]; + [GroupNameEnum.STROKE]?: string[]; + [GroupNameEnum.CHART]?: string[]; + [GroupNameEnum.ROW]?: string[]; + reverseMode?: { + color?: boolean; + stroke?: boolean; + chart?: boolean; + row?: boolean; + }; + isApplied?: { + color?: boolean; + stroke?: boolean; + chart?: boolean; + row?: boolean; + }; + persistence?: { + color: boolean; + stroke: boolean; + }; + seed?: { + color: number; + stroke: number; + }; + paletteIndex?: number; +} + +export interface ISelectOption { + label: string; + group: string; + color?: string; + key: string; + type?: string; + value?: { + option_name: string; + context: { [key: string]: unknown } | null | any; + }; +} + +export interface ISelectConfig { + options: ISelectOption[]; + query: string; + advancedMode?: boolean; + advancedQuery?: string; +} + +export interface ITableConfig { + metricsValueKey?: MetricsValueKeyEnum; + resizeMode?: ResizeModeEnum; + rowHeight: RowHeightSize; + sortFields?: SortField[]; + hiddenMetrics?: string[]; + hiddenColumns?: string[]; + hideSystemMetrics?: boolean; + columnsWidths?: { [key: string]: number }; + columnsOrder?: IColumnsOrder; + columnsColorScales?: { [key: string]: boolean }; + height?: string; + selectedRows?: any; +} + +interface IColumnsOrder { + left: string[]; + middle: string[]; + right: string[]; +} +export interface IPaginationConfig { + limit: number; + offset: null; + isLatest: boolean; +} + +export interface ILiveUpdateConfig { + delay: number; + enabled: boolean; +} + +export interface IHighPlotConfig { + curveInterpolation: CurveEnum; + isVisibleColorIndicator: boolean; + focusedState: IFocusedState; + tooltip: ITooltip; + brushExtents: { + [key: string]: { + [key: string]: [number, number] | [string, string]; + }; + }; +} + +export interface ILineChartConfig { + highlightMode: HighlightEnum; + ignoreOutliers: boolean; + zoom: IChartZoom; + axesScaleType: IAxesScaleState; + axesScaleRange: IAxesScaleRange; + smoothing: ISmoothing; + aggregationConfig: IAggregationConfig; + densityType: DensityOptions; + alignmentConfig: IAlignmentConfig; + focusedState: IFocusedState; + tooltip: ITooltipConfig; + legends: LegendsConfig; +} + +export interface IScatterPlotConfig { + highlightMode: HighlightEnum; + focusedState: IFocusedState; + tooltip: ITooltipConfig; +} diff --git a/src/src/types/services/models/imagesExplore/imagesExploreAppModel.d.ts b/src/src/types/services/models/imagesExplore/imagesExploreAppModel.d.ts new file mode 100644 index 00000000..633401a0 --- /dev/null +++ b/src/src/types/services/models/imagesExplore/imagesExploreAppModel.d.ts @@ -0,0 +1,144 @@ +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { ITableRef } from 'types/components/Table/Table'; +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { + ITooltip, + ITooltipConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { + IColumnsOrder, + ISelectConfig, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; + +import { SortFields } from 'utils/getSortedFields'; +import { IRequestProgress } from 'utils/app/setRequestProgress'; + +export interface IImagesExploreAppConfig { + grouping: { + row: string[]; + reverseMode: { + row: boolean; + }; + isApplied: { + row: boolean; + }; + }; + images: { + recordSlice?: number[] | number; + indexSlice?: number[] | number; + stepRange?: number[]; + indexRange?: number[]; + recordDensity?: string; + indexDensity?: string; + tooltip: ITooltipConfig; + focusedState: { + key: string | null; + active: boolean; + }; + additionalProperties: { + alignmentType: string; + mediaItemSize: number; + imageRendering: string; + stacking: boolean; + }; + sortFields?: SortFields; + sortFieldsDict: any; + inputsValidations: any; + }; + select: ISelectConfig; + table: { + resizeMode: ResizeModeEnum; + rowHeight: RowHeightSize; + sortFields?: SortFields; + hiddenMetrics?: string[]; + hiddenColumns?: string[]; + hideSystemMetrics?: undefined; + columnsWidths?: { [key: string]: number }; + columnsOrder?: IColumnsOrder; + height: string; + }; +} + +export interface IImagesExploreAppModelState { + refs: { + tableRef: { current: ITableRef | null }; + }; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + queryIsEmpty: boolean; + rawData: any[]; + config: IImagesExploreAppConfig; + data: any; + imagesData: any; + tooltip: ITooltip; + tableData: any[]; + tableColumns: ITableColumn[]; + sameValueColumns: string[]; + params: string[]; + notifyData: INotification[]; + groupingSelectOptions: IGroupingSelectOption[]; + searchButtonDisabled: boolean; + applyButtonDisabled: boolean; + selectFormData: { + options?: ISelectOption[]; + suggestions: string[]; + error: ISyntaxErrorDetails; + advancedError: ISyntaxErrorDetails; + }; + selectedRows: { [key: string]: any }; + liveUpdateConfig?: { + delay: number; + enabled: boolean; + }; +} + +export interface IGroupingSelectOption { + label: string; + group: string; + value: string; +} + +export interface IImageData { + blob_uri: string; + caption: string; + context: object; + format: string; + height: number; + index: number; + key: string; + seqKey: string; + name: string; + run: IImageRunData; + step: number; + width: number; +} + +export interface IProcessedImageData extends IImageData { + seqKey?: string; + name?: string; + step?: number; + context?: object; +} + +export interface IImageRunData { + hash: string; + params: { [key: string]: unknown }; + props: { + archived: 0 | 1; + creation_time: number; + end_time: number; + experiment: string; + name: string; + tags: any[]; + }; + ranges: { + index_range: number[]; + record_range: number[]; + }; + traces: any[]; +} diff --git a/src/src/types/services/models/metrics/metricModel.d.ts b/src/src/types/services/models/metrics/metricModel.d.ts new file mode 100644 index 00000000..74d5aa64 --- /dev/null +++ b/src/src/types/services/models/metrics/metricModel.d.ts @@ -0,0 +1,21 @@ +import { IMetricTrace, IRun } from './runModel'; + +export interface IMetric { + run: IRun; + key: string; + name: string; + context: { [key: string]: unknown }; + data: { + values: Float64Array; + epochs: Float64Array; + steps: Float64Array; + timestamps: Float64Array; + xValues: number[]; + yValues: number[]; + }; + color: string; + dasharray: string; + x_axis_iters?: Float64Array; + x_axis_values?: Float64Array; + isHidden: boolean; +} diff --git a/src/src/types/services/models/metrics/metricsAppModel.d.ts b/src/src/types/services/models/metrics/metricsAppModel.d.ts new file mode 100644 index 00000000..0d088e51 --- /dev/null +++ b/src/src/types/services/models/metrics/metricsAppModel.d.ts @@ -0,0 +1,275 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { TooltipAppearanceEnum } from 'modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +import { + IAppModelConfig, + IGroupingConfig, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { IImagesExploreAppConfig } from 'types/services/models/imagesExplore/imagesExploreAppModel'; +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { ILine } from 'types/components/LineChart/LineChart'; +import { ITableRef } from 'types/components/Table/Table'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { + INotification, + ISyntaxErrorDetails, +} from 'types/components/NotificationContainer/NotificationContainer'; + +import { + AggregationAreaMethods, + AggregationLineMethods, +} from 'utils/aggregateGroupData'; +import { + AlignmentOptionsEnum, + CurveEnum, + ZoomEnum, + LegendsModeEnum, +} from 'utils/d3'; +import { IRequestProgress } from 'utils/app/setRequestProgress'; +import { SmoothingAlgorithmEnum } from 'utils/smoothingData'; + +import { IMetric } from './metricModel'; +import { IMetricTrace, IRun, ISequence } from './runModel'; + +export interface IMetricAppModelState { + refs: { + tableRef?: { current: ITableRef | null }; + chartPanelRef?: { current: IChartPanelRef | null }; + }; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + queryIsEmpty: boolean; + rawData: ISequence[]; + config: IAppModelConfig; + data: IMetricsCollection[]; + lineChartData: ILine[][]; + chartTitleData: IChartTitleData; + aggregatedData: IAggregatedData[]; + legendsData: LegendsDataType; + tooltip: ITooltip; + tableData: any[]; + tableColumns: ITableColumn[]; + sameValueColumns: string[]; + params: string[]; + notifyData: INotification[]; + groupingSelectOptions: IGroupingSelectOption[]; + sortOptions: IGroupingSelectOption[]; + selectFormData?: { + options: ISelectOption[]; + suggestions: string[]; + error: ISyntaxErrorDetails; + advancedError: ISyntaxErrorDetails; + }; + liveUpdateConfig: { + delay: number; + enabled: boolean; + }; + selectedRows?: any; +} + +export interface IChartTitleData { + [key: string]: IChartTitle; +} + +export interface IChartTitle { + [key: string]: string; +} + +export interface IAggregatedData extends IAggregationData { + key?: string; + color: string; + dasharray: string; + chartIndex?: number; +} + +export interface ITooltipContent { + groupConfig?: Record; + name?: string; + context?: Record; + runHash?: string; + caption?: string; + step?: number | string; + index?: number; + images_name?: string; + selectedProps?: Record; + run?: IRun; +} + +export interface ITooltipConfig { + appearance: TooltipAppearanceEnum; + display: boolean; + selectedFields: string[]; +} + +export interface ITooltip extends Partial { + content?: ITooltipContent; +} + +export interface LegendsConfig { + display: boolean; + mode: LegendsModeEnum; +} + +export interface IMetricsCollection { + key?: string; + groupKey?: string; + config: Record | null; + color: string | null; + dasharray: string | null; + chartIndex: number; + data: T[]; + aggregation?: IAggregationData; +} + +export interface IAggregationData { + area: { + min: { + xValues: number[]; + yValues: number[]; + } | null; + max: { + xValues: number[]; + yValues: number[]; + } | null; + stdDevValue?: { + xValues: number[]; + yValues: number[]; + }; + stdErrValue?: { + xValues: number[]; + yValues: number[]; + }; + }; + line: { + xValues: number[]; + yValues: number[]; + } | null; +} + +export interface IChartZoom { + active: boolean; + mode: ZoomEnum; + history: { + id: string; + xValues: [number, number]; + yValues: [number, number]; + }[]; +} + +export interface IAlignmentConfig { + metric?: string; + type: AlignmentOptionsEnum; +} + +export interface IAggregationConfig { + methods: { + area: AggregationAreaMethods; + line: AggregationLineMethods; + }; + isApplied: boolean; + isEnabled?: boolean; +} + +export interface IFocusedState { + active: boolean; + key: string | null; + xValue?: number | string | null; + yValue?: number | string | null; + chartIndex?: number | null; + visId?: string | null; +} + +export interface IMetricTableRowData { + key: string; + dasharray: metric.dasharray; + color: metric.color; + experiment: metric.run.experiment_name; + run: metric.run.name; + metric: metric.metric_name; + context: string[]; + value: string; + step: string; + epoch: string; + time: number | null; + [key: string]: any; +} + +export interface IOnGroupingSelectChangeParams { + groupName: GroupNameEnum; + list: string[]; +} + +export interface IOnGroupingModeChangeParams { + groupName: GroupNameEnum; + value: boolean; + options?: any[] | null; +} + +export interface IGetGroupingPersistIndex { + groupConfig: {}; + grouping: IGroupingConfig; + groupName: 'color' | 'stroke'; +} + +export interface IGroupingSelectOption { + label: string; + group: string; + value: string; + readonly?: boolean; +} + +export interface IAppData { + created_at?: string; + id?: string; + updated_at?: string; + type?: string; + state?: Partial; +} + +export interface IDashboardRequestBody { + name: string; + description: string; + app_id?: string; +} + +export interface IDashboardData { + app_id: string; + created_at: string; + id: string; + name: string; + description: string; + updated_at: string; +} + +export interface IAlignMetricsDataParams { + align_by: string; + runs: { + run_id: string; + traces: { + context: { [key: string]: unknown }; + name: string; + slice: number[]; + }[]; + }[]; +} + +export interface ISmoothing { + algorithm: SmoothingAlgorithmEnum; + factor: number; + curveInterpolation: CurveEnum; + isApplied: boolean; +} + +export interface LegendColumnDataType { + color?: string; + dasharray?: string; + chartIndex?: number; + value: string; +} + +export interface LegendsDataType { + [key: string]: Record; +} diff --git a/src/src/types/services/models/metrics/runModel.d.ts b/src/src/types/services/models/metrics/runModel.d.ts new file mode 100644 index 00000000..356dc4c5 --- /dev/null +++ b/src/src/types/services/models/metrics/runModel.d.ts @@ -0,0 +1,67 @@ +import { ITagProps } from 'types/pages/tags/Tags'; + +export interface IRun { + params: IRunParams; + props: { + experiment: { name: string; id: string; description: string } | null; + name: string; + creation_time: number; + end_time: number; + description: string; + active: boolean; + tags: ITagProps[]; + }; + created_at: number; + traces: { metric: T[] }; + hash: string; +} + +export interface ISequence { + params: IRunParams; + props: { + experiment: { name: string; id: string } | null; + name: string; + creation_time: number; + end_time: number; + description: string; + }; + created_at: number; + traces: T[]; + hash: string; +} + +export interface IParamTrace { + name: string; + context: { [key: string]: unknown }; + values: { + last: number | string; + min: number | string; + max: number | string; + first: number | string; + first_step?: number | string; + }; +} + +export interface IMetricTrace { + name: string; + description: string; + context: { [key: string]: unknown }; + slice: [number, number, number]; + values: ITraceData; + iters: ITraceData; + epochs: ITraceData; + timestamps: ITraceData; + x_axis_values: ITraceData | null; + x_axis_iters: ITraceData | null; +} + +export interface IRunParams { + [key: string]: any; +} + +export interface ITraceData { + blob: Uint8Array; + dtype: string; + shape: number; + type: string; +} diff --git a/src/src/types/services/models/model.d.ts b/src/src/types/services/models/model.d.ts new file mode 100644 index 00000000..a577586f --- /dev/null +++ b/src/src/types/services/models/model.d.ts @@ -0,0 +1,35 @@ +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; + +import { IGroupingSelectOption, ITooltip } from './metrics/metricsAppModel'; + +export interface State { + config?: Record; + table?: Record; + groupingSelectOptions?: IGroupingSelectOption[]; + tableColumns?: ITableColumn[] | Record[]; + data?: Record[]; + rawData?: Record[]; + notifyData?: INotification[]; + refs?: Record; + params?: Record; + sameValueColumns?: string[]; + selectedRows?: any; + tooltip?: ITooltip; + selectFormData?: any; +} + +export interface IModel> { + init: () => void; + destroy: () => void; + getState: () => StateType; + setState: (data: Partial | StateType | unknown | any) => void; + emit: ( + evt: string, + data: Partial | StateType | unknown | any, + ) => void; + subscribe: ( + evt: string, + fn: (data: StateType) => void, + ) => { unsubscribe: () => void }; +} diff --git a/src/src/types/services/models/notes/notes.d.ts b/src/src/types/services/models/notes/notes.d.ts new file mode 100644 index 00000000..40aea7d0 --- /dev/null +++ b/src/src/types/services/models/notes/notes.d.ts @@ -0,0 +1,22 @@ +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; + +export interface INoteReqBody { + name: string; + content: string; +} + +export interface INote { + name: string; + content: string; + id: number; + created_at: string; + updated_at?: string; +} + +export interface INotesAppModelState { + isLoading: boolean; + noteData: INote; + notifyData: INotification[]; +} + +export type INotesList = INote[]; diff --git a/src/src/types/services/models/params/paramsAppModel.d.ts b/src/src/types/services/models/params/paramsAppModel.d.ts new file mode 100644 index 00000000..9330c636 --- /dev/null +++ b/src/src/types/services/models/params/paramsAppModel.d.ts @@ -0,0 +1,65 @@ +import { IGroupingSelectOption } from 'metrics/metricsAppModel'; + +import { ITableRef } from 'components/Table/Table'; +import { IChartPanelRef } from 'components/ChartPanel/ChartPanel'; +import { INotification } from 'components/NotificationContainer/NotificationContainer'; + +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { ITableColumn } from 'pages/metrics/components/TableColumns/TableColumns'; + +import { IParamTrace, IRun } from 'types/services/models/metrics/runModel'; +import { + IAppModelConfig, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; + +import { IDimensionsType } from 'utils/d3/drawParallelAxes'; +import { IRequestProgress } from 'utils/app/setRequestProgress'; + +import { + IChartTitleData, + IMetricsCollection, + ITooltip, +} from '../metrics/metricsAppModel'; + +export interface IParamsAppModelState { + refs: { + tableRef?: { current: ITableRef | null }; + chartPanelRef?: { current: IChartPanelRef | null }; + }; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + queryIsEmpty: boolean; + rawData: IRun[]; + config: IAppModelConfig; + data: IMetricsCollection[]; + highPlotData: { dimensions: IDimensionsType; data: any }[]; + tooltip: ITooltip; + chartTitleData: IChartTitleData; + tableData: any[]; + tableColumns: ITableColumn[]; + sameValueColumns: string[]; + params: string[]; + notifyData: INotification[]; + groupingSelectOptions: IGroupingSelectOption[]; + metricsColumns: any; + selectFormData: { options: ISelectOption[]; suggestions: string[] }; + selectedRows?: any; + liveUpdateConfig?: { + delay: number; + enabled: boolean; + }; +} + +export interface IParam { + run: IRun; + isHidden: boolean; + color: string; + key: string; + dasharray: string; + metricsValues?: Record< + string, + Record<'last' | 'min' | 'max' | 'first', number | string> + >; +} diff --git a/src/src/types/services/models/projects/projectsModel.d.ts b/src/src/types/services/models/projects/projectsModel.d.ts new file mode 100644 index 00000000..8ef5c487 --- /dev/null +++ b/src/src/types/services/models/projects/projectsModel.d.ts @@ -0,0 +1,30 @@ +export interface IProject { + branches?: string[]; + description?: string; + name?: string; + path?: string; + telemetry_enabled?: string | boolean; +} + +export interface IProjectParamsMetrics { + metric: { [key: string]: { [key: string]: string }[] }; + images: { [key: string]: { [key: string]: string }[] }; + params: { [key: string]: any }; +} + +export interface IProjectsModelState { + project?: IProject; + params?: IProjectParamsMetrics['params']; + images?: IProjectParamsMetrics['params']; + metrics?: IProjectParamsMetrics['metric']; + pinnedSequences: IPinnedSequence[]; +} + +export interface IPinnedSequence { + name: string; + context: { [key: string]: unknown }; +} + +export interface IPinnedSequencesResData { + sequences: IPinnedSequence[]; +} diff --git a/src/src/types/services/models/runs/runsAppModel.d.ts b/src/src/types/services/models/runs/runsAppModel.d.ts new file mode 100644 index 00000000..d5169043 --- /dev/null +++ b/src/src/types/services/models/runs/runsAppModel.d.ts @@ -0,0 +1,14 @@ +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { IRequestProgress } from 'utils/app/setRequestProgress'; + +export interface IRunsAppModelState { + selectedRows?: any; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + liveUpdateConfig?: { + delay: number; + enabled: boolean; + }; + [key: string]: any; +} diff --git a/src/src/types/services/models/scatter/scatterAppModel.d.ts b/src/src/types/services/models/scatter/scatterAppModel.d.ts new file mode 100644 index 00000000..e0721d46 --- /dev/null +++ b/src/src/types/services/models/scatter/scatterAppModel.d.ts @@ -0,0 +1,64 @@ +import { IPoint } from 'components/ScatterPlot'; + +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { IChartPanelRef } from 'types/components/ChartPanel/ChartPanel'; +import { ITableRef } from 'types/components/Table/Table'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { + IAppModelConfig, + ISelectOption, +} from 'types/services/models/explorer/createAppModel'; +import { IDimensionType } from 'types/utils/d3/drawParallelAxes'; +import { IParam } from 'types/services/models/params/paramsAppModel'; +import { + IChartTitleData, + IGroupingSelectOption, + IMetricsCollection, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; + +import { IRequestProgress } from 'utils/app/setRequestProgress'; +import { TrendlineTypeEnum } from 'utils/d3'; + +import { IMetricTrace, IRun } from './runModel'; + +export interface IScatterAppModelState { + refs: { + tableRef?: { current: ITableRef | null }; + chartPanelRef?: { current: IChartPanelRef | null }; + }; + requestStatus: RequestStatusEnum; + requestProgress: IRequestProgress; + queryIsEmpty: boolean; + rawData: IRun[]; + config: IAppModelConfig; + data: IMetricsCollection[]; + chartData: IScatterData[]; + tooltip: ITooltip; + chartTitleData: IChartTitleData; + tableData: any[]; + tableColumns: ITableColumn[]; + sameValueColumns: string[]; + selectedRows: { [key: string]: any }; + params: string[]; + notifyData: INotification[]; + groupingSelectOptions: IGroupingSelectOption[]; + selectFormData: { options: ISelectOption[]; suggestions: string[] }; + liveUpdateConfig?: { + delay: number; + enabled: boolean; + }; +} + +export interface IScatterData { + dimensions: IDimensionType; + data: IPoint[]; +} + +export interface ITrendlineOptions { + type: TrendlineTypeEnum; + bandwidth: number; + isApplied: boolean; +} diff --git a/src/src/types/services/services.d.ts b/src/src/types/services/services.d.ts new file mode 100644 index 00000000..4da4e550 --- /dev/null +++ b/src/src/types/services/services.d.ts @@ -0,0 +1,9 @@ +export interface IApiRequest { + call: (detail?: any) => Promise; + abort: () => void; +} + +export interface IApiRequestRef { + call: (exceptionHandler: (detail: any) => void) => Promise; + abort: () => void; +} diff --git a/src/src/types/utils/aggregateGroupData.d.ts b/src/src/types/utils/aggregateGroupData.d.ts new file mode 100644 index 00000000..e18e52f4 --- /dev/null +++ b/src/src/types/utils/aggregateGroupData.d.ts @@ -0,0 +1,20 @@ +import { IMetricsCollection } from 'types/services/models/metrics/metricsAppModel'; +import { IMetric } from 'types/services/models/metrics/metricModel'; + +import { ScaleEnum } from 'utils/d3'; +import { + AggregationAreaMethods, + AggregationLineMethods, +} from 'utils/aggregateGroupData'; + +export interface IAggregateGroupDataParams { + groupData: IMetricsCollection[]; + methods: { + area: AggregationAreaMethods; + line: AggregationLineMethods; + }; + scale: { + xAxis: ScaleEnum; + yAxis: ScaleEnum; + }; +} diff --git a/src/src/types/utils/common.d.ts b/src/src/types/utils/common.d.ts new file mode 100644 index 00000000..4d728055 --- /dev/null +++ b/src/src/types/utils/common.d.ts @@ -0,0 +1 @@ +export type Override = Omit & T2; diff --git a/src/src/types/utils/d3/clearArea.d.ts b/src/src/types/utils/d3/clearArea.d.ts new file mode 100644 index 00000000..07cb50db --- /dev/null +++ b/src/src/types/utils/d3/clearArea.d.ts @@ -0,0 +1,5 @@ +import React from 'react'; + +export interface IClearAreaProps { + visAreaRef: React.MutableRefObject<>; +} diff --git a/src/src/types/utils/d3/drawArea.d.ts b/src/src/types/utils/d3/drawArea.d.ts new file mode 100644 index 00000000..f2c168a2 --- /dev/null +++ b/src/src/types/utils/d3/drawArea.d.ts @@ -0,0 +1,20 @@ +import React from 'react'; + +import { IChartTitle } from 'types/services/models/metrics/metricsAppModel'; + +export interface IDrawAreaArgs { + index?: number; + id: string; + nameKey: string; + parentRef: React.MutableRefObject<>; + visAreaRef: React.MutableRefObject<>; + svgNodeRef: React.MutableRefObject<>; + bgRectNodeRef: React.MutableRefObject<>; + visBoxRef: React.MutableRefObject<>; + plotNodeRef: React.MutableRefObject<>; + axesNodeRef: React.MutableRefObject<>; + plotBoxRef: React.MutableRefObject<>; + linesNodeRef: React.MutableRefObject<>; + attributesNodeRef: React.MutableRefObject<>; + chartTitle?: IChartTitle; +} diff --git a/src/src/types/utils/d3/drawAxes.d.ts b/src/src/types/utils/d3/drawAxes.d.ts new file mode 100644 index 00000000..41f8564c --- /dev/null +++ b/src/src/types/utils/d3/drawAxes.d.ts @@ -0,0 +1,20 @@ +import React from 'react'; + +import { IAlignmentConfig } from 'types/services/models/metrics/metricsAppModel'; +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; + +import { IAxisScale } from './getAxisScale'; + +export interface IDrawAxesArgs { + svgNodeRef: React.MutableRefObject<>; + plotBoxRef: React.MutableRefObject<>; + axesNodeRef: React.MutableRefObject<>; + axesRef: React.MutableRefObject<>; + xScale: IAxisScale; + yScale: IAxisScale; + visBoxRef: React.MutableRefObject<>; + alignmentConfig?: IAlignmentConfig; + axesScaleType: IAxesScaleState; + humanizerConfigRef: React.MutableRefObject<{}>; + drawBgTickLines?: { x?: boolean; y?: boolean }; +} diff --git a/src/src/types/utils/d3/drawBrush.d.ts b/src/src/types/utils/d3/drawBrush.d.ts new file mode 100644 index 00000000..b76bb772 --- /dev/null +++ b/src/src/types/utils/d3/drawBrush.d.ts @@ -0,0 +1,23 @@ +import React from 'react'; + +import { IChartZoom } from 'types/services/models/metrics/metricsAppModel'; +import { IAttributesRef } from 'types/components/LineChart/LineChart'; +import { IAxesScaleRange } from 'types/components/AxesPropsPopover/AxesPropsPopover'; + +import { IGetAxesScaleProps } from './getAxisScale'; + +export interface IDrawBrushArgs extends IGetAxesScaleProps { + id: string; + plotBoxRef: React.MutableRefObject<>; + plotNodeRef: React.MutableRefObject<>; + visBoxRef: React.MutableRefObject<>; + axesRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject; + linesRef: React.MutableRefObject<>; + svgNodeRef: React.MutableRefObject<>; + zoom?: IChartZoom; + onZoomChange?: (zoom: Partial) => void; + readOnly: boolean; + axesScaleRange?: IAxesScaleRange; + unableToDrawConditions: Array<{ condition: boolean; text?: string }>; +} diff --git a/src/src/types/utils/d3/drawHoverAttributes.d.ts b/src/src/types/utils/d3/drawHoverAttributes.d.ts new file mode 100644 index 00000000..84dfae07 --- /dev/null +++ b/src/src/types/utils/d3/drawHoverAttributes.d.ts @@ -0,0 +1,98 @@ +import React from 'react'; + +import { IPoint } from 'components/ScatterPlot'; + +import { ILine, IAttributesRef } from 'types/components/LineChart/LineChart'; +import { + IAggregationConfig, + IAlignmentConfig, + IFocusedState, +} from 'types/services/models/metrics/metricsAppModel'; + +import { ScaleEnum, HighlightEnum } from 'utils/d3'; + +import { IAxisScale } from './getAxisScale'; +import { IProcessedData } from './processLineChartData'; + +export type HoverAttrData = ILine | IPoint; + +export interface IDrawHoverAttributesArgs { + index?: number; + id: string; + nameKey: string; + data: HoverAttrData[]; + processedData?: IProcessedData[]; + axesScaleType: { xAxis: ScaleEnum; yAxis: ScaleEnum }; + visAreaRef: React.MutableRefObject<>; + attributesNodeRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject; + plotBoxRef: React.MutableRefObject<>; + visBoxRef: React.MutableRefObject<>; + svgNodeRef: React.MutableRefObject<>; + bgRectNodeRef: React.MutableRefObject<>; + xAxisLabelNodeRef?: React.MutableRefObject<>; + yAxisLabelNodeRef?: React.MutableRefObject<>; + linesNodeRef: React.MutableRefObject<>; + syncHoverState?: (params: ISyncHoverStateParams) => void; + highlightedNodeRef: React.MutableRefObject<>; + highlightMode?: HighlightEnum; + aggregationConfig?: IAggregationConfig; + alignmentConfig?: IAlignmentConfig; + drawAxisLines?: { x: Boolean; y: Boolean }; + drawAxisLabels?: { x: Boolean; y: Boolean }; +} + +export interface ISyncHoverStateArgs { + activePoint: IActivePoint | null; + dataSelector?: string; + focusedState?: IFocusedState; +} + +export type IAxisLineData = { x1: number; y1: number; x2: number; y2: number }; + +export interface IGetCoordinates { + mouseX: number; + mouseY: number; +} + +export interface IGetCoordinatesArgs { + mouse: [number, number]; + margin: { left: number; top: number }; + xScale: IAxisScale; + yScale: IAxisScale; +} + +export interface INearestCircle { + x: number; + y: number; + key: string; + color: string; + inProgress?: boolean; +} + +export interface IActivePoint { + key: string; + xValue: number | string; + yValue: number | string; + xPos: number; + yPos: number; + chartIndex: number; + visId: string; + inProgress?: boolean; + pointRect: IActivePointRect | null; + rect: IActiveElementRect; +} + +export interface IActivePointRect { + top: number; + bottom: number; + left: number; + right: number; +} + +export interface IActiveElementRect { + top: number; + bottom: number; + left: number; + right: number; +} diff --git a/src/src/types/utils/d3/drawLines.d.ts b/src/src/types/utils/d3/drawLines.d.ts new file mode 100644 index 00000000..5907ae2d --- /dev/null +++ b/src/src/types/utils/d3/drawLines.d.ts @@ -0,0 +1,23 @@ +import React from 'react'; + +import { IAggregationConfig } from 'types/services/models/metrics/metricsAppModel'; + +import { CurveEnum, HighlightEnum } from 'utils/d3'; + +import { IDrawAxesArgs } from './drawAxes'; +import { IProcessedAggrData, IProcessedData } from './processLineChartData'; + +export interface IDrawLinesArgs { + id: string; + nameKey: string; + linesRef: React.MutableRefObject<>; + linesNodeRef: React.MutableRefObject<>; + processedData: IProcessedData[]; + xScale: IDrawAxesArgs['xScale']; + yScale: IDrawAxesArgs['yScale']; + highlightMode: HighlightEnum; + curveInterpolation: CurveEnum; + aggregationConfig?: IAggregationConfig; + processedAggrData?: IProcessedAggrData[]; + readOnly?: boolean; +} diff --git a/src/src/types/utils/d3/drawParallelAxes.d.ts b/src/src/types/utils/d3/drawParallelAxes.d.ts new file mode 100644 index 00000000..3483522b --- /dev/null +++ b/src/src/types/utils/d3/drawParallelAxes.d.ts @@ -0,0 +1,29 @@ +import React from 'react'; + +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { ScaleEnum } from 'utils/d3'; + +export interface IDimensionType { + scaleType: ScaleEnum; + domainData: number[] | string[]; + displayName: string; + dimensionType: string; +} + +export interface YScaleType { + [key: string]: IAxisScale; +} + +export interface IDimensionsType { + [key: string]: IDimensionType; +} + +export interface IDrawParallelAxesProps { + axesNodeRef: React.MutableRefObject<>; + visBoxRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject<>; + axesRef: React.MutableRefObject<>; + dimensions: IDimensionsType; + plotBoxRef: React.MutableRefObject<>; +} diff --git a/src/src/types/utils/d3/drawParallelAxesBrush.d.ts b/src/src/types/utils/d3/drawParallelAxesBrush.d.ts new file mode 100644 index 00000000..06aa1d67 --- /dev/null +++ b/src/src/types/utils/d3/drawParallelAxesBrush.d.ts @@ -0,0 +1,37 @@ +import React from 'react'; + +import { ILineDataType } from './drawParallelLines'; +import { IDimensionsType } from './drawParallelAxes'; + +export interface IDrawParallelAxesBrushBrushArgs { + plotBoxRef: React.MutableRefObject<>; + plotNodeRef: React.MutableRefObject<>; + brushRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject<>; + visBoxRef: React.MutableRefObject<>; + linesRef: React.MutableRefObject<>; + onAxisBrushExtentChange: ( + key: string, + extent: [number, number] | [string, string] | null, + chartIndex: number, + ) => void; + brushExtents: { + [key: string]: { + [key: string]: [number, number] | [string, string]; + }; + }; + data: ILineDataType[]; + dimensions: IDimensionsType; + index: number; +} + +export type DomainsDataType = { + [key: string]: number[] | string[]; +}; + +export interface IFilterDataByBrushedScaleProps { + line: ILineDataType; + domainsData: DomainsDataType; + dimensions: IDimensionsType; + attributesRef: React.MutableRefObject<>; +} diff --git a/src/src/types/utils/d3/drawParallelColorIndicator.d.ts b/src/src/types/utils/d3/drawParallelColorIndicator.d.ts new file mode 100644 index 00000000..2a9efb17 --- /dev/null +++ b/src/src/types/utils/d3/drawParallelColorIndicator.d.ts @@ -0,0 +1,5 @@ +export interface IDrawParallelColorIndicator { + index: number; + plotBoxRef: React.MutableRefObject<>; + plotNodeRef: React.MutableRefObject<>; +} diff --git a/src/src/types/utils/d3/drawParallelHoverAttributes.d.ts b/src/src/types/utils/d3/drawParallelHoverAttributes.d.ts new file mode 100644 index 00000000..9f7928b1 --- /dev/null +++ b/src/src/types/utils/d3/drawParallelHoverAttributes.d.ts @@ -0,0 +1,69 @@ +import React from 'react'; + +import { IFocusedState } from 'types/services/models/metrics/metricsAppModel'; + +import { IAxisScale } from './getAxisScale'; +import { ILineValuesDataType } from './drawParallelLines'; +import { IDimensionsType } from './drawParallelAxes'; +import { + ISyncHoverStateParams, + INearestCircle, + IActivePoint, +} from './drawHoverAttributes'; + +export interface IDrawParallelHoverAttributesArgs { + index: number; + id: string; + nameKey: string; + dimensions: IDimensionsType; + visAreaRef: React.MutableRefObject<>; + linesRef: React.MutableRefObject<>; + visBoxRef: React.MutableRefObject<>; + bgRectNodeRef: React.MutableRefObject<>; + axesNodeRef: React.MutableRefObject<>; + svgNodeRef: React.MutableRefObject<>; + attributesNodeRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject<{ + xScale?: IAxisScale; + yScale?: IAxisScale; + x: number; + y: number; + updateScales?: (xScale: IAxisScale, yScale: IAxisScale) => void; + updateHoverAttributes?: (mousePosition: [number, number]) => void; + yColorIndicatorScale: d3.ScaleSequential; + mousePosition: number[]; + activePoint?: IActivePoint; + lineKey?: string; + focusedState?: IFocusedState; + updateFocusedChart: (params: IUpdateParallelFocusedChartProps) => void; + clearHoverAttributes: () => void; + setActiveLineAndCircle?: ( + lineKey: string, + focusedStateActive: boolean, + force: boolean, + ) => void; + }>; + syncHoverState: (params: ISyncHoverStateParams) => void; + linesNodeRef: React.MutableRefObject<>; + highlightedNodeRef: React.MutableRefObject<>; + isVisibleColorIndicator: boolean; +} + +export interface IParallelClosestCircle { + key: string; + r: number | null; + x: number; + y: number; + values: ILineValuesDataType; + color: string; +} +export interface IUpdateParallelFocusedChartProps { + mousePos?: [number, number]; + focusedStateActive?: boolean; + force?: boolean; +} + +export interface IParallelNearestCircle extends INearestCircle { + lastYScalePos?: number; + values?: ILineValuesDataType; +} diff --git a/src/src/types/utils/d3/drawParallelLines.d.ts b/src/src/types/utils/d3/drawParallelLines.d.ts new file mode 100644 index 00000000..8dee15de --- /dev/null +++ b/src/src/types/utils/d3/drawParallelLines.d.ts @@ -0,0 +1,70 @@ +import React from 'react'; + +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { CurveEnum } from 'utils/d3'; + +import { IDimensionsType } from './drawParallelAxes'; + +interface ILineValuesDataType { + [key: string]: number | string | null; +} + +export interface ILineDataType { + values: ILineValuesDataType; + key: string; + color: string; + dasharray: string; +} + +export type InitialPathDataType = { + dimensionList: string[]; + lineData: ILineValuesDataType; + isEmpty: boolean; + isDotted: boolean; +}; + +export interface IDrawParallelLinesArgs { + index: number; + nameKey: string; + linesNodeRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject<>; + attributesNodeRef: React.MutableRefObject<>; + curveInterpolation: CurveEnum; + isVisibleColorIndicator: boolean; + linesRef: React.MutableRefObject<>; + dimensions: IDimensionsType; + data: ILineDataType[]; +} + +export interface IDrawParallelLineArgs { + index: number; + nameKey: string; + linesNodeRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject<>; + dasharray: string; + dimensionList: string[]; + curveInterpolation: CurveEnum; + lineData: ILineValuesDataType; + isDotted: boolean; + key: number | string; + color: string; +} + +export interface ILineRendererArgs { + index: number; + nameKey: string; + linesNodeRef: React.MutableRefObject<>; + attributesRef: React.MutableRefObject<>; + curveInterpolation: CurveEnum; + keysOfDimensions: string[]; + isVisibleColorIndicator: boolean; + data: ILineDataType[]; +} + +export interface IGetColorIndicatorScaleValueArgs { + line: ILineValuesDataType; + keysOfDimensions: string[]; + yColorIndicatorScale: d3.ScaleSequential; + yScale: IAxisScale; +} diff --git a/src/src/types/utils/d3/drawPoints.d.ts b/src/src/types/utils/d3/drawPoints.d.ts new file mode 100644 index 00000000..18d7255e --- /dev/null +++ b/src/src/types/utils/d3/drawPoints.d.ts @@ -0,0 +1,15 @@ +import React from 'react'; + +import { IPoint } from 'components/ScatterPlot'; + +import { IAxisScale } from './getAxisScale'; + +export interface IDrawPointsArgs { + index: number; + nameKey: string; + pointsRef: React.MutableRefObject<>; + pointsNodeRef: React.MutableRefObject<>; + data: IPoint[]; + xScale: IAxisScale; + yScale: IAxisScale; +} diff --git a/src/src/types/utils/d3/getAxisScale.d.ts b/src/src/types/utils/d3/getAxisScale.d.ts new file mode 100644 index 00000000..03a3a07c --- /dev/null +++ b/src/src/types/utils/d3/getAxisScale.d.ts @@ -0,0 +1,21 @@ +import * as d3 from 'd3'; +import React from 'react'; + +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; + +import { ScaleEnum } from 'utils/d3'; + +export interface IGetAxesScaleProps { + visBoxRef: React.MutableRefObject<>; + axesScaleType: IAxesScaleState; + min: { x: number; y: number }; + max: { x: number; y: number }; +} + +export type IAxisScale = d3.ScaleLogarithmic | d3.ScaleLinear | d3.ScalePoint; + +export interface IGetAxisScaleProps { + scaleType: ScaleEnum; + domainData: string[] | number[]; + rangeData: number[]; +} diff --git a/src/src/types/utils/d3/processLineChartData.d.ts b/src/src/types/utils/d3/processLineChartData.d.ts new file mode 100644 index 00000000..5a89fd1f --- /dev/null +++ b/src/src/types/utils/d3/processLineChartData.d.ts @@ -0,0 +1,66 @@ +import React from 'react'; + +import { IPoint } from 'components/ScatterPlot'; + +import { Override } from 'types/utils/common'; +import { + IAggregatedData, + IAggregationConfig, +} from 'types/services/models/metrics/metricsAppModel'; +import { ILine } from 'types/components/LineChart/LineChart'; +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { IAxesScaleRange } from 'types/components/AxesPropsPopover/AxesPropsPopover'; + +export interface IProcessedData extends ILine, IPoint { + color: string; + dasharray: string; + data: [number, number][]; +} + +export type IProcessedAggrData = Override< + IAggregatedData, + { + area: [number, number, number, number][]; + line: [number, number][]; + } +>; + +export interface IProcessLineChartData { + min: { x: number; y: number }; + max: { x: number; y: number }; + processedData: IProcessedData[]; + processedAggrData?: IProcessedAggrData[]; + allXValues: number[]; + allYValues: number[]; +} + +export interface IProcessLineChartDataArgs { + data: ILine[]; + ignoreOutliers?: boolean; + visBoxRef: React.MutableRefObject; + attributesRef: React.MutableRefObject; + axesScaleType: IAxesScaleState; + axesScaleRange?: IAxesScaleRange; + aggregatedData?: IAggregatedData[]; + aggregationConfig?: IAggregationConfig; + unableToDrawConditions: Array<{ condition: boolean; text?: string }>; +} + +export interface ICalculateLineValues { + values: [number, number][]; + xMin: number; + xMax: number; + minEdge: number; + maxEdge: number; + axesScaleType: IAxesScaleState; +} + +export interface IGetValueInLine { + x1: number; + x2: number; + y1: number; + y2: number; + x?: number; + y?: number; + axesScaleType: IAxesScaleState; +} diff --git a/src/src/types/utils/formatSystemMetricName.d.ts b/src/src/types/utils/formatSystemMetricName.d.ts new file mode 100644 index 00000000..e28f266b --- /dev/null +++ b/src/src/types/utils/formatSystemMetricName.d.ts @@ -0,0 +1,10 @@ +export type systemMetricsDictType = { + __system__cpu: string; + __system__p_memory_percent: string; + __system__memory_percent: string; + __system__disk_percent: string; + __system__gpu: string; + __system__gpu_memory_percent: string; + __system__gpu_power_watts: string; + __system__gpu_temp: string; +}; diff --git a/src/src/types/utils/getImageBoxSize.d.ts b/src/src/types/utils/getImageBoxSize.d.ts new file mode 100644 index 00000000..7e475d5f --- /dev/null +++ b/src/src/types/utils/getImageBoxSize.d.ts @@ -0,0 +1,7 @@ +export interface IGetImageBoxSizeProps { + data: { [key: string]: any }; + index?: number; + additionalProperties: { [key: string]: any }; + wrapperOffsetWidth: number; + wrapperOffsetHeight?: number; +} diff --git a/src/src/types/utils/getImageMediaListHeight.d.ts b/src/src/types/utils/getImageMediaListHeight.d.ts new file mode 100644 index 00000000..ae92f2bf --- /dev/null +++ b/src/src/types/utils/getImageMediaListHeight.d.ts @@ -0,0 +1,10 @@ +import { MediaItemAlignmentEnum } from 'config/enums/imageEnums'; + +export interface IGetImageMediaListHeightProps { + alignmentType: MediaItemAlignmentEnum; + maxHeight: number; + maxWidth: number; + wrapperOffsetWidth: number; + mediaItemSize: number; + mediaItemHeight: number; +} diff --git a/src/src/types/utils/getImageMediaSetSize.d.ts b/src/src/types/utils/getImageMediaSetSize.d.ts new file mode 100644 index 00000000..36789506 --- /dev/null +++ b/src/src/types/utils/getImageMediaSetSize.d.ts @@ -0,0 +1,11 @@ +import { MediaItemAlignmentEnum } from 'config/enums/imageEnums'; + +export interface IGetImageMediaSetSizeProps { + maxHeight: number; + maxWidth: number; + mediaItemHeight: number; + alignmentType: MediaItemAlignmentEnum; + wrapperOffsetWidth: number; + mediaItemSize: number; + stacking: boolean; +} diff --git a/src/src/utils/JsonToCSV.ts b/src/src/utils/JsonToCSV.ts new file mode 100644 index 00000000..2ccb63a4 --- /dev/null +++ b/src/src/utils/JsonToCSV.ts @@ -0,0 +1,27 @@ +function JsonToCSV(objArray: { [key: string]: string }[] | string): string { + // If the `objArray` is stringified array we need to parse to regular array + const array = Array.isArray(objArray) ? objArray : JSON.parse(objArray); + let str = ''; + let line = ''; + // header + for (let index in array[0]) { + let value = index + ''; + line += '"' + value.replace(/"/g, '""') + '",'; + } + line = line.slice(0, -1); + str += line + '\r\n'; + + // data + for (let i = 0; i < array.length; i++) { + let line = ''; + for (let index in array[i]) { + const value = array[i][index] + ''; + line += '"' + value.replace(/"/g, '""') + '",'; + } + line = line.slice(0, -1); + str += line + '\r\n'; + } + return str; +} + +export default JsonToCSV; diff --git a/src/src/utils/aggregateGroupData.ts b/src/src/utils/aggregateGroupData.ts new file mode 100644 index 00000000..5efd7211 --- /dev/null +++ b/src/src/utils/aggregateGroupData.ts @@ -0,0 +1,255 @@ +import _ from 'lodash-es'; + +import { + IAggregationData, + IMetricsCollection, +} from 'types/services/models/metrics/metricsAppModel'; +import { IAggregateGroupDataParams } from 'types/utils/aggregateGroupData'; +import { IMetric } from 'types/services/models/metrics/metricModel'; + +import { ScaleEnum } from './d3'; +import { getValuesMedian } from './getValuesMedian'; + +export enum AggregationAreaMethods { + NONE = 0, + MIN_MAX = 1, + STD_DEV = 2, + STD_ERR = 3, + CONF_INT = 4, +} + +export enum AggregationLineMethods { + MEAN = 0, + MEDIAN = 1, + MIN = 2, + MAX = 3, +} + +export function aggregateGroupData({ + groupData, + methods, + scale = { xAxis: ScaleEnum.Linear, yAxis: ScaleEnum.Linear }, +}: IAggregateGroupDataParams): IMetricsCollection[] { + const groupsWithAggregation = []; + + const groupedByChart = _.groupBy(groupData, 'chartIndex'); + + const xValuesPerChart: { [key: string]: number[] } = {}; + + // Get all X axis values for each chart + for (let chartIndex in groupedByChart) { + const groupsData = _.map(groupedByChart[chartIndex], (group) => group.data); + xValuesPerChart[chartIndex] = _.uniq( + groupsData + .flat() + .map((item) => item.data.xValues) + .flat() + .sort((a, b) => a - b), + ); + } + + for (let group of groupData) { + const chartIndex = group.chartIndex; + const chartXValues = xValuesPerChart[chartIndex]; + const yValuesPerX: { [key: string]: number[] } = {}; + const data = group.data; + + for (let i = 0; i < data.length; i++) { + if (!data[i].isHidden) { + const trace = data[i].data; + + // Calculate line value (y) for each X axis value in chart + // Even for case when line does not have corresponding x value + for (let j = 0; j < trace.xValues.length - 1; j++) { + const step = trace.xValues[j]; + const point = trace.yValues[j]; + const nextStep = trace.xValues[j + 1]; + const nextPoint = trace.yValues[j + 1]; + + const stepsInBetween = nextStep - step; + + for (let value of chartXValues.slice( + chartXValues.indexOf(step), + chartXValues.indexOf(nextStep) + 1, + )) { + let y; + let x0 = value - step; + let x2 = stepsInBetween; + let point1 = point; + let point2 = nextPoint; + + if (x0 === 0) { + y = point1; + } else if (x0 === x2) { + y = point2; + } else { + if (scale.xAxis === ScaleEnum.Log) { + x0 = Math.log(value) - Math.log(step); + x2 = Math.log(nextStep) - Math.log(step); + } + if (scale.yAxis === ScaleEnum.Log) { + point1 = Math.log(point1); + point2 = Math.log(point2); + } + if (point1 > point2) { + y = point1 - ((point1 - point2) * x0) / x2; + } else { + y = ((point2 - point1) * x0) / x2 + point1; + } + if (scale.yAxis === ScaleEnum.Log) { + y = Math.exp(y); + } + } + if ( + (scale.xAxis === ScaleEnum.Linear || + (value !== 0 && step !== 0 && nextStep !== 0)) && + (scale.yAxis === ScaleEnum.Linear || y > 0) + ) { + if (yValuesPerX.hasOwnProperty(value)) { + if (!yValuesPerX[value].includes(y)) { + yValuesPerX[value].push(y); + } + } else { + yValuesPerX[value] = [y]; + } + } + } + } + } + } + + const xValues = Object.keys(yValuesPerX) + .map((x) => +x) + .sort((a: number, b: number) => a - b); + + const area: IAggregationData['area'] = { + min: null, + max: null, + }; + + let line: IAggregationData['line'] = null; + + switch (methods.line) { + case AggregationLineMethods.MIN: + line = { + xValues: xValues, + yValues: xValues.map((x) => _.min(yValuesPerX[x])) as number[], + }; + break; + case AggregationLineMethods.MAX: + line = { + xValues: xValues, + yValues: xValues.map((x) => _.max(yValuesPerX[x])) as number[], + }; + break; + case AggregationLineMethods.MEAN: + line = { + xValues: xValues, + yValues: xValues.map( + (x) => _.sum(yValuesPerX[x]) / yValuesPerX[x].length, + ) as number[], + }; + break; + case AggregationLineMethods.MEDIAN: + line = { + xValues: xValues, + yValues: xValues.map((x) => + getValuesMedian(yValuesPerX[x]), + ) as number[], + }; + break; + default: + } + + switch (methods.area) { + case AggregationAreaMethods.MIN_MAX: + area.min = { + xValues: xValues, + yValues: xValues.map((x) => _.min(yValuesPerX[x])) as number[], + }; + area.max = { + xValues: xValues, + yValues: xValues.map((x) => _.max(yValuesPerX[x])) as number[], + }; + break; + case AggregationAreaMethods.STD_DEV: + case AggregationAreaMethods.STD_ERR: + case AggregationAreaMethods.CONF_INT: + let stepValues: { + [key: number]: { + min: number; + max: number; + stdDevValue?: number; + stdErrValue?: number; + }; + } = {}; + xValues.forEach((x) => { + const mean = _.sum(yValuesPerX[x]) / yValuesPerX[x].length; + + const distancesFromAvg = yValuesPerX[x].map((value) => + Math.pow(mean - value, 2), + ); + const sum = _.sum(distancesFromAvg); + const stdDevValue = Math.sqrt(sum / (yValuesPerX[x].length - 1 || 1)); + + if (methods.area === AggregationAreaMethods.STD_DEV) { + stepValues[x] = { + min: mean - stdDevValue, + max: mean + stdDevValue, + stdDevValue, + }; + } else if (methods.area === AggregationAreaMethods.STD_ERR) { + const stdErrValue = stdDevValue / Math.sqrt(yValuesPerX[x].length); + stepValues[x] = { + min: mean - stdErrValue, + max: mean + stdErrValue, + stdErrValue, + }; + } else if (methods.area === AggregationAreaMethods.CONF_INT) { + const zValue = 1.96; // for 95% confidence level + const CI = + zValue * (stdDevValue / Math.sqrt(yValuesPerX[x].length)); + stepValues[x] = { + min: mean - CI, + max: mean + CI, + }; + } + }); + + area.min = { + xValues: xValues, + yValues: xValues.map((x) => stepValues[x].min) as number[], + }; + area.max = { + xValues: xValues, + yValues: xValues.map((x) => stepValues[x].max) as number[], + }; + + if (methods.area === AggregationAreaMethods.STD_DEV) { + area.stdDevValue = { + xValues: xValues, + yValues: xValues.map((x) => stepValues[x].stdDevValue) as number[], + }; + } + + if (methods.area === AggregationAreaMethods.STD_ERR) { + area.stdErrValue = { + xValues: xValues, + yValues: xValues.map((x) => stepValues[x].stdErrValue) as number[], + }; + } + break; + default: + } + + groupsWithAggregation.push({ + ...group, + aggregation: { + line, + area, + }, + }); + } + + return groupsWithAggregation; +} diff --git a/src/src/utils/alphabeticalSortComparator.ts b/src/src/utils/alphabeticalSortComparator.ts new file mode 100644 index 00000000..a2d354bd --- /dev/null +++ b/src/src/utils/alphabeticalSortComparator.ts @@ -0,0 +1,53 @@ +/** + * alphabeticalSortComparator options + */ +type Options = { + /** + * the key get the value from the object + */ + orderBy: string; + /** + * increasing or decreasing + */ + order?: 'asc' | 'desc'; + /** + * once you need an additional case, i.e. you have a pref. + * string which need to always be at the beginning of the list + */ + additionalCompare?: (str1: string, str2: string) => 1 | -1 | 0 | null; +}; + +/** + * alphabeticalSortComparator + * @Closure return actual compare function to pass to Array.sort asa parameter + * @param {Options} options - options + */ +function alphabeticalSortComparator>( + options: Options, +): (a: T, b: T) => number { + const { orderBy, order = 'asc' } = options; + return (a: T, b: T) => { + const str1 = a[orderBy].toUpperCase(); + const str2 = b[orderBy].toUpperCase(); + + if (options.additionalCompare) { + const result = options.additionalCompare(str1, str2); + if (result !== null) { + // return the result based on additional compare logic, and don't continue the base logic + return result; + } + // otherwise continue the base logic + } + + if (str1 < str2) { + return order === 'asc' ? -1 : 1; + } + if (str1 > str2) { + return order === 'asc' ? 1 : -1; + } + + return 0; + }; +} + +export default alphabeticalSortComparator; diff --git a/src/src/utils/app/alignMetricData.ts b/src/src/utils/app/alignMetricData.ts new file mode 100644 index 00000000..89129a17 --- /dev/null +++ b/src/src/utils/app/alignMetricData.ts @@ -0,0 +1,226 @@ +import { AlignmentNotificationsEnum } from 'config/notification-messages/notificationMessages'; + +import { IMetricsCollection } from 'types/services/models/metrics/metricsAppModel'; +import { IMetric } from 'types/services/models/metrics/metricModel'; +import { IModel } from 'types/services/models/model'; +import { IAppModelState } from 'types/services/models/explorer/createAppModel'; + +import { filterArrayByIndexes } from '../filterArrayByIndexes'; +import { AlignmentOptionsEnum } from '../d3'; + +import sortDependingArrays from './sortDependingArrays'; +import onNotificationAdd from './onNotificationAdd'; + +export function alignByStep( + data: IMetricsCollection[], +): IMetricsCollection[] { + for (let i = 0; i < data.length; i++) { + const metricCollection = data[i]; + for (let j = 0; j < metricCollection.data.length; j++) { + const metric = metricCollection.data[j]; + metric.data = { + ...metric.data, + xValues: [...metric.data.steps], + yValues: [...metric.data.values], + }; + } + } + return data; +} + +export function alignByEpoch( + data: IMetricsCollection[], +): IMetricsCollection[] { + for (let i = 0; i < data.length; i++) { + const metricCollection = data[i]; + for (let j = 0; j < metricCollection.data.length; j++) { + const metric = metricCollection.data[j]; + const epochs: { [key: number]: number[] } = {}; + + metric.data.epochs.forEach((epoch, i) => { + if (epochs.hasOwnProperty(epoch)) { + epochs[epoch].push(metric.data.steps[i]); + } else { + epochs[epoch] = [metric.data.steps[i]]; + } + }); + + metric.data = { + ...metric.data, + xValues: [ + ...metric.data.epochs.map((epoch, i) => { + return ( + epoch + + (epochs[epoch].length > 1 + ? (0.99 / epochs[epoch].length) * + epochs[epoch].indexOf(metric.data.steps[i]) + : 0) + ); + }), + ], + yValues: [...metric.data.values], + }; + } + } + return data; +} + +export function alignByRelativeTime( + data: IMetricsCollection[], +): IMetricsCollection[] { + for (let i = 0; i < data.length; i++) { + const metricCollection = data[i]; + for (let j = 0; j < metricCollection.data.length; j++) { + const metric = metricCollection.data[j]; + const firstDate = metric.data.timestamps[0]; + const timestamps: { [key: number]: number[] } = {}; + metric.data.timestamps.forEach((timestamp, i) => { + if (timestamps.hasOwnProperty(timestamp)) { + timestamps[timestamp].push(metric.data.steps[i]); + } else { + timestamps[timestamp] = [metric.data.steps[i]]; + } + }); + metric.data = { + ...metric.data, + xValues: [ + ...metric.data.timestamps.map( + (timestamp, i) => + timestamp - + firstDate + + (timestamps[timestamp].length > 1 + ? (0.99 / timestamps[timestamp].length) * + timestamps[timestamp].indexOf(metric.data.steps[i]) + : 0), + ), + ], + yValues: [...metric.data.values], + }; + } + } + return data; +} + +export function alignByAbsoluteTime( + data: IMetricsCollection[], +): IMetricsCollection[] { + for (let i = 0; i < data.length; i++) { + const metricCollection = data[i]; + for (let j = 0; j < metricCollection.data.length; j++) { + const metric = metricCollection.data[j]; + metric.data = { + ...metric.data, + xValues: [...metric.data.timestamps], + yValues: [...metric.data.values], + }; + } + } + return data; +} + +export function alignByCustomMetric( + data: IMetricsCollection[], + model?: IModel, +): IMetricsCollection[] { + let missingTraces = false; + for (let i = 0; i < data.length; i++) { + const metricCollection = data[i]; + for (let j = 0; j < metricCollection.data.length; j++) { + const metric = metricCollection.data[j]; + const missingIndexes: number[] = []; + if (metric.x_axis_iters && metric.x_axis_values) { + const { x_axis_iters: xAxisIters, x_axis_values: xAxisValues } = metric; + if (xAxisValues.length === metric.data.values.length) { + const { sortedXValues, sortedArrays } = sortDependingArrays( + [...xAxisValues], + { + yValues: [...metric.data.values], + epochs: [...metric.data.epochs], + steps: [...metric.data.steps], + timestamps: [...metric.data.timestamps], + values: [...metric.data.values], + }, + ); + + metric.data = { + ...metric.data, + ...sortedArrays, + xValues: sortedXValues, + }; + } else { + metric.data.steps.forEach((step, index) => { + if (xAxisIters.indexOf(step) === -1) { + missingIndexes.push(index); + } + }); + const epochs = filterArrayByIndexes( + missingIndexes, + metric.data.epochs, + ); + const steps = filterArrayByIndexes(missingIndexes, metric.data.steps); + const timestamps = filterArrayByIndexes( + missingIndexes, + metric.data.timestamps, + ); + const values = filterArrayByIndexes( + missingIndexes, + metric.data.values, + ); + const yValues = filterArrayByIndexes( + missingIndexes, + metric.data.yValues, + ); + + const { sortedXValues, sortedArrays } = sortDependingArrays( + [...xAxisValues], + { + yValues: [...yValues], + epochs: [...epochs], + steps: [...steps], + timestamps: [...timestamps], + values: [...values], + }, + ); + + metric.data = { + ...metric.data, + ...sortedArrays, + xValues: sortedXValues, + }; + } + } else { + missingTraces = true; + } + } + } + if (missingTraces && model) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [AlignmentNotificationsEnum.NOT_ALL_ALIGNED], + }, + model, + }); + } + return data; +} + +export function alignData( + data: IMetricsCollection[], + type: AlignmentOptionsEnum = AlignmentOptionsEnum.STEP, + model?: IModel, +): IMetricsCollection[] { + const alignmentObj: Record = { + [AlignmentOptionsEnum.STEP]: alignByStep, + [AlignmentOptionsEnum.EPOCH]: alignByEpoch, + [AlignmentOptionsEnum.RELATIVE_TIME]: alignByRelativeTime, + [AlignmentOptionsEnum.ABSOLUTE_TIME]: alignByAbsoluteTime, + [AlignmentOptionsEnum.CUSTOM_METRIC]: alignByCustomMetric, + default: () => { + throw new Error('Unknown value for X axis alignment'); + }, + }; + const alignment = alignmentObj[type] || alignmentObj.default; + return alignment(data, model); +} diff --git a/src/src/utils/app/exceptionHandler.ts b/src/src/utils/app/exceptionHandler.ts new file mode 100644 index 00000000..41f2cdf1 --- /dev/null +++ b/src/src/utils/app/exceptionHandler.ts @@ -0,0 +1,60 @@ +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { IModel, State } from 'types/services/models/model'; + +import onNotificationAdd from './onNotificationAdd'; + +export default function exceptionHandler({ + detail, + model, +}: { + detail: any; + model: IModel; +}) { + let message = ''; + let state: Record = { + requestStatus: RequestStatusEnum.BadRequest, + }; + const modelState: any = model.getState(); + if (detail.message === 'SyntaxError' && modelState) { + const advancedMode: boolean = modelState.config?.select.advancedMode; + const OffsetDiff: number = advancedMode ? 1 : 2; + + detail.detail.offset = detail.detail.offset - OffsetDiff; + if (detail.detail.end_offset) { + detail.detail.end_offset = detail.detail.end_offset - OffsetDiff; + } + message = `Query syntax error at line (${detail.detail.line}, ${ + detail.detail.offset + }${ + detail.detail?.end_offset && + detail.detail.end_offset !== detail.detail.offset + ? `-${detail.detail.end_offset.end_offset}` + : '' + })`; + state = { + ...state, + selectFormData: { + ...modelState.selectFormData, + [advancedMode ? 'advancedError' : 'error']: { + ...detail, + message, + }, + }, + }; + model.setState(state); + return; + } else { + message = detail.message || 'Something went wrong'; + } + + model.setState(state); + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [message], + }, + model, + }); +} diff --git a/src/src/utils/app/filterMetricData.ts b/src/src/utils/app/filterMetricData.ts new file mode 100644 index 00000000..3e5241ce --- /dev/null +++ b/src/src/utils/app/filterMetricData.ts @@ -0,0 +1,140 @@ +import { IRunBatch } from 'pages/RunDetail/types'; + +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { SequenceFullView } from 'types/core/AimObjects'; + +import { AlignmentOptionsEnum, ScaleEnum } from 'utils/d3'; +import { float64FromUint8 } from 'utils/helper'; + +function isInvalidMetricValue( + v: number, + scaleType: ScaleEnum = ScaleEnum.Linear, +): boolean { + return ( + (!v && v !== 0) || + !isFinite(v) || + isNaN(v) || + (scaleType === ScaleEnum.Log && v < 0) + ); +} + +function getFilteredMetricValues(args: { + data: T; + invalidIndicesArray: number[][]; +}): T { + const { data, invalidIndicesArray } = args; + // @ts-ignore + return data.filter((v: number, i: number) => + invalidIndicesArray.every( + (invalidIndices) => invalidIndices.indexOf(i) === -1, + ), + ); +} + +function getInvalidIndices( + values: T, + scaleType?: ScaleEnum, +): number[] { + // @ts-ignore + return values.reduce((acc: number[], v: number, i: number) => { + if (isInvalidMetricValue(v, scaleType)) { + acc = acc.concat([i]); + } + return acc; + }, []); +} + +export function filterMetricsData( + sequence: SequenceFullView, + alignmentType: AlignmentOptionsEnum = AlignmentOptionsEnum.STEP, + axesScaleType?: IAxesScaleState, +) { + const values = float64FromUint8(sequence.values?.blob); + const steps = float64FromUint8(sequence.iters?.blob); + const epochs = float64FromUint8(sequence.epochs?.blob); + const timestamps = float64FromUint8(sequence.timestamps?.blob); + const x_axis_iters = float64FromUint8(sequence.x_axis_iters?.blob); + const x_axis_values = float64FromUint8(sequence.x_axis_values?.blob); + + const { xAxis, yAxis } = axesScaleType || {}; + + const invalidIndices = { + values: getInvalidIndices(values, yAxis), + steps: getInvalidIndices(steps, xAxis), + epochs: getInvalidIndices(epochs, xAxis), + timestamps: getInvalidIndices(timestamps, xAxis), + x_axis_iters: getInvalidIndices(x_axis_iters, xAxis), + x_axis_values: getInvalidIndices(x_axis_values, xAxis), + }; + + const invalidXIndicesObj = { + [AlignmentOptionsEnum.STEP]: [invalidIndices.steps], + [AlignmentOptionsEnum.EPOCH]: [invalidIndices.epochs], + [AlignmentOptionsEnum.RELATIVE_TIME]: [invalidIndices.timestamps], + [AlignmentOptionsEnum.ABSOLUTE_TIME]: [invalidIndices.timestamps], + [AlignmentOptionsEnum.CUSTOM_METRIC]: [ + invalidIndices.x_axis_iters, + invalidIndices.x_axis_values, + ], + }; + + return { + values: getFilteredMetricValues({ + data: values, + invalidIndicesArray: [ + ...invalidXIndicesObj[alignmentType], + invalidIndices.values, + ], + }), + steps: getFilteredMetricValues({ + data: steps, + invalidIndicesArray: [invalidIndices.steps, invalidIndices.values], + }), + epochs: getFilteredMetricValues({ + data: epochs, + invalidIndicesArray: [invalidIndices.epochs, invalidIndices.values], + }), + timestamps: getFilteredMetricValues({ + data: timestamps, + invalidIndicesArray: [invalidIndices.timestamps, invalidIndices.values], + }).map((timestamp: number) => Math.round(timestamp * 1000)), + x_axis_values: getFilteredMetricValues({ + data: x_axis_values, + invalidIndicesArray: [ + invalidIndices.x_axis_iters, + invalidIndices.x_axis_values, + ], + }), + x_axis_iters: getFilteredMetricValues({ + data: x_axis_iters, + invalidIndicesArray: [ + invalidIndices.x_axis_iters, + invalidIndices.x_axis_values, + ], + }), + }; +} + +export function filterSingleRunMetricsData(run: IRunBatch) { + if (!run?.values?.length || !run?.iters?.length) { + return { + values: [], + iters: [], + }; + } + const { values, iters } = run; + const invalidIndices = { + values: getInvalidIndices(values), + iters: getInvalidIndices(iters), + }; + return { + values: getFilteredMetricValues({ + data: values, + invalidIndicesArray: [invalidIndices.iters, invalidIndices.values], + }), + iters: getFilteredMetricValues({ + data: iters, + invalidIndicesArray: [invalidIndices.iters, invalidIndices.values], + }), + }; +} diff --git a/src/src/utils/app/getAggregatedData.ts b/src/src/utils/app/getAggregatedData.ts new file mode 100644 index 00000000..1e4b17be --- /dev/null +++ b/src/src/utils/app/getAggregatedData.ts @@ -0,0 +1,43 @@ +import COLORS from 'config/colors/colors'; + +import { IMetric } from 'types/services/models/metrics/metricModel'; +import { + IAggregatedData, + IMetricsCollection, +} from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +export default function getAggregatedData({ + processedData, + model, +}: { + processedData: IMetricsCollection[]; + model: IModel; +}): IAggregatedData[] { + if (!processedData) { + return []; + } + + const paletteIndex: number = + model.getState()?.config?.grouping?.paletteIndex || 0; + + let aggregatedData: IAggregatedData[] = []; + + processedData.forEach((metricsCollection, index) => { + aggregatedData.push({ + key: metricsCollection.key, + area: { + min: metricsCollection.aggregation?.area.min || null, + max: metricsCollection.aggregation?.area.max || null, + }, + line: metricsCollection.aggregation?.line || null, + chartIndex: metricsCollection.chartIndex || 0, + color: + metricsCollection.color || + COLORS[paletteIndex][index % COLORS[paletteIndex].length], + dasharray: metricsCollection.dasharray || 'none', + }); + }); + + return aggregatedData; +} diff --git a/src/src/utils/app/getAppConfigData.ts b/src/src/utils/app/getAppConfigData.ts new file mode 100644 index 00000000..c793f34f --- /dev/null +++ b/src/src/utils/app/getAppConfigData.ts @@ -0,0 +1,62 @@ +import _ from 'lodash-es'; + +import appsService from 'services/api/apps/appsService'; + +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; +import { IModel, State } from 'types/services/models/model'; +import { IAppData } from 'types/services/models/metrics/metricsAppModel'; +import { IApiRequest } from 'types/services/services'; + +import { getCompatibleSelectConfig } from './getCompatibleSelectConfig'; +import exceptionHandler from './exceptionHandler'; +import { getCompatibleChartConfig } from './getCompatibleChartConfig'; + +export default function getAppConfigData({ + appId, + appRequest, + config, + model, +}: { + appId: string; + appRequest: IApiRequest; + config: IAppModelConfig; + model: IModel; +}): IApiRequest { + if (appRequest) { + appRequest.abort(); + } + appRequest = appsService.fetchApp(appId); + return { + call: async () => { + const appData = await appRequest.call((detail: any) => { + exceptionHandler({ detail, model }); + }); + let select = appData?.state?.select; + if (select) { + const compatibleSelectConfig = getCompatibleSelectConfig( + ['metrics', 'params', 'images'], + select, + ); + appData.state = { + ...appData.state, + select: { + ...compatibleSelectConfig, + }, + }; + } + let chart = appData?.state?.chart; + if (chart) { + const compatibleChartConfig = getCompatibleChartConfig(chart); + appData.state = { + ...appData.state, + chart: { + ...compatibleChartConfig, + }, + }; + } + const configData = _.merge(config, appData.state); + model.setState({ config: configData }); + }, + abort: appRequest.abort, + }; +} diff --git a/src/src/utils/app/getChartTitleData.ts b/src/src/utils/app/getChartTitleData.ts new file mode 100644 index 00000000..67c40e58 --- /dev/null +++ b/src/src/utils/app/getChartTitleData.ts @@ -0,0 +1,59 @@ +import _ from 'lodash-es'; +import moment from 'moment'; + +import { DATE_WITH_SECONDS } from 'config/dates/dates'; + +import { + IChartTitle, + IChartTitleData, + IGroupingSelectOption, + IMetricsCollection, +} from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import { formatValue } from '../formatValue'; +import getValueByField from '../getValueByField'; + +export default function getChartTitleData({ + processedData, + groupingSelectOptions, + model, +}: { + processedData: IMetricsCollection[]; + groupingSelectOptions: IGroupingSelectOption[]; + model: IModel; +}): IChartTitleData { + if (!processedData) { + return {}; + } + const groupData = model.getState()?.config?.grouping; + let chartTitleData: IChartTitleData = {}; + processedData.forEach((metricsCollection) => { + if (!chartTitleData[metricsCollection.chartIndex]) { + chartTitleData[metricsCollection.chartIndex] = groupData.chart.reduce( + (acc: IChartTitle, groupItemKey: string) => { + if (metricsCollection.config?.hasOwnProperty(groupItemKey)) { + const value = metricsCollection.config[groupItemKey]; + if ( + groupItemKey === 'run.props.creation_time' || + groupItemKey === 'run.props.end_time' + ) { + acc[getValueByField(groupingSelectOptions || [], groupItemKey)] = + formatValue( + !_.isNil(value) && typeof value === 'number' + ? moment(value * 1000).format(DATE_WITH_SECONDS) + : value, + ); + } else { + acc[getValueByField(groupingSelectOptions || [], groupItemKey)] = + formatValue(value); + } + } + return acc; + }, + {}, + ); + } + }); + return chartTitleData; +} diff --git a/src/src/utils/app/getCompatibleChartConfig.ts b/src/src/utils/app/getCompatibleChartConfig.ts new file mode 100644 index 00000000..086c6c71 --- /dev/null +++ b/src/src/utils/app/getCompatibleChartConfig.ts @@ -0,0 +1,50 @@ +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import { IChart } from 'types/services/models/explorer/createAppModel'; + +import { SmoothingAlgorithmEnum } from 'utils/smoothingData'; +import { AlignmentOptionsEnum } from 'utils/d3'; + +const CompatibleAlignmentOptions = [...Object.values(AlignmentOptionsEnum)]; + +export function getCompatibleChartConfig(chart: any): IChart { + if (chart) { + if (typeof chart.alignmentConfig?.type === 'number') { + makeAlignmentConfigCompatible(chart); + } + if ( + chart.hasOwnProperty('smoothingAlgorithm') && + chart.hasOwnProperty('smoothingFactor') && + chart.hasOwnProperty('curveInterpolation') + ) { + makeSmoothingConfigCompatible(chart); + } + } + return chart; +} + +function makeAlignmentConfigCompatible(chart: any) { + chart.alignmentConfig.type = + CompatibleAlignmentOptions[chart.alignmentConfig.type]; +} + +function makeSmoothingConfigCompatible(chart: any): void { + if (!chart.smoothing) { + chart.smoothing = CONTROLS_DEFAULT_CONFIG.metrics.smoothing; + } + if ( + (chart.smoothingAlgorithm === SmoothingAlgorithmEnum.EMA && + chart.smoothingFactor !== 0) || + (chart.smoothingAlgorithm === SmoothingAlgorithmEnum.CMA && + chart.smoothingFactor !== 1) + ) { + chart.smoothing.isApplied = true; + } + + chart.smoothing.factor = chart.smoothingFactor; + chart.smoothing.algorithm = chart.smoothingAlgorithm; + chart.smoothing.curveInterpolation = chart.curveInterpolation; + delete chart.smoothingFactor; + delete chart.smoothingAlgorithm; + delete chart.curveInterpolation; +} diff --git a/src/src/utils/app/getCompatibleSelectConfig.ts b/src/src/utils/app/getCompatibleSelectConfig.ts new file mode 100644 index 00000000..b8643440 --- /dev/null +++ b/src/src/utils/app/getCompatibleSelectConfig.ts @@ -0,0 +1,56 @@ +import _ from 'lodash-es'; + +import { ISelectConfig } from 'types/services/models/explorer/createAppModel'; + +import { getMetricHash } from './getMetricHash'; +import { getMetricLabel } from './getMetricLabel'; + +export function getCompatibleSelectConfig( + keys: string[] = [], + select: ISelectConfig, +): ISelectConfig { + if (select) { + let selectConfig: any = _.cloneDeep(select); + keys?.forEach((key: string) => { + if (selectConfig?.hasOwnProperty(key)) { + const selectOptions = selectConfig[key]; + if (Array.isArray(selectOptions)) { + selectOptions.forEach((option) => { + if (option?.value && typeof option.value === 'object') { + ['metric_name', 'param_name'].forEach((valueNameKey) => { + if (option.value?.hasOwnProperty(valueNameKey)) { + option.value.option_name = option.value[valueNameKey]; + delete option.value[valueNameKey]; + } + }); + } + }); + } + + selectConfig = { + ...selectConfig, + options: [ + ...(selectConfig[key] || []), + ...(selectConfig.options || []), + ], + }; + delete selectConfig[key]; + } + }); + selectConfig.options = selectConfig.options?.map((option: any) => { + if (!option.key) { + if (option.value) { + const { option_name, context } = option.value; + const metricHash = getMetricHash(option_name, context); + const metricLabel = getMetricLabel(option_name, context); + return { ...option, label: metricLabel, key: metricHash }; + } else { + return { ...option, key: option.label }; + } + } + return option; + }); + return selectConfig; + } + return select; +} diff --git a/src/src/utils/app/getDataAsMediaSetNestedObject.ts b/src/src/utils/app/getDataAsMediaSetNestedObject.ts new file mode 100644 index 00000000..65f458e8 --- /dev/null +++ b/src/src/utils/app/getDataAsMediaSetNestedObject.ts @@ -0,0 +1,84 @@ +import _ from 'lodash-es'; + +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import { formatValue } from 'utils/formatValue'; +import getValueByField from 'utils/getValueByField'; + +export function getDataAsMediaSetNestedObject({ + data, + groupingSelectOptions, + model, + defaultGroupFields, +}: { + data: any[]; + groupingSelectOptions: IGroupingSelectOption[]; + model?: IModel; + defaultGroupFields?: string[]; +}) { + if (!_.isEmpty(data)) { + const modelState = model?.getState(); + const configData = modelState?.config; + const grouping = configData?.grouping; + const mediaSetData: object = {}; + const group: string[] = [...(grouping?.row || [])]; + //ToDo reverse mode + // const groupFields = + // defaultGroupFields || + // (grouping?.reverseMode?.row + // ? groupingSelectOptions + // .filter( + // (option: IGroupingSelectOption) => !group.includes(option.label), + // ) + // .map((option) => option.value) + // : group); + const groupFields = defaultGroupFields || group; + const orderedMap = {}; + + data.forEach((group: any) => { + const path = groupFields?.reduce( + (acc: string[], field: string, index: number) => { + const value = _.get(group.data[0], field); + _.set( + orderedMap, + acc.concat(['ordering']), + new Set([ + ...(_.get(orderedMap, acc.concat(['ordering'])) || []), + value, + ]), + ); + _.set( + orderedMap, + acc.concat(['key']), + getValueByField(groupingSelectOptions, field), + ); + _.set(orderedMap, acc.concat(['orderKey']), field); + acc.push( + `${getValueByField(groupingSelectOptions, field)} = ${formatValue( + value, + )}`, + ); + return acc; + }, + [], + ); + _.set( + mediaSetData, + path, + _.sortBy(group.data, [ + ...groupFields, + ...groupingSelectOptions + .map((option: IGroupingSelectOption) => option.value) + .filter((field) => !groupFields.includes(field)), + 'caption', + ]), + ); + }); + return { + mediaSetData: _.isEmpty(mediaSetData) ? data[0].data : mediaSetData, + orderedMap, + }; + } + return {}; +} diff --git a/src/src/utils/app/getFilteredGroupingOptions.ts b/src/src/utils/app/getFilteredGroupingOptions.ts new file mode 100644 index 00000000..f4fbe30d --- /dev/null +++ b/src/src/utils/app/getFilteredGroupingOptions.ts @@ -0,0 +1,36 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { IModel, State } from 'types/services/models/model'; + +export function getFilteredGroupingOptions({ + groupName, + model, +}: { + groupName: GroupNameEnum; + model: IModel; +}): string[] { + const modelState = model.getState(); + const grouping = modelState?.config?.grouping; + if (grouping) { + const { + // reverseMode, + isApplied, + } = grouping; + const groupingSelectOptions = model.getState()?.groupingSelectOptions; + if (groupingSelectOptions) { + //ToDo reverse mode + // const filteredOptions = [...groupingSelectOptions] + // .filter((opt) => grouping[groupName].indexOf(opt.value) === -1) + // .map((item) => item.value); + //ToDo reverse mode + // return isApplied[groupName] + // ? reverseMode[groupName] + // ? filteredOptions + // : grouping[groupName] + // : []; + return isApplied[groupName] ? grouping[groupName] : []; + } + return []; + } + return []; +} diff --git a/src/src/utils/app/getFilteredRow.ts b/src/src/utils/app/getFilteredRow.ts new file mode 100644 index 00000000..4ad059d0 --- /dev/null +++ b/src/src/utils/app/getFilteredRow.ts @@ -0,0 +1,36 @@ +import { decode } from 'utils/encoder/encoder'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { isMetricHash } from 'utils/isMetricHash'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +export default function getFilteredRow>({ + columnKeys, + row, +}: { + columnKeys: string[]; + row: R; +}): { [key: string]: string } { + return columnKeys.reduce((acc: { [key: string]: string }, column: string) => { + let columnKey = column; + if (isMetricHash(column)) { + const { metricName, contextName } = JSON.parse(decode(column)); + columnKey = `${metricName}${contextName ? `${contextName} ` : ''}`; + } else if (isSystemMetric(column)) { + columnKey = formatSystemMetricName(column); + } + let value = row[column]; + if (Array.isArray(value)) { + value = value.join(', '); + } else if (typeof value !== 'string') { + value = value || value === 0 ? JSON.stringify(value) : '-'; + } + + if (columnKey.startsWith('params.')) { + acc[columnKey.replace('params.', '')] = value; + } else { + acc[columnKey] = value; + } + + return acc; + }, {}); +} diff --git a/src/src/utils/app/getFilteredSystemMetrics.ts b/src/src/utils/app/getFilteredSystemMetrics.ts new file mode 100644 index 00000000..a4bb9fec --- /dev/null +++ b/src/src/utils/app/getFilteredSystemMetrics.ts @@ -0,0 +1,28 @@ +import { isSystemMetric } from 'utils/isSystemMetric'; + +/** + * @param {string[]} array an array of strings, + * like `['Loss_type="duration_loss"','__system__cpu']` + * @param {boolean} isExclude exclude system metrics vise versa, + * + * @returns {Array} Array containing system metric keys or empty array + * @example + * getFilteredSystemMetrics(['Loss_type="duration_loss','__system__cpu']); // => ['__system__cpu'] + * getFilteredSystemMetrics(['Loss_type="duration_loss','__system__cpu'], true); // => ['Loss_type="duration_loss'] + */ + +export default function getFilteredSystemMetrics( + array: string[], + isExclude?: boolean, +): string[] | [] { + let filtered: string[] = []; + if (Array.isArray(array)) { + array.forEach((val) => { + if (isExclude ? !isSystemMetric(val) : isSystemMetric(val)) { + filtered.push(val); + } + }); + } + + return filtered; +} diff --git a/src/src/utils/app/getGroupConfig.ts b/src/src/utils/app/getGroupConfig.ts new file mode 100644 index 00000000..cd867c9a --- /dev/null +++ b/src/src/utils/app/getGroupConfig.ts @@ -0,0 +1,41 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + IGroupingSelectOption, + IMetricsCollection, +} from 'types/services/models/metrics/metricsAppModel'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { getValue } from 'utils/helper'; + +import getValueByField from '../getValueByField'; + +export default function getGroupConfig({ + collection, + groupingSelectOptions, + groupingNames = [], + configData, +}: { + collection: IMetricsCollection; + groupingSelectOptions: IGroupingSelectOption[]; + groupingNames: GroupNameEnum[]; + configData: IAppModelConfig; +}) { + let groupConfig: Record = {}; + + for (let groupName of groupingNames) { + const groupItem: string[] = configData?.grouping?.[groupName] || []; + if (groupItem.length) { + groupConfig[groupName] = groupItem.reduce((acc, paramKey) => { + Object.assign(acc, { + [getValueByField(groupingSelectOptions || [], paramKey)]: getValue( + collection.config, + paramKey, + ), + }); + return acc; + }, {}); + } + } + return groupConfig; +} diff --git a/src/src/utils/app/getGroupingPersistIndex.ts b/src/src/utils/app/getGroupingPersistIndex.ts new file mode 100644 index 00000000..1cf07f3b --- /dev/null +++ b/src/src/utils/app/getGroupingPersistIndex.ts @@ -0,0 +1,29 @@ +import { IGetGroupingPersistIndex } from 'types/services/models/metrics/metricsAppModel'; + +import { encode } from '../encoder/encoder'; + +export function getGroupingPersistIndex({ + groupConfig, + grouping, + groupName, +}: IGetGroupingPersistIndex) { + const configHash = encode(groupConfig as {}, true); + let index = BigInt(0); + if (grouping?.seed) { + for (let i = 0; i < configHash.length; i++) { + const charCode = configHash.charCodeAt(i); + if (charCode > 47 && charCode < 58) { + index += BigInt( + (charCode - 48) * + Math.ceil(Math.pow(16, i) / grouping?.seed[groupName]), + ); + } else if (charCode > 96 && charCode < 103) { + index += BigInt( + (charCode - 87) * + Math.ceil(Math.pow(16, i) / grouping?.seed[groupName]), + ); + } + } + } + return index; +} diff --git a/src/src/utils/app/getGroupingSelectOptions.ts b/src/src/utils/app/getGroupingSelectOptions.ts new file mode 100644 index 00000000..04be28e0 --- /dev/null +++ b/src/src/utils/app/getGroupingSelectOptions.ts @@ -0,0 +1,94 @@ +import _ from 'lodash-es'; + +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; + +export default function getGroupingSelectOptions({ + params, + runProps = [], + contexts = [], + sequenceName = null, +}: { + params: string[]; + runProps?: string[]; + contexts?: string[]; + sequenceName?: null | 'metric' | 'images' | 'audios'; +}): IGroupingSelectOption[] { + let options = [ + { + group: 'run', + label: 'run.hash', + value: 'run.hash', + }, + ]; + + if (runProps?.length) { + const filterPropsOptions = ['notes', 'tags', 'experiment.id']; + const replacePropsLabel: { [key: string]: string } = { + 'experiment.name': 'experiment', + }; + const propsOptions: IGroupingSelectOption[] = runProps + .filter((runProp: string) => filterPropsOptions.indexOf(runProp) === -1) + .map((runProp: string) => { + let propLabel = runProp; + if (replacePropsLabel.hasOwnProperty(runProp)) { + propLabel = replacePropsLabel[runProp]; + } + return { + group: 'run', + label: `run.${propLabel}`, + value: `run.props.${runProp}`, + }; + }); + + options = options.concat(propsOptions); + } + + if (params?.length) { + const paramsOptions: IGroupingSelectOption[] = params.map((param) => ({ + group: 'run', + label: param[0] === '[' ? `run${param}` : `run.${param}`, + value: param[0] === '[' ? `run.params${param}` : `run.params.${param}`, + })); + + options = options.concat(paramsOptions); + } + + if (sequenceName) { + let contextOptions = contexts.map((context) => ({ + group: sequenceName, + label: `${sequenceName}.context.${context}`, + value: `context.${context}`, + })); + let nameOption = { + group: sequenceName, + label: `${sequenceName}.name`, + value: 'name', + }; + let contextOption = { + group: sequenceName, + label: `${sequenceName}.context`, + value: 'context', + }; + options = !_.isEmpty(contexts) + ? options.concat(nameOption, contextOption, contextOptions) + : options.concat(nameOption); + } + + if (sequenceName === 'images' || sequenceName === 'audios') { + const recordOptions = [ + { + group: 'record', + label: 'record.step', + value: 'step', + }, + { + group: 'record', + label: 'record.index', + value: 'index', + }, + ]; + options = options.concat(recordOptions); + } + + return options; +} diff --git a/src/src/utils/app/getLegendsData.tsx b/src/src/utils/app/getLegendsData.tsx new file mode 100644 index 00000000..e9d2f5e8 --- /dev/null +++ b/src/src/utils/app/getLegendsData.tsx @@ -0,0 +1,78 @@ +import { + LegendColumnDataType, + LegendsDataType, +} from 'components/VisualizationLegends'; + +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + IGroupingSelectOption, + IMetricsCollection, +} from 'types/services/models/metrics/metricsAppModel'; +import { IGroupingConfig } from 'types/services/models/explorer/createAppModel'; + +import getValueByField from '../getValueByField'; +import { encode } from '../encoder/encoder'; +import { formatValue } from '../formatValue'; + +const groupingPropKeys: Record< + GroupNameEnum, + keyof IMetricsCollection +> = { + [GroupNameEnum.COLOR]: 'color', + [GroupNameEnum.STROKE]: 'dasharray', + [GroupNameEnum.CHART]: 'chartIndex', + [GroupNameEnum.ROW]: 'key', +}; + +function getLegendsData( + processedData: IMetricsCollection[] = [], + groupingSelectOptions: IGroupingSelectOption[] = [], + groupingConfig: IGroupingConfig = {}, + groupingNames: GroupNameEnum[] = [], +): LegendsDataType { + const legendsData: LegendsDataType = {}; + + for (let groupName of groupingNames) { + const legendRowData: Record = {}; + const groupPropKey = groupingPropKeys[groupName]; + const groupedItemPropKeys = groupingConfig[groupName] || []; + + if (groupedItemPropKeys.length > 0) { + for (const item of processedData) { + const config: Record = {}; + for (const propKey of groupedItemPropKeys) { + const key = getValueByField(groupingSelectOptions, propKey); + const value = item.config?.[propKey]; + config[key] = formatValue(value); + } + const legendRow = { + [groupPropKey]: item[groupPropKey], + config, + }; + const hashed = encode(legendRow); + if (!legendRowData[hashed]) { + legendRowData[hashed] = legendRow; + } + } + const keys = groupedItemPropKeys.map((item) => + getValueByField(groupingSelectOptions, item), + ); + const uniqueRows = Object.values(legendRowData); + const groupedByColumns: Record = {}; + for (let key of keys) { + groupedByColumns[key] = uniqueRows.map((row) => ({ + value: row.config[key], + color: row.color, + dasharray: row.dasharray, + chartIndex: row.chartIndex, + })); + } + + legendsData[groupName] = groupedByColumns; + } + } + return legendsData; +} + +export default getLegendsData; diff --git a/src/src/utils/app/getMetricHash.ts b/src/src/utils/app/getMetricHash.ts new file mode 100644 index 00000000..a512a460 --- /dev/null +++ b/src/src/utils/app/getMetricHash.ts @@ -0,0 +1,21 @@ +import _ from 'lodash-es'; + +import contextToString from 'utils/contextToString'; +import { encode } from 'utils/encoder/encoder'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +export function getMetricHash( + metricKey: string, + context: { [key: string]: string } | string, +): string { + const contextName = !_.isEmpty(context) + ? ` ${typeof context === 'string' ? context : contextToString(context)}` + : ''; + const metricName = isSystemMetric(metricKey) + ? formatSystemMetricName(metricKey) + : metricKey; + return isSystemMetric(metricKey) + ? metricKey + : encode({ metricName, contextName }); +} diff --git a/src/src/utils/app/getMetricLabel.ts b/src/src/utils/app/getMetricLabel.ts new file mode 100644 index 00000000..f47f0e0a --- /dev/null +++ b/src/src/utils/app/getMetricLabel.ts @@ -0,0 +1,18 @@ +import _ from 'lodash-es'; + +import contextToString from 'utils/contextToString'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +export function getMetricLabel( + metricKey: string, + context: { [key: string]: string } | string, +): string { + const contextName = !_.isEmpty(context) + ? ` ${typeof context === 'string' ? context : contextToString(context)}` + : ''; + const metricName = isSystemMetric(metricKey) + ? formatSystemMetricName(metricKey) + : metricKey; + return metricName + contextName; +} diff --git a/src/src/utils/app/getMetricsInitialRowData.ts b/src/src/utils/app/getMetricsInitialRowData.ts new file mode 100644 index 00000000..50273b5f --- /dev/null +++ b/src/src/utils/app/getMetricsInitialRowData.ts @@ -0,0 +1,20 @@ +import { getMetricHash } from './getMetricHash'; + +export function getMetricsInitialRowData( + metricsColumns: Record, +): Record { + return Object.keys(metricsColumns).reduce( + (acc: Record, metricName: string) => { + const groupByMetricName: Record = {}; + Object.keys(metricsColumns[metricName]).forEach( + (metricContext: string) => { + const metricHash = getMetricHash(metricName, metricContext); + groupByMetricName[metricHash] = '-'; + }, + ); + acc = { ...acc, ...groupByMetricName }; + return acc; + }, + {}, + ); +} diff --git a/src/src/utils/app/getMetricsSelectOptions.ts b/src/src/utils/app/getMetricsSelectOptions.ts new file mode 100644 index 00000000..ae02ab7a --- /dev/null +++ b/src/src/utils/app/getMetricsSelectOptions.ts @@ -0,0 +1,39 @@ +import _ from 'lodash-es'; + +import { MetricsValueKeyEnum } from 'config/enums/tableEnums'; + +import { IGroupingSelectOption } from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import { isSystemMetric } from 'utils/isSystemMetric'; + +import { getMetricHash } from './getMetricHash'; +import { getMetricLabel } from './getMetricLabel'; + +export function getMetricsSelectOptions( + metricsColumns: Record, + model: IModel, +): IGroupingSelectOption[] { + const metricsValueKey = + model.getState()?.config?.table.metricsValueKey || MetricsValueKeyEnum.LAST; + const metrics: IGroupingSelectOption[] = []; + const systemMetrics: IGroupingSelectOption[] = []; + Object.keys(metricsColumns).forEach((metricName: string) => { + Object.keys(metricsColumns[metricName]).forEach((metricContext: string) => { + const metricHash = getMetricHash(metricName, metricContext); + const metricLabel = getMetricLabel(metricName, metricContext); + const sortOption = { + group: 'metrics', + value: `metricsValues.${metricHash}.${metricsValueKey}`, + label: metricLabel, + }; + if (isSystemMetric(metricName)) { + systemMetrics.push(sortOption); + } else { + metrics.push(sortOption); + } + }); + }); + + return [..._.sortBy(metrics, 'label'), ..._.sortBy(systemMetrics, 'label')]; +} diff --git a/src/src/utils/app/getParamsSuggestions.ts b/src/src/utils/app/getParamsSuggestions.ts new file mode 100644 index 00000000..cccec21c --- /dev/null +++ b/src/src/utils/app/getParamsSuggestions.ts @@ -0,0 +1,24 @@ +import { IProjectsModelState } from 'types/services/models/projects/projectsModel'; + +/** + * @returns memoized params suggestions from projectsData + */ + +export function getParamsSuggestions(data: IProjectsModelState) { + let list: string[] = []; + if (data?.params) { + Object.keys(data?.params).forEach((option: any) => { + if (option) { + list.push(`run.${option}`); + if (data.params) { + if (data?.params[option]) { + Object.keys(data?.params[option]).forEach((subOption) => { + list.push(`run.${option}.${subOption}`); + }); + } + } + } + }); + } + return list; +} diff --git a/src/src/utils/app/getQueryStringFromSelect.ts b/src/src/utils/app/getQueryStringFromSelect.ts new file mode 100644 index 00000000..6c429bb2 --- /dev/null +++ b/src/src/utils/app/getQueryStringFromSelect.ts @@ -0,0 +1,54 @@ +import { ISyntaxErrorDetails } from 'types/components/NotificationContainer/NotificationContainer'; +import { ISelectConfig } from 'types/services/models/explorer/createAppModel'; + +import { jsValidVariableRegex } from 'utils/getObjectPaths'; + +import { formatValue } from '../formatValue'; + +export default function getQueryStringFromSelect( + selectData: ISelectConfig, + error?: ISyntaxErrorDetails, +) { + let query = '()'; + if (selectData === undefined) { + return query; + } + if (selectData.advancedMode) { + query = selectData.advancedQuery || ''; + } else { + const simpleInput = + selectData.query?.trim() && !error?.message + ? `(${selectData.query.trim()})` + : ''; + const selections = selectData.options?.length + ? `(${selectData.options + .map((option) => { + const metricName = option.value?.option_name.replaceAll('"', '\\"'); + return `(metric.name == "${metricName}"${ + option.value?.context === null + ? '' + : ' and ' + + Object.keys(option.value?.context) + .map((item) => { + const contextName = !jsValidVariableRegex.test(item) + ? `['${item.replaceAll('"', '\\"')}']` + : `.${item}`; + const value = (option.value?.context as any)[item]; + return `metric.context${contextName} == ${formatValue( + value, + )}`; + }) + .join(' and ') + })`; + }) + .join(' or ')})` + : ''; + + if (simpleInput && selections) { + query = `${simpleInput} and ${selections}`; + } else { + query = `${simpleInput}${selections}`; + } + } + return query.trim() || '()'; +} diff --git a/src/src/utils/app/getRunData.ts b/src/src/utils/app/getRunData.ts new file mode 100644 index 00000000..0a3ca933 --- /dev/null +++ b/src/src/utils/app/getRunData.ts @@ -0,0 +1,39 @@ +import { + IMetricTrace, + IParamTrace, + IRun, +} from 'types/services/models/metrics/runModel'; + +import { + decodePathsVals, + decodeBufferPairs, + iterFoldTree, +} from 'utils/encoder/streamEncoding'; + +import { IRequestProgress } from './setRequestProgress'; + +export default async function getRunData< + S extends ReadableStream[]>, +>(stream: S, setProgress?: (progress: IRequestProgress) => void) { + let bufferPairs = decodeBufferPairs(stream); + let decodedPairs = decodePathsVals(bufferPairs); + let objects = iterFoldTree(decodedPairs, 1); + + const runData = []; + + for await (let [keys, val] of objects) { + const data = { ...(val as any), hash: keys[0] }; + if (data.hash.startsWith('progress')) { + const { 0: checked, 1: trackedRuns } = data; + setProgress?.({ + matched: runData.length, + checked, + trackedRuns, + }); + } else { + runData.push(data); + } + } + + return runData; +} diff --git a/src/src/utils/app/getSelectOptions.ts b/src/src/utils/app/getSelectOptions.ts new file mode 100644 index 00000000..b3bb34c1 --- /dev/null +++ b/src/src/utils/app/getSelectOptions.ts @@ -0,0 +1,98 @@ +import _ from 'lodash-es'; + +import COLORS from 'config/colors/colors'; + +import { ISelectOption } from 'types/services/models/explorer/createAppModel'; +import { IProjectParamsMetrics } from 'types/services/models/projects/projectsModel'; + +import alphabeticalSortComparator from 'utils/alphabeticalSortComparator'; +import getObjectPaths from 'utils/getObjectPaths'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +import { getMetricHash } from './getMetricHash'; +import { getMetricLabel } from './getMetricLabel'; + +export default function getSelectOptions( + projectsData: IProjectParamsMetrics, + addHighLevelMetrics: boolean = false, +): ISelectOption[] { + const comparator = alphabeticalSortComparator({ + orderBy: 'label', + }); + let systemOptions: ISelectOption[] = []; + let params: ISelectOption[] = []; + let metrics: ISelectOption[] = []; + + if (projectsData?.metric) { + for (let metricName in projectsData.metric) { + const isSystem = isSystemMetric(metricName); + if (addHighLevelMetrics) { + const metricHash = getMetricHash(metricName, {}); + const metricLabel = getMetricLabel(metricName, {}); + let index: number = metrics.length; + let option: ISelectOption = { + label: metricLabel, + group: isSystem ? 'System' : metricName, + type: 'metrics', + color: COLORS[0][index % COLORS[0].length], + key: metricHash, + value: { + option_name: metricName, + context: null, + }, + }; + if (isSystem) { + systemOptions.push(option); + } else { + metrics.push(option); + } + } + for (let val of projectsData.metric[metricName]) { + if ((addHighLevelMetrics && !_.isEmpty(val)) || !addHighLevelMetrics) { + const metricHash = getMetricHash(metricName, val); + const metricLabel = getMetricLabel(metricName, val); + let index: number = metrics.length; + let option: ISelectOption = { + label: metricLabel, + group: isSystem ? 'System' : metricName, + type: 'metrics', + color: COLORS[0][index % COLORS[0].length], + key: metricHash, + value: { + option_name: metricName, + context: val, + }, + }; + if (isSystem) { + systemOptions.push(option); + } else { + metrics.push(option); + } + } + } + } + } + if (projectsData?.params && !addHighLevelMetrics) { + const paramPaths = getObjectPaths(projectsData.params, projectsData.params); + paramPaths.forEach((paramPath, index) => { + const indexOf = + paramPath.indexOf('.__example_type__') !== -1 || + paramPath[paramPath.length - 1] === '.' + ? paramPath.indexOf('.__example_type__') + : paramPath.length; + params.push({ + label: paramPath.slice(0, indexOf), + key: paramPath.slice(0, indexOf), + group: 'Params', + type: 'params', + color: COLORS[0][index % COLORS[0].length], + }); + }); + } + + params = params.sort(comparator); + metrics = metrics.sort(comparator); + systemOptions = systemOptions.sort(comparator); + + return [...metrics, ...params, ...systemOptions]; +} diff --git a/src/src/utils/app/getSystemMetricsFromColumns.ts b/src/src/utils/app/getSystemMetricsFromColumns.ts new file mode 100644 index 00000000..b398c884 --- /dev/null +++ b/src/src/utils/app/getSystemMetricsFromColumns.ts @@ -0,0 +1,78 @@ +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; + +import { isSystemMetric } from 'utils/isSystemMetric'; + +/** + * @param {ITableColumn[]} tableColumns an array of table columns, + * like `[{ + key: 'Loss_type="duration_loss"', + content: { + key: null, + ref: null, + props: { + size: 'small', + color: '#3E72E7', + label: 'type="duration_loss"', + }, + }, + topHeader: 'Loss', + pin: null, + isHidden: false, + }, + { + key: '__system__cpu', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'CPU (%)', + }, + }, + topHeader: 'System Metrics', + pin: null, + isHidden: true, + }]` + * @returns {Array} Array containing system metric keys or empty array + * @example + * getSystemMetricsFromColumns([{ + key: 'Loss_type="duration_loss"', + content: { + key: null, + ref: null, + props: { + size: 'small', + color: '#3E72E7', + label: 'type="duration_loss"', + }, + }, + topHeader: 'Loss', + pin: null, + isHidden: false, + }, { + key: '__system__cpu', + content: { + type: 'span', + key: null, + ref: null, + props: { + children: 'CPU (%)', + }, + }, + topHeader: 'System Metrics', + pin: null, + isHidden: true, + }]); // => ['__system__cpu'] + */ + +export default function getSystemMetricsFromColumns( + tableColumns: ITableColumn[], +): string[] | [] { + let arr: string[] = []; + tableColumns?.forEach(({ key }) => { + if (isSystemMetric(key)) { + arr.push(key); + } + }); + return arr; +} diff --git a/src/src/utils/app/isGroupingApplied.ts b/src/src/utils/app/isGroupingApplied.ts new file mode 100644 index 00000000..b81fca15 --- /dev/null +++ b/src/src/utils/app/isGroupingApplied.ts @@ -0,0 +1,30 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { IModel, State } from 'types/services/models/model'; + +import { getFilteredGroupingOptions } from './getFilteredGroupingOptions'; + +export default function isGroupingApplied( + model: IModel, +): boolean { + const groupByColor = getFilteredGroupingOptions({ + groupName: GroupNameEnum.COLOR, + model, + }); + const groupByStroke = getFilteredGroupingOptions({ + groupName: GroupNameEnum.STROKE, + model, + }); + const groupByChart = getFilteredGroupingOptions({ + groupName: GroupNameEnum.CHART, + model, + }); + if ( + groupByColor.length === 0 && + groupByStroke.length === 0 && + groupByChart.length === 0 + ) { + return false; + } + return true; +} diff --git a/src/src/utils/app/manageSystemMetricColumns.ts b/src/src/utils/app/manageSystemMetricColumns.ts new file mode 100644 index 00000000..aea04f37 --- /dev/null +++ b/src/src/utils/app/manageSystemMetricColumns.ts @@ -0,0 +1,29 @@ +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; +import { IModel, State } from 'types/services/models/model'; + +import getSystemMetricsFromColumns from './getSystemMetricsFromColumns'; + +export default function manageSystemMetricColumns( + model: IModel | any, +) { + const modelState = model.getState(); + const systemMetrics: string[] = getSystemMetricsFromColumns( + modelState?.tableColumns! as ITableColumn[], + ); + let hiddenColumns: string[] = [...modelState!.config!.table.hiddenColumns!]; + if ( + hiddenColumns.length === 0 && + systemMetrics.length > 0 && + modelState!.config!.table.hideSystemMetrics + ) { + hiddenColumns = systemMetrics; + + model.updateModelData({ + ...modelState.config, + table: { + ...modelState.config!.table, + hiddenColumns, + }, + }); + } +} diff --git a/src/src/utils/app/onAggregationConfigChange.ts b/src/src/utils/app/onAggregationConfigChange.ts new file mode 100644 index 00000000..be044da6 --- /dev/null +++ b/src/src/utils/app/onAggregationConfigChange.ts @@ -0,0 +1,63 @@ +import _ from 'lodash-es'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IAggregationConfig } from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { AggregationAreaMethods } from 'utils/aggregateGroupData'; + +export default function onAggregationConfigChange({ + aggregationConfig, + model, + appName, + updateModelData, +}: { + aggregationConfig: Partial; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.chart && !_.isEmpty(aggregationConfig)) { + configData.chart = { + ...configData.chart, + aggregationConfig: { + ...configData.chart.aggregationConfig, + ...aggregationConfig, + }, + }; + updateModelData(configData, true); + } + if (aggregationConfig.methods) { + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeAggregationMethod + } area to "${AggregationAreaMethods[ + aggregationConfig.methods.area + ].toLowerCase()}"`, + ); + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeAggregationMethod + } line to "${AggregationAreaMethods[ + aggregationConfig.methods.line + ].toLowerCase()}"`, + ); + } else { + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeAggregation + } to ${aggregationConfig.isApplied ? 'Enable' : 'Disable'}`, + ); + } +} diff --git a/src/src/utils/app/onAlignmentMetricChange.ts b/src/src/utils/app/onAlignmentMetricChange.ts new file mode 100644 index 00000000..ce153c5b --- /dev/null +++ b/src/src/utils/app/onAlignmentMetricChange.ts @@ -0,0 +1,129 @@ +import { AlignmentNotificationsEnum } from 'config/notification-messages/notificationMessages'; +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import * as analytics from 'services/analytics'; +import metricsService from 'services/api/metrics/metricsService'; + +import { IAlignMetricsDataParams } from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { AlignmentOptionsEnum } from '../d3'; + +import getRunData from './getRunData'; +import onNotificationAdd from './onNotificationAdd'; +import updateURL from './updateURL'; +import setRequestProgress from './setRequestProgress'; + +export default async function onAlignmentMetricChange({ + metric, + model, + appName, + updateModelData, + setModelData, +}: { + metric: string; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setModelData: any; +}) { + const modelState = model.getState(); + const configData = modelState?.config; + if (configData?.chart) { + configData.chart = { + ...configData.chart, + alignmentConfig: { metric, type: AlignmentOptionsEnum.CUSTOM_METRIC }, + axesScaleRange: CONTROLS_DEFAULT_CONFIG.metrics.axesScaleRange, + zoom: { ...configData.chart.zoom, history: [] }, + }; + + model.setState({ config: configData }); + updateURL({ configData, appName }); + } + if (modelState?.rawData && configData) { + model.setState({ requestStatus: RequestStatusEnum.Pending }); + const runs: Array<{ run_id: string; traces: any }> = + modelState.rawData?.map((item) => { + const traces = item.traces.map(({ context, name, slice }: any) => ({ + context, + name, + slice, + })); + return { + run_id: item.hash, + traces, + }; + }); + + const reqBody: IAlignMetricsDataParams = { + align_by: metric, + runs, + }; + try { + const stream = await metricsService + .fetchAlignedMetricsData(reqBody) + .call(); + const runData = await getRunData(stream, (progress) => + setRequestProgress(model, progress), + ); + let missingTraces = false; + const rawData: any = model.getState()?.rawData?.map((item, index) => { + return { + ...item, + traces: item.traces.map((trace: any, ind: number) => { + let x_axis_iters = runData[index]?.[ind]?.x_axis_iters || null; + let x_axis_values = runData[index]?.[ind]?.x_axis_iters || null; + if (!x_axis_iters || !x_axis_values) { + missingTraces = true; + } + let data = { + ...trace, + ...runData[index][ind], + }; + return data; + }), + }; + }); + if (missingTraces) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [AlignmentNotificationsEnum.NOT_ALL_ALIGNED], + }, + model, + }); + configData.chart = { + ...configData.chart, + alignmentConfig: { metric: '', type: AlignmentOptionsEnum.STEP }, + }; + model.setState({ requestStatus: RequestStatusEnum.BadRequest }); + } + setModelData(rawData, configData); + } catch (ex: any) { + if (ex.name === 'AbortError') { + // Abort Error + } else { + configData.chart = { + ...configData.chart, + alignmentConfig: { + metric, + type: AlignmentOptionsEnum.STEP, + }, + }; + model.setState({ requestStatus: RequestStatusEnum.BadRequest }); + updateModelData(configData, true); + } + } + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.changeXAxisProperties}, Align X axis by another metric`, + ); +} diff --git a/src/src/utils/app/onAlignmentTypeChange.ts b/src/src/utils/app/onAlignmentTypeChange.ts new file mode 100644 index 00000000..294c74c3 --- /dev/null +++ b/src/src/utils/app/onAlignmentTypeChange.ts @@ -0,0 +1,46 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { CONTROLS_DEFAULT_CONFIG } from 'config/controls/controlsDefaultConfig'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { AlignmentOptionsEnum } from '../d3'; + +export default function onAlignmentTypeChange({ + type, + model, + appName, + updateModelData, +}: { + type: AlignmentOptionsEnum; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.chart) { + const alignmentConfig = { ...configData.chart.alignmentConfig, type }; + + if (type !== AlignmentOptionsEnum.CUSTOM_METRIC) { + alignmentConfig.metric = ''; + } + configData.chart = { + ...configData.chart, + alignmentConfig, + axesScaleRange: CONTROLS_DEFAULT_CONFIG.metrics.axesScaleRange, + zoom: { ...configData.chart.zoom, history: [] }, + }; + updateModelData(configData, true); + } + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeXAxisProperties + }, Align X axis by "${type.toLowerCase()}"`, + ); +} diff --git a/src/src/utils/app/onAxesScaleRangeChange.ts b/src/src/utils/app/onAxesScaleRangeChange.ts new file mode 100644 index 00000000..dcf4a203 --- /dev/null +++ b/src/src/utils/app/onAxesScaleRangeChange.ts @@ -0,0 +1,48 @@ +import { IAxesScaleRange } from 'components/AxesPropsPopover'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; + +import updateURL from './updateURL'; + +const onAxesScaleRangeChange = ({ + range, + model, + appName, +}: { + range: Partial; + model: IModel; + appName: string; +}): void => { + let configData = model?.getState()?.config; + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + axesScaleRange: { + ...configData.chart.axesScaleRange, + yAxis: { + ...configData.chart.axesScaleRange.yAxis, + ...(range.yAxis || {}), + }, + xAxis: { + ...configData.chart.axesScaleRange.xAxis, + ...(range.xAxis || {}), + }, + }, + }, + }; + model.setState({ config: configData }); + updateURL({ configData, appName }); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.changeAxesScaleRange} to "${range.yAxis}"`, + ); +}; + +export default onAxesScaleRangeChange; diff --git a/src/src/utils/app/onAxesScaleTypeChange.ts b/src/src/utils/app/onAxesScaleTypeChange.ts new file mode 100644 index 00000000..20af8d2e --- /dev/null +++ b/src/src/utils/app/onAxesScaleTypeChange.ts @@ -0,0 +1,43 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IAxesScaleState } from 'types/components/AxesScalePopover/AxesScalePopover'; +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onAxesScaleTypeChange({ + args, + model, + appName, + updateModelData, +}: { + args: IAxesScaleState; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + let configData = model?.getState()?.config; + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + axesScaleType: args, + }, + }; + model.setState({ config: configData }); + updateModelData(configData, true); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.changeAxesScale} to "${args.xAxis}"`, + ); + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.changeAxesScale} to "${args.yAxis}"`, + ); +} diff --git a/src/src/utils/app/onAxisBrushExtentChange.ts b/src/src/utils/app/onAxisBrushExtentChange.ts new file mode 100644 index 00000000..1d7547ae --- /dev/null +++ b/src/src/utils/app/onAxisBrushExtentChange.ts @@ -0,0 +1,55 @@ +import _ from 'lodash-es'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onAxisBrushExtentChange({ + key, + extent, + chartIndex, + model, + updateModelData, +}: { + key: string; + extent: [number, number] | [string, string] | null; + chartIndex: number; + model: IModel; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.chart) { + let brushExtents: { + [key: string]: { + [key: string]: [number, number] | [string, string]; + }; + } = { + ...configData.chart.brushExtents, + }; + if (_.isNil(extent)) { + const chartBrushExtents = _.omit(brushExtents[chartIndex], key); + if (_.isEmpty(chartBrushExtents)) { + brushExtents = _.omit(brushExtents, chartIndex); + } else { + brushExtents = { + ...brushExtents, + [chartIndex]: chartBrushExtents, + }; + } + } else { + brushExtents = { + ...brushExtents, + [chartIndex]: { + ...brushExtents[chartIndex], + [key]: extent, + }, + }; + } + + configData.chart.brushExtents = brushExtents; + + updateModelData({ ...configData, chart: { ...configData?.chart } }, true); + } +} diff --git a/src/src/utils/app/onBookmarkCreate.ts b/src/src/utils/app/onBookmarkCreate.ts new file mode 100644 index 00000000..f36230e5 --- /dev/null +++ b/src/src/utils/app/onBookmarkCreate.ts @@ -0,0 +1,78 @@ +import { BookmarkNotificationsEnum } from 'config/notification-messages/notificationMessages'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; +import appsService from 'services/api/apps/appsService'; +import dashboardService from 'services/api/dashboard/dashboardService'; + +import { + IAppData, + IDashboardData, +} from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import exceptionHandler from './exceptionHandler'; +import onNotificationAdd from './onNotificationAdd'; + +export default async function onBookmarkCreate({ + name, + description, + model, + appName, +}: { + name: string; + description: string; + model: IModel; + appName: string; +}): Promise { + const configData = model?.getState()?.config; + try { + if (configData) { + const app: IAppData | any = await appsService + .createApp({ + state: configData, + type: appName.toLowerCase(), + }) + .call((detail: any) => { + exceptionHandler({ detail, model }); + }); + if (app.id) { + const bookmark: IDashboardData = await dashboardService + .createDashboard({ app_id: app.id, name, description }) + .call((detail: any) => { + exceptionHandler({ detail, model }); + }); + if (bookmark.name) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [BookmarkNotificationsEnum.CREATE], + }, + model, + }); + } else { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'error', + messages: [BookmarkNotificationsEnum.ERROR], + }, + model, + }); + } + } + } + } catch (err: any) { + onNotificationAdd({ + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + model, + }); + } + // @ts-ignore + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].createBookmark); +} diff --git a/src/src/utils/app/onBookmarkUpdate.ts b/src/src/utils/app/onBookmarkUpdate.ts new file mode 100644 index 00000000..6a936ec7 --- /dev/null +++ b/src/src/utils/app/onBookmarkUpdate.ts @@ -0,0 +1,51 @@ +import { BookmarkNotificationsEnum } from 'config/notification-messages/notificationMessages'; + +import appsService from 'services/api/apps/appsService'; + +import { IDashboardData } from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import exceptionHandler from './exceptionHandler'; +import onNotificationAdd from './onNotificationAdd'; + +export default function onBookmarkUpdate({ + id, + model, + appName, +}: { + id: string; + model: IModel; + appName: string; +}): void { + const configData = model.getState()?.config; + if (configData) { + try { + appsService + .updateApp(id, { state: configData, type: appName.toLowerCase() }) + .call((detail: any) => { + exceptionHandler({ detail, model }); + }) + .then((res: IDashboardData | any) => { + if (res.id) { + onNotificationAdd({ + notification: { + id: Date.now(), + severity: 'success', + messages: [BookmarkNotificationsEnum.UPDATE], + }, + model, + }); + } + }); + } catch (err: any) { + onNotificationAdd({ + model, + notification: { + id: Date.now(), + messages: [err.message], + severity: 'error', + }, + }); + } + } +} diff --git a/src/src/utils/app/onChangeTooltip.ts b/src/src/utils/app/onChangeTooltip.ts new file mode 100644 index 00000000..e0689ff0 --- /dev/null +++ b/src/src/utils/app/onChangeTooltip.ts @@ -0,0 +1,82 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import * as analytics from 'services/analytics'; + +import { + IMetricsCollection, + ITooltip, +} from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import getTooltipContent from 'utils/getTooltipContent'; + +import updateURL from './updateURL'; + +export default function onChangeTooltip({ + tooltip, + groupingNames, + model, + appName, +}: { + tooltip: Partial; + groupingNames: GroupNameEnum[]; + model: IModel; + appName: string; +}): void { + let { + config: configData, + data, + groupingSelectOptions = [], + } = model.getState(); + + if (configData?.chart) { + // TODO remove this later + // remove unnecessary content prop from tooltip config + if (configData.chart.tooltip?.hasOwnProperty('content')) { + delete configData.chart.tooltip.content; + } + + configData = { + ...configData, + chart: { + ...configData.chart, + tooltip: { + ...configData.chart.tooltip, + ...tooltip, + }, + }, + }; + + const tooltipData = { + ...configData?.chart?.tooltip, + content: getTooltipContent({ + groupingNames, + groupingSelectOptions, + data: data as IMetricsCollection[], + configData, + activePointKey: configData.chart?.focusedState?.key, + selectedFields: configData.chart?.tooltip?.selectedFields, + }), + }; + model.setState({ config: configData, tooltip: tooltipData }); + updateURL({ configData, appName }); + if (tooltip.appearance) { + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.tooltip.appearance} ${tooltip.appearance}`, + ); + } else if (tooltip.selectedFields) { + analytics.trackEvent( + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.tooltip + .changeTooltipDisplay, + ); + } else if (tooltip.hasOwnProperty('display')) { + analytics.trackEvent( + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.tooltip.display, + ); + } + } +} diff --git a/src/src/utils/app/onChangeTrendlineOptions.ts b/src/src/utils/app/onChangeTrendlineOptions.ts new file mode 100644 index 00000000..40d2c50d --- /dev/null +++ b/src/src/utils/app/onChangeTrendlineOptions.ts @@ -0,0 +1,40 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { ITrendlineOptions } from 'types/services/models/scatter/scatterAppModel'; + +import updateURL from './updateURL'; + +export default function onChangeTrendlineOptions({ + trendlineOptions, + model, + appName, +}: { + trendlineOptions: Partial; + model: IModel; + appName: string; +}): void { + let configData = model.getState()?.config; + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + trendlineOptions: { + ...configData.chart.trendlineOptions, + ...trendlineOptions, + }, + }, + }; + + model.setState({ config: configData }); + updateURL({ configData, appName }); + } + + analytics.trackEvent( + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeTrendlineOptions, + ); +} diff --git a/src/src/utils/app/onColorIndicatorChange.ts b/src/src/utils/app/onColorIndicatorChange.ts new file mode 100644 index 00000000..49233ae8 --- /dev/null +++ b/src/src/utils/app/onColorIndicatorChange.ts @@ -0,0 +1,34 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onColorIndicatorChange({ + model, + appName, + updateModelData, +}: { + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.chart) { + const chart = { ...configData.chart }; + chart.isVisibleColorIndicator = !configData.chart.isVisibleColorIndicator; + updateModelData({ ...configData, chart }, true); + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeColorIndicatorMode + } to ${ + configData.chart.isVisibleColorIndicator ? 'Disable' : 'Enable' + } color indicator`, + ); + } +} diff --git a/src/src/utils/app/onColumnsOrderChange.ts b/src/src/utils/app/onColumnsOrderChange.ts new file mode 100644 index 00000000..5785b95c --- /dev/null +++ b/src/src/utils/app/onColumnsOrderChange.ts @@ -0,0 +1,45 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onColumnsOrderChange({ + columnsOrder, + model, + appName, + updateModelData, +}: { + columnsOrder: any; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + columnsOrder: columnsOrder, + }; + const config = { + ...configData, + table, + }; + + model.setState({ + config, + }); + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } + + // @ts-ignore + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.changeColumnOrder); +} diff --git a/src/src/utils/app/onColumnsVisibilityChange.ts b/src/src/utils/app/onColumnsVisibilityChange.ts new file mode 100644 index 00000000..8f8c8fcc --- /dev/null +++ b/src/src/utils/app/onColumnsVisibilityChange.ts @@ -0,0 +1,89 @@ +import _ from 'lodash-es'; + +import { HideColumnsEnum } from 'config/enums/tableEnums'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { AVOID_COLUMNS_TO_HIDE_LIST } from 'config/table/tableConfigs'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; +import { ITableColumn } from 'types/pages/metrics/components/TableColumns/TableColumns'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +import getSystemMetricsFromColumns from './getSystemMetricsFromColumns'; +import getFilteredSystemMetrics from './getFilteredSystemMetrics'; + +export default function onColumnsVisibilityChange({ + hiddenColumns, + model, + appName, + updateModelData, +}: { + hiddenColumns: string[] | string; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + const columnsData = model.getState()!.tableColumns!; + const systemMetrics: string[] = getSystemMetricsFromColumns( + columnsData as ITableColumn[], + ); + + let columnKeys: string[] = Array.isArray(hiddenColumns) + ? [...hiddenColumns] + : []; + let hideSystemMetrics: boolean | undefined = + configData?.table.hideSystemMetrics; + + if (configData?.table) { + const filteredFromSystem = getFilteredSystemMetrics( + configData?.table?.hiddenColumns, + true, + ); + if (hiddenColumns === HideColumnsEnum.HideSystemMetrics) { + columnKeys = [...filteredFromSystem, ...systemMetrics]; + } + if (hiddenColumns === HideColumnsEnum.ShowSystemMetrics) { + columnKeys = [...filteredFromSystem]; + } + + if (hideSystemMetrics !== undefined) { + hideSystemMetrics = + getFilteredSystemMetrics(columnKeys).length === systemMetrics.length; + } + columnKeys = + hiddenColumns === HideColumnsEnum.All + ? columnsData.map( + (col) => !AVOID_COLUMNS_TO_HIDE_LIST.has(col.key) && col.key, + ) + : columnKeys; + + const table = { + ...configData.table, + hiddenColumns: columnKeys, + hideSystemMetrics, + }; + + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } + if (hiddenColumns[0] === 'all') { + // @ts-ignore + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.showAllColumns); + } else if (_.isEmpty(hiddenColumns)) { + // @ts-ignore + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.hideAllColumns); + } +} diff --git a/src/src/utils/app/onCurveInterpolationChange.ts b/src/src/utils/app/onCurveInterpolationChange.ts new file mode 100644 index 00000000..a854de58 --- /dev/null +++ b/src/src/utils/app/onCurveInterpolationChange.ts @@ -0,0 +1,44 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { CurveEnum } from 'utils/d3'; + +export default function onCurveInterpolationChange({ + model, + appName, + updateModelData, +}: { + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.chart) { + const chart = { ...configData.chart }; + chart.curveInterpolation = + configData.chart.curveInterpolation === CurveEnum.Linear + ? CurveEnum.MonotoneX + : CurveEnum.Linear; + + updateModelData({ ...configData, chart }, true); + + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls + .changeCurveInterpolationMode + } to "${ + configData.chart.curveInterpolation === CurveEnum.Linear + ? 'cubic' + : 'linear' + }"`, + ); + } +} diff --git a/src/src/utils/app/onDensityTypeChange.ts b/src/src/utils/app/onDensityTypeChange.ts new file mode 100644 index 00000000..cb895fdc --- /dev/null +++ b/src/src/utils/app/onDensityTypeChange.ts @@ -0,0 +1,45 @@ +import { DensityOptions } from 'config/enums/densityEnum'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; + +import exceptionHandler from './exceptionHandler'; + +export default async function onDensityTypeChange({ + type, + model, + appName, + getMetricsData, +}: { + type: DensityOptions; + model: IModel; + appName: string; + getMetricsData: (shouldUrlUpdate?: boolean) => { + call: (detail: any) => Promise; + abort: () => void; + }; +}): Promise { + const modelState = model.getState(); + let configData = modelState?.config; + if (configData?.chart) { + configData = { + ...configData, + chart: { + ...configData.chart, + densityType: type, + }, + }; + model.setState({ config: configData }); + } + getMetricsData(true).call((detail: any) => { + exceptionHandler({ model, detail }); + }); + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeXAxisProperties + }, Set point density to "${DensityOptions[type].toLowerCase()}"`, + ); +} diff --git a/src/src/utils/app/onGroupingApplyChange.ts b/src/src/utils/app/onGroupingApplyChange.ts new file mode 100644 index 00000000..6c72f838 --- /dev/null +++ b/src/src/utils/app/onGroupingApplyChange.ts @@ -0,0 +1,36 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onGroupingApplyChange({ + groupName, + model, + appName, + updateModelData, + setAggregationEnabled, +}: { + groupName: GroupNameEnum; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setAggregationEnabled?: any; +}): void { + const configData = model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { + ...configData.grouping, + isApplied: { + ...configData.grouping.isApplied, + [groupName]: !configData.grouping.isApplied[groupName], + }, + }; + if (typeof setAggregationEnabled === 'function') { + setAggregationEnabled({ model, appName }); + } + updateModelData(configData, true); + } +} diff --git a/src/src/utils/app/onGroupingModeChange.ts b/src/src/utils/app/onGroupingModeChange.ts new file mode 100644 index 00000000..6bcd32bf --- /dev/null +++ b/src/src/utils/app/onGroupingModeChange.ts @@ -0,0 +1,49 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import resetChartZoom from './resetChartZoom'; + +export default function onGroupingModeChange({ + groupName, + value, + model, + appName, + updateModelData, + setAggregationEnabled, +}: { + groupName: GroupNameEnum; + value: boolean; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setAggregationEnabled?: any; +}): void { + const configData = model?.getState()?.config; + if (configData?.grouping) { + configData.grouping.reverseMode = { + ...configData.grouping.reverseMode, + [groupName]: value, + }; + if (groupName === 'chart') { + resetChartZoom({ configData, appName }); + } + if (typeof setAggregationEnabled === 'function') { + setAggregationEnabled({ model, appName }); + } + updateModelData(configData, true); + } + if (value) { + analytics.trackEvent( + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].groupings[groupName].modeChange, + ); + } +} diff --git a/src/src/utils/app/onGroupingPaletteChange.ts b/src/src/utils/app/onGroupingPaletteChange.ts new file mode 100644 index 00000000..ac77c2e3 --- /dev/null +++ b/src/src/utils/app/onGroupingPaletteChange.ts @@ -0,0 +1,41 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onGroupingPaletteChange({ + index, + model, + appName, + updateModelData, + setAggregationEnabled, +}: { + index: number; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setAggregationEnabled?: any; +}): void { + const configData = model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { + ...configData.grouping, + paletteIndex: index, + }; + if (typeof setAggregationEnabled === 'function') { + setAggregationEnabled({ model, appName }); + } + updateModelData(configData, true); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].groupings.color.paletteChange} to "${ + index === 0 ? '8 distinct colors' : '24 colors' + }"`, + ); +} diff --git a/src/src/utils/app/onGroupingPersistenceChange.ts b/src/src/utils/app/onGroupingPersistenceChange.ts new file mode 100644 index 00000000..ce160b15 --- /dev/null +++ b/src/src/utils/app/onGroupingPersistenceChange.ts @@ -0,0 +1,47 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onGroupingPersistenceChange({ + groupName, + model, + appName, + updateModelData, + setAggregationEnabled, +}: { + groupName: GroupNameEnum; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setAggregationEnabled?: any; +}): void { + const configData = model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { + ...configData.grouping, + persistence: { + ...configData.grouping.persistence, + [groupName]: !configData.grouping.persistence[groupName], + }, + }; + if (typeof setAggregationEnabled === 'function') { + setAggregationEnabled({ model, appName }); + } + updateModelData(configData, true); + } + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].groupings[groupName].persistenceChange + } to ${ + !configData?.grouping.persistence[groupName] ? 'Disable' : 'Enable' + }`, + ); +} diff --git a/src/src/utils/app/onGroupingReset.ts b/src/src/utils/app/onGroupingReset.ts new file mode 100644 index 00000000..6c0e3a3c --- /dev/null +++ b/src/src/utils/app/onGroupingReset.ts @@ -0,0 +1,39 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onGroupingReset({ + groupName, + model, + appName, + updateModelData, + setAggregationEnabled, +}: { + groupName: GroupNameEnum; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setAggregationEnabled?: any; +}) { + const configData = model.getState()?.config; + if (configData?.grouping) { + const { reverseMode, paletteIndex, isApplied, persistence } = + configData.grouping; + configData.grouping = { + ...configData.grouping, + reverseMode: { ...reverseMode, [groupName]: false }, + [groupName]: [], + paletteIndex: groupName === 'color' ? 0 : paletteIndex, + persistence: { ...persistence, [groupName]: false }, + isApplied: { ...isApplied, [groupName]: true }, + }; + if (typeof setAggregationEnabled === 'function') { + setAggregationEnabled({ model, appName }); + } + updateModelData(configData, true); + } +} diff --git a/src/src/utils/app/onGroupingSelectChange.ts b/src/src/utils/app/onGroupingSelectChange.ts new file mode 100644 index 00000000..92f6f8c5 --- /dev/null +++ b/src/src/utils/app/onGroupingSelectChange.ts @@ -0,0 +1,39 @@ +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import resetChartZoom from './resetChartZoom'; + +export default function onGroupingSelectChange({ + groupName, + list, + model, + appName, + updateModelData, + setAggregationEnabled, +}: { + groupName: GroupNameEnum; + list: string[]; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + setAggregationEnabled?: any; +}) { + let configData = model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { ...configData.grouping, [groupName]: list }; + configData = resetChartZoom({ configData, appName }); + if (typeof setAggregationEnabled === 'function') { + setAggregationEnabled({ model, appName }); + } + updateModelData(configData, true); + } + analytics.trackEvent(`[${appName}Explorer] Group by ${groupName}`); + // doesnt need additional key for tracking, just didnt removed this line +} diff --git a/src/src/utils/app/onHighlightModeChange.ts b/src/src/utils/app/onHighlightModeChange.ts new file mode 100644 index 00000000..f909d0e7 --- /dev/null +++ b/src/src/utils/app/onHighlightModeChange.ts @@ -0,0 +1,39 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; + +import { HighlightEnum } from 'utils/d3'; + +import updateURL from './updateURL'; + +export default function onHighlightModeChange({ + mode, + model, + appName, +}: { + mode: HighlightEnum; + model: IModel; + appName: string; +}): void { + const config = model.getState()?.config; + if (config?.chart) { + const configData = { + ...config, + chart: { + ...config.chart, + highlightMode: mode, + }, + }; + model.setState({ config: configData }); + + updateURL({ configData, appName }); + } + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls.changeHighlightMode + } to "${HighlightEnum[mode].toLowerCase()}"`, + ); +} diff --git a/src/src/utils/app/onIgnoreOutliersChange.ts b/src/src/utils/app/onIgnoreOutliersChange.ts new file mode 100644 index 00000000..8dc210b3 --- /dev/null +++ b/src/src/utils/app/onIgnoreOutliersChange.ts @@ -0,0 +1,37 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +/** + * + * @param {IModel} model - instance of createModel + */ + +export default function onIgnoreOutliersChange({ + model, + updateModelData, + appName, +}: { + model: IModel; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + appName: string; +}): void { + const configData = model.getState()?.config; + if (configData?.chart) { + configData.chart.ignoreOutliers = !configData?.chart.ignoreOutliers; + updateModelData(configData, true); + model.setState({ config: configData }); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.changeOutliers} to ${ + !configData?.chart.ignoreOutliers ? 'Ignore' : 'Display' + }`, + ); +} diff --git a/src/src/utils/app/onLegendsChange.ts b/src/src/utils/app/onLegendsChange.ts new file mode 100644 index 00000000..a92ed22f --- /dev/null +++ b/src/src/utils/app/onLegendsChange.ts @@ -0,0 +1,58 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { LegendsConfig } from 'types/services/models/metrics/metricsAppModel'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +/** + * onLegendsChange - handler for legends config change + * + * @param {IModel} model - instance of createModel + * @param {LegendsConfig} legends - legends config + * @param {string} appName - name of the app model + */ + +export default function onLegendsChange({ + model, + legends, + updateModelData, + appName, +}: { + model: IModel; + legends: Partial; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.chart) { + configData.chart = { + ...configData.chart, + legends: { + ...configData.chart.legends, + ...legends, + }, + }; + updateModelData(configData, true); + model.setState({ config: configData }); + } + if (legends?.mode) { + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.legends.mode} to ${configData?.chart.legends.mode}`, + ); + } + + if (legends?.display) { + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.legends.display} to ${ + configData?.chart.legends.display ? 'visible' : 'hidden' + }`, + ); + } +} diff --git a/src/src/utils/app/onMetricsValueKeyChange.ts b/src/src/utils/app/onMetricsValueKeyChange.ts new file mode 100644 index 00000000..bd9e4820 --- /dev/null +++ b/src/src/utils/app/onMetricsValueKeyChange.ts @@ -0,0 +1,46 @@ +import { MetricsValueKeyEnum } from 'config/enums/tableEnums'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onMetricsValueKeyChange({ + metricsValueKey, + model, + appName, + updateModelData, +}: { + metricsValueKey: MetricsValueKeyEnum; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + metricsValueKey, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].table.changeMetricsValueKey + } to "${metricsValueKey}"`, + ); +} diff --git a/src/src/utils/app/onMetricsVisibilityChange.ts b/src/src/utils/app/onMetricsVisibilityChange.ts new file mode 100644 index 00000000..c4825e0e --- /dev/null +++ b/src/src/utils/app/onMetricsVisibilityChange.ts @@ -0,0 +1,57 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onMetricVisibilityChange({ + metricsKeys, + model, + appName, + updateModelData, +}: { + metricsKeys: string[]; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + const processedData = model.getState()?.data; + if (configData?.table && processedData) { + const table = { + ...configData.table, + hiddenMetrics: + metricsKeys[0] === 'all' + ? Object.values(processedData) + .map((metricCollection) => + metricCollection.data.map( + (metric: Record) => metric.key, + ), + ) + .flat() + : metricsKeys, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].table.metricVisibilityChange} / ${ + metricsKeys[0] === 'all' + ? 'Visualize all hidden metrics from table' + : 'Hide all metrics from table' + }`, + ); +} diff --git a/src/src/utils/app/onNotificationAdd.ts b/src/src/utils/app/onNotificationAdd.ts new file mode 100644 index 00000000..3a807daa --- /dev/null +++ b/src/src/utils/app/onNotificationAdd.ts @@ -0,0 +1,16 @@ +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { IModel, State } from 'types/services/models/model'; + +import onNotificationDelete from './onNotificationDelete'; + +export default function onNotificationAdd< + M extends State, + N extends INotification, +>({ notification, model }: { notification: N; model: IModel }): void { + let notifyData: INotification[] | [] = model.getState()?.notifyData || []; + notifyData = [...notifyData, notification]; + model.setState({ notifyData }); + setTimeout(() => { + onNotificationDelete({ id: notification.id, model }); + }, notification.closeDelay ?? 3000); +} diff --git a/src/src/utils/app/onNotificationDelete.ts b/src/src/utils/app/onNotificationDelete.ts new file mode 100644 index 00000000..a0b18345 --- /dev/null +++ b/src/src/utils/app/onNotificationDelete.ts @@ -0,0 +1,14 @@ +import { IModel, State } from 'types/services/models/model'; +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; + +export default function onNotificationDelete({ + id, + model, +}: { + id: number; + model: IModel; +}): void { + let notifyData: INotification[] | [] = model.getState()?.notifyData || []; + notifyData = [...notifyData].filter((i) => i.id !== id); + model.setState({ notifyData }); +} diff --git a/src/src/utils/app/onParamsVisibilityChange.ts b/src/src/utils/app/onParamsVisibilityChange.ts new file mode 100644 index 00000000..b8e93ec8 --- /dev/null +++ b/src/src/utils/app/onParamsVisibilityChange.ts @@ -0,0 +1,52 @@ +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onParamVisibilityChange({ + metricsKeys, + model, + appName, + updateModelData, +}: { + metricsKeys: string[]; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig, + shouldURLUpdate?: boolean, + ) => void; +}) { + const configData = model.getState()?.config; + const processedData = model.getState()?.data; + if (configData?.table && processedData) { + const table = { + ...configData.table, + hiddenMetrics: + metricsKeys[0] === 'all' + ? Object.values(processedData) + .map((metricCollection) => + metricCollection.data.map((metric: any) => metric.key), + ) + .flat() + : metricsKeys, + }; + const configUpdate = { + ...configData, + table, + }; + model.setState({ config: configUpdate }); + setItem(`${appName.toLowerCase()}Table`, encode(table)); + updateModelData(configUpdate); + } + analytics.trackEvent( + `[${appName}Explorer][Table] ${ + metricsKeys[0] === 'all' + ? 'Visualize all hidden metrics from table' + : 'Hide all metrics from table' + }`, + ); +} diff --git a/src/src/utils/app/onResetConfigData.ts b/src/src/utils/app/onResetConfigData.ts new file mode 100644 index 00000000..b69798c5 --- /dev/null +++ b/src/src/utils/app/onResetConfigData.ts @@ -0,0 +1,24 @@ +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onResetConfigData({ + model, + getConfig, + updateModelData, +}: { + model: IModel; + getConfig: () => any; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData) { + configData.grouping = { + ...getConfig().grouping, + }; + configData.chart = { ...getConfig().chart }; + updateModelData(configData, true); + } +} diff --git a/src/src/utils/app/onRowHeightChange.ts b/src/src/utils/app/onRowHeightChange.ts new file mode 100644 index 00000000..331c39c7 --- /dev/null +++ b/src/src/utils/app/onRowHeightChange.ts @@ -0,0 +1,40 @@ +import { RowHeightEnum } from 'config/enums/tableEnums'; +import { RowHeightSize } from 'config/table/tableConfigs'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onRowHeightChange({ + height, + model, + appName, +}: { + height: RowHeightSize; + model: IModel; + appName: string; +}): void { + const configData = model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + rowHeight: height, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + } + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].table.changeTableRowHeight + } to "${RowHeightEnum[height].toLowerCase()}"`, + ); +} diff --git a/src/src/utils/app/onRowSelect.ts b/src/src/utils/app/onRowSelect.ts new file mode 100644 index 00000000..e6f98c19 --- /dev/null +++ b/src/src/utils/app/onRowSelect.ts @@ -0,0 +1,100 @@ +import _ from 'lodash-es'; + +import { IModel, State } from 'types/services/models/model'; + +/** + * + * @param {string} key - key of table column + * @param {any} data - nested data + * @param {string} actionType - action type name + * @param {IModel} model - instance of create model + */ + +export interface IRowSelectProps { + actionType: 'single' | 'selectAll' | 'removeAll'; + data?: any; + model: IModel; +} + +export default function onRowSelect({ + actionType, + data, + model, +}: IRowSelectProps): any { + let selectedRows = model.getState()?.selectedRows || {}; + let rawData = + model.getState()?.rawData?.reduce((acc: any, item: any) => { + acc[item.hash] = { + runHash: item.hash, + ...item.props, + }; + return acc; + }, {}) || {}; + switch (actionType) { + case 'single': + if (selectedRows[data.selectKey]) { + selectedRows = _.omit(selectedRows, [data.selectKey]); + } else { + selectedRows[data.selectKey] = { + selectKey: data.selectKey, + isHidden: data.isHidden, + key: data.key, + ...rawData[sliceRunHash(data.selectKey)], + }; + } + break; + case 'selectAll': + if (Array.isArray(data)) { + data.forEach((item: any) => { + if (!selectedRows[item.selectKey]) { + selectedRows[item.selectKey] = { + selectKey: item.selectKey, + isHidden: item.isHidden, + key: item.key, + ...rawData[sliceRunHash(item.selectKey)], + }; + } + }); + } else { + Object.values(data) + .reduce((acc: any[], value: any) => { + return acc.concat(value.items); + }, []) + .forEach((item: any) => { + if (!selectedRows[item.selectKey]) { + selectedRows[item.selectKey] = { + selectKey: item.selectKey, + isHidden: item.isHidden, + key: item.key, + ...rawData[sliceRunHash(item.selectKey)], + }; + } + }); + } + + break; + case 'removeAll': + if (Array.isArray(data)) { + const hashArray: string[] = data.map((item: any) => item.selectKey); + selectedRows = _.omit(selectedRows, hashArray); + } else { + const hashArray: string[] = Object.values(data) + .reduce((acc: any[], value: any) => { + return acc.concat(value.items); + }, []) + .map((item: any) => item.selectKey); + selectedRows = _.omit(selectedRows, hashArray); + } + + break; + } + + model.setState({ + selectedRows: { ...selectedRows }, + }); + return selectedRows; +} + +function sliceRunHash(key: string): string { + return key.slice(0, key.indexOf('/')); +} diff --git a/src/src/utils/app/onRowVisibilityChange.ts b/src/src/utils/app/onRowVisibilityChange.ts new file mode 100644 index 00000000..c6fc6a03 --- /dev/null +++ b/src/src/utils/app/onRowVisibilityChange.ts @@ -0,0 +1,43 @@ +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onRowVisibilityChange({ + metricKey, + model, + appName, + updateModelData, +}: { + metricKey: string; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}) { + const configData = model.getState()?.config; + if (configData?.table) { + let hiddenMetrics = configData?.table?.hiddenMetrics || []; + if (hiddenMetrics?.includes(metricKey)) { + hiddenMetrics = hiddenMetrics.filter( + (hiddenMetric: string) => hiddenMetric !== metricKey, + ); + } else { + hiddenMetrics = [...hiddenMetrics, metricKey]; + } + const table = { + ...configData.table, + hiddenMetrics, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } +} diff --git a/src/src/utils/app/onRowsVisibilityChange.ts b/src/src/utils/app/onRowsVisibilityChange.ts new file mode 100644 index 00000000..18d462b9 --- /dev/null +++ b/src/src/utils/app/onRowsVisibilityChange.ts @@ -0,0 +1,45 @@ +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +export default function onRowVisibilityChange({ + metricKeys, + model, + appName, + updateModelData, +}: { + metricKeys: string[]; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}) { + const configData = model.getState()?.config; + if (configData?.table) { + let hiddenMetrics = [...configData?.table?.hiddenMetrics] || []; + metricKeys.forEach((metricKey) => { + if (hiddenMetrics?.includes(metricKey)) { + hiddenMetrics = hiddenMetrics.filter( + (hiddenMetric: string) => hiddenMetric !== metricKey, + ); + } else { + hiddenMetrics = [...hiddenMetrics, metricKey]; + } + }); + const table = { + ...configData.table, + hiddenMetrics, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } +} diff --git a/src/src/utils/app/onRunsTagsChange.ts b/src/src/utils/app/onRunsTagsChange.ts new file mode 100644 index 00000000..369bcb9b --- /dev/null +++ b/src/src/utils/app/onRunsTagsChange.ts @@ -0,0 +1,34 @@ +import { ITagInfo } from 'types/pages/tags/Tags'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; +import { IModel, State } from 'types/services/models/model'; + +export default function onRunsTagsChange({ + tags, + runHash, + model, + updateModelData, +}: { + tags: ITagInfo[]; + runHash: string; + model: IModel; + updateModelData: ( + configData?: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}) { + const data = model.getState()?.rawData; + const resultData = data?.map((item: any) => { + if (item.hash === runHash) { + return { + ...item, + props: { + ...item.props, + tags, + }, + }; + } + return item; + }); + model.setState({ rawData: resultData }); + updateModelData(); +} diff --git a/src/src/utils/app/onSearchQueryCopy.ts b/src/src/utils/app/onSearchQueryCopy.ts new file mode 100644 index 00000000..c8cb3a7c --- /dev/null +++ b/src/src/utils/app/onSearchQueryCopy.ts @@ -0,0 +1,21 @@ +import { IModel, State } from 'types/services/models/model'; + +import { onCopyToClipBoard } from 'utils/onCopyToClipBoard'; + +import onNotificationAdd from './onNotificationAdd'; +import getQueryStringFromSelect from './getQueryStringFromSelect'; + +function onSearchQueryCopy(model: IModel): void { + const selectedMetricsData = model.getState()?.config?.select; + let query = getQueryStringFromSelect(selectedMetricsData); + onCopyToClipBoard(query, false, () => onNotificationAdd, { + notification: { + id: Date.now(), + severity: 'success', + messages: ['Run Expression Copied'], + }, + model, + }); +} + +export default onSearchQueryCopy; diff --git a/src/src/utils/app/onSelectAdvancedQueryChange.ts b/src/src/utils/app/onSelectAdvancedQueryChange.ts new file mode 100644 index 00000000..5f644099 --- /dev/null +++ b/src/src/utils/app/onSelectAdvancedQueryChange.ts @@ -0,0 +1,19 @@ +import { IModel, State } from 'types/services/models/model'; + +export default function onSelectAdvancedQueryChange({ + query, + model, +}: { + query: string; + model: IModel; +}) { + const configData = model.getState()?.config; + if (configData?.select) { + const newConfig = { + ...configData, + select: { ...configData.select, advancedQuery: query }, + }; + + model.setState({ config: newConfig }); + } +} diff --git a/src/src/utils/app/onSelectOptionsChange.ts b/src/src/utils/app/onSelectOptionsChange.ts new file mode 100644 index 00000000..59e9e9a3 --- /dev/null +++ b/src/src/utils/app/onSelectOptionsChange.ts @@ -0,0 +1,17 @@ +import { IModel, State } from 'types/services/models/model'; +import { ISelectOption } from 'types/services/models/explorer/createAppModel'; + +export default function onSelectOptionsChange< + M extends State, + D extends Partial, +>({ data, model }: { data: D; model: IModel }) { + const configData = model.getState()?.config; + if (configData?.select) { + const newConfig = { + ...configData, + select: { ...configData.select, options: data }, + }; + + model.setState({ config: newConfig }); + } +} diff --git a/src/src/utils/app/onSelectRunQueryChange.ts b/src/src/utils/app/onSelectRunQueryChange.ts new file mode 100644 index 00000000..bbf785c7 --- /dev/null +++ b/src/src/utils/app/onSelectRunQueryChange.ts @@ -0,0 +1,19 @@ +import { IModel, State } from 'types/services/models/model'; + +export default function onSelectRunQueryChange({ + query, + model, +}: { + query: string; + model: IModel; +}) { + const configData = model.getState()?.config; + if (configData?.select) { + const newConfig = { + ...configData, + select: { ...configData.select, query }, + }; + + model.setState({ config: newConfig }); + } +} diff --git a/src/src/utils/app/onShuffleChange.ts b/src/src/utils/app/onShuffleChange.ts new file mode 100644 index 00000000..9076451b --- /dev/null +++ b/src/src/utils/app/onShuffleChange.ts @@ -0,0 +1,27 @@ +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onShuffleChange({ + name, + model, + updateModelData, +}: { + name: 'color' | 'stroke'; + model: IModel; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}) { + const configData = model.getState()?.config; + if (configData?.grouping) { + configData.grouping = { + ...configData.grouping, + seed: { + ...configData.grouping.seed, + [name]: configData.grouping.seed[name] + 1, + }, + }; + updateModelData(configData, true); + } +} diff --git a/src/src/utils/app/onSmoothingChange.ts b/src/src/utils/app/onSmoothingChange.ts new file mode 100644 index 00000000..449dbed0 --- /dev/null +++ b/src/src/utils/app/onSmoothingChange.ts @@ -0,0 +1,53 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; +import { ISmoothing } from 'types/services/models/metrics/metricsAppModel'; + +import { CurveEnum } from 'utils/d3'; + +export default function onSmoothingChange({ + args, + model, + appName, + updateModelData, +}: { + args: Partial; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model?.getState()?.config; + if (configData?.chart) { + configData.chart = { + ...configData.chart, + smoothing: { + ...configData.chart.smoothing, + ...args, + }, + }; + updateModelData(configData, true); + } + if (args.curveInterpolation) { + analytics.trackEvent( + `${ + // @ts-ignore + ANALYTICS_EVENT_KEYS[appName].chart.controls + .changeCurveInterpolationMode + } to "${ + args.curveInterpolation === CurveEnum.Linear ? 'linear' : 'cubic' + }"`, + ); + } else { + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.selectSmoothingOptions} to "${configData?.chart.smoothing.algorithm}"`, + { smoothingFactor: configData?.chart.smoothing.factor }, + ); + } +} diff --git a/src/src/utils/app/onSortFieldsChange.ts b/src/src/utils/app/onSortFieldsChange.ts new file mode 100644 index 00000000..8902991d --- /dev/null +++ b/src/src/utils/app/onSortFieldsChange.ts @@ -0,0 +1,42 @@ +import { isEmpty } from 'lodash-es'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +export default function onSortFieldsChange({ + sortFields, + model, + appName, + updateModelData, +}: { + sortFields: [string, any][]; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}) { + const configData = model.getState()?.config; + if (configData?.table) { + const configUpdate = { + ...configData, + table: { + ...configData.table, + sortFields: sortFields, + }, + }; + model.setState({ config: configUpdate }); + updateModelData(configUpdate); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].table.changeSorting} ${ + isEmpty(sortFields) ? 'Reset' : 'Apply' + } table sorting by a key`, + ); +} diff --git a/src/src/utils/app/onTableDiffShow.ts b/src/src/utils/app/onTableDiffShow.ts new file mode 100644 index 00000000..a75ac019 --- /dev/null +++ b/src/src/utils/app/onTableDiffShow.ts @@ -0,0 +1,33 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import onColumnsVisibilityChange from './onColumnsVisibilityChange'; + +export function onTableDiffShow({ + model, + appName, + updateModelData, +}: { + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const sameValueColumns = model.getState()?.sameValueColumns; + if (sameValueColumns && typeof onColumnsVisibilityChange === 'function') { + onColumnsVisibilityChange({ + hiddenColumns: sameValueColumns, + model, + appName, + updateModelData, + }); + } + // @ts-ignore + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.showDiff); +} diff --git a/src/src/utils/app/onTableResizeEnd.ts b/src/src/utils/app/onTableResizeEnd.ts new file mode 100644 index 00000000..deed7f31 --- /dev/null +++ b/src/src/utils/app/onTableResizeEnd.ts @@ -0,0 +1,28 @@ +import { IModel, State } from 'types/services/models/model'; + +import { setItem } from 'utils/storage'; +import { encode } from 'utils/encoder/encoder'; + +export function onTableResizeEnd({ + tableHeight, + model, + appName, +}: { + tableHeight: string; + model: IModel; + appName: string; +}): void { + const configData = model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + height: tableHeight, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + } +} diff --git a/src/src/utils/app/onTableResizeModeChange.ts b/src/src/utils/app/onTableResizeModeChange.ts new file mode 100644 index 00000000..a3a16a32 --- /dev/null +++ b/src/src/utils/app/onTableResizeModeChange.ts @@ -0,0 +1,36 @@ +import { ResizeModeEnum } from 'config/enums/tableEnums'; +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; + +import { setItem } from '../storage'; +import { encode } from '../encoder/encoder'; + +export default function onTableResizeModeChange({ + mode, + model, + appName, +}: { + mode: ResizeModeEnum; + model: IModel; + appName: string; +}): void { + const configData = model?.getState()?.config; + + if (configData?.table) { + const table = { + ...configData.table, + resizeMode: mode, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName}Table`, encode(table)); + } + // @ts-ignore + analytics.trackEvent(ANALYTICS_EVENT_KEYS[appName].table.changeResizeMode); +} diff --git a/src/src/utils/app/onTableRowClick.ts b/src/src/utils/app/onTableRowClick.ts new file mode 100644 index 00000000..c1216189 --- /dev/null +++ b/src/src/utils/app/onTableRowClick.ts @@ -0,0 +1,24 @@ +import { IModel, State } from 'types/services/models/model'; + +export default function onTableRowClick({ + rowKey, + model, +}: { + rowKey?: string; + model: IModel; +}): void { + const configData = model?.getState()!.config!; + const chartPanelRef: any = model?.getState()?.refs?.chartPanelRef; + let focusedStateActive = !!rowKey; + if ( + configData.chart.focusedState.active && + configData.chart.focusedState.key === rowKey + ) { + focusedStateActive = false; + } + chartPanelRef?.current?.setActiveLineAndCircle( + rowKey || configData?.chart?.focusedState?.key, + focusedStateActive, + true, + ); +} diff --git a/src/src/utils/app/onTableRowHover.ts b/src/src/utils/app/onTableRowHover.ts new file mode 100644 index 00000000..5afb497f --- /dev/null +++ b/src/src/utils/app/onTableRowHover.ts @@ -0,0 +1,17 @@ +import { IModel, State } from 'types/services/models/model'; + +export default function onTableRowHover({ + rowKey, + model, +}: { + rowKey?: string; + model: IModel; +}): void { + const configData = model?.getState()?.config; + if (configData?.chart) { + const chartPanelRef: any = model?.getState()?.refs?.chartPanelRef; + if (chartPanelRef && !configData.chart.focusedState.active) { + chartPanelRef.current?.setActiveLineAndCircle(rowKey); + } + } +} diff --git a/src/src/utils/app/onTableSortChange.ts b/src/src/utils/app/onTableSortChange.ts new file mode 100644 index 00000000..4ac149b0 --- /dev/null +++ b/src/src/utils/app/onTableSortChange.ts @@ -0,0 +1,51 @@ +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import updateTableSortFields from 'utils/app/updateTableSortFields'; +import { getSortedFields, SortField, SortFields } from 'utils/getSortedFields'; +/** + * function onSortChange has 3 major functionalities + * 1. if only field param passed, the function will change sort option with the following cycle ('asc' -> 'desc' -> none -> 'asc) + * 2. if value param passed 'asc' or 'desc', the function will replace the sort option of the field in sortFields + * 3. if value param passed 'none', the function will delete the field from sortFields + * @param {String} field - the name of the field (i.e params.dataset.preproc) + * @param {'asc' | 'desc' | 'none'} order - 'asc' | 'desc' | 'none' + * @param {String} actionType - the type of the action (i.e DELETE) + */ + +export default function onTableSortChange({ + sortFields, + order, + index, + actionType, + field, + model, + appName, + updateModelData, +}: { + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + order?: 'asc' | 'desc'; + actionType: string; + field?: SortField; + index: number; + sortFields: SortFields; +}) { + const configData: any | undefined = model.getState()?.config; + updateTableSortFields({ + sortFields: getSortedFields({ + sortFields: sortFields || configData?.table.sortFields || [], + order, + index, + actionType, + field, + }), + model, + appName, + updateModelData, + }); +} diff --git a/src/src/utils/app/onToggleColumnsColorScales.ts b/src/src/utils/app/onToggleColumnsColorScales.ts new file mode 100644 index 00000000..2af7f49b --- /dev/null +++ b/src/src/utils/app/onToggleColumnsColorScales.ts @@ -0,0 +1,45 @@ +import _ from 'lodash-es'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { setItem } from 'utils/storage'; +import { encode } from 'utils/encoder/encoder'; + +/** + * @param {String} colKey - column name + */ + +export default function onToggleColumnsColorScales({ + colKey, + model, + appName, + updateModelData, +}: { + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; + colKey: string; +}) { + const state = model.getState(); + const configData = state?.config; + let columnsColorScales = configData?.table?.columnsColorScales || {}; + const table = { + ...configData?.table, + columnsColorScales: columnsColorScales[colKey] + ? { ..._.omit(columnsColorScales, colKey) } + : { ...columnsColorScales, [colKey]: true }, + }; + const config = { + ...configData, + table, + }; + model.setState({ + config, + }); + setItem(`${appName.toLowerCase()}Table`, encode(table)); + updateModelData(config); +} diff --git a/src/src/utils/app/onZoomChange.ts b/src/src/utils/app/onZoomChange.ts new file mode 100644 index 00000000..9e6980a7 --- /dev/null +++ b/src/src/utils/app/onZoomChange.ts @@ -0,0 +1,45 @@ +import _ from 'lodash-es'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IChartZoom } from 'types/services/models/metrics/metricsAppModel'; +import { IModel, State } from 'types/services/models/model'; + +import updateURL from './updateURL'; + +export default function onZoomChange({ + zoom, + model, + appName, +}: { + zoom: Partial; + model: IModel; + appName: string; +}): void { + const config = model.getState()?.config; + if (config?.chart) { + const configData = { + ...config, + chart: { + ...config.chart, + zoom: { + ...config.chart.zoom, + ...zoom, + }, + }, + }; + model.setState({ config: configData }); + + updateURL({ configData, appName }); + } + if (!_.isNil(zoom.mode)) { + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].chart.controls.changeZoomMode} to "${ + zoom.mode === 0 ? 'single' : 'multiple' + }"`, + ); + } +} diff --git a/src/src/utils/app/resetChartZoom.ts b/src/src/utils/app/resetChartZoom.ts new file mode 100644 index 00000000..c2741061 --- /dev/null +++ b/src/src/utils/app/resetChartZoom.ts @@ -0,0 +1,24 @@ +import { + IAppModelConfig, + ILineChartConfig, +} from 'types/services/models/explorer/createAppModel'; + +export default function resetChartZoom({ + configData, + appName, +}: { + configData: IAppModelConfig; + appName: string; +}): IAppModelConfig { + if (configData.chart) { + configData.chart = { + ...configData.chart, + zoom: { + ...(configData.chart as ILineChartConfig).zoom, + active: false, + history: [], + }, + }; + } + return configData; +} diff --git a/src/src/utils/app/resetModelOnError.ts b/src/src/utils/app/resetModelOnError.ts new file mode 100644 index 00000000..ea0f9742 --- /dev/null +++ b/src/src/utils/app/resetModelOnError.ts @@ -0,0 +1,32 @@ +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { IModel, State } from 'types/services/models/model'; + +export default function resetModelOnError({ + detail, + model, +}: { + detail?: any; + model?: IModel; +}) { + // TODO set state correctly for any app model state + model?.setState({ + data: [], + params: [], + lineChartData: [], + aggregatedData: [], + tableData: [], + tableColumns: [], + requestStatus: RequestStatusEnum.BadRequest, + }); + + setTimeout(() => { + const tableRef: any = model?.getState()?.refs?.tableRef; + if (tableRef?.current) { + tableRef?.current?.updateData({ + newData: [], + newColumns: [], + }); + } + }, 0); +} diff --git a/src/src/utils/app/setAggregationEnabled.ts b/src/src/utils/app/setAggregationEnabled.ts new file mode 100644 index 00000000..e6b0ca2b --- /dev/null +++ b/src/src/utils/app/setAggregationEnabled.ts @@ -0,0 +1,20 @@ +import { IModel, State } from 'types/services/models/model'; + +import isGroupingApplied from './isGroupingApplied'; + +export default function setAggregationEnabled({ + model, + appName, +}: { + model: IModel; + appName: string; +}): void { + const configData = model.getState().config; + const isAppliedGrouping = isGroupingApplied>(model); + if (configData) { + configData.chart.aggregationConfig.isEnabled = isAppliedGrouping; + if (!isAppliedGrouping) { + configData.chart.aggregationConfig.isApplied = false; + } + } +} diff --git a/src/src/utils/app/setComponentRefs.ts b/src/src/utils/app/setComponentRefs.ts new file mode 100644 index 00000000..be6a6b41 --- /dev/null +++ b/src/src/utils/app/setComponentRefs.ts @@ -0,0 +1,20 @@ +import { IModel, State } from 'types/services/models/model'; + +/** + * + * @param {ISetComponentRefsParams} + */ + +export default function setComponentRefs({ + refElement, + model, +}: { + refElement: any; + model: IModel; +}): void { + const modelState = model.getState(); + if (modelState?.refs) { + modelState.refs = Object.assign(modelState.refs, refElement); + model.setState({ refs: modelState.refs }); + } +} diff --git a/src/src/utils/app/setDefaultAppConfigData.ts b/src/src/utils/app/setDefaultAppConfigData.ts new file mode 100644 index 00000000..1c3d2243 --- /dev/null +++ b/src/src/utils/app/setDefaultAppConfigData.ts @@ -0,0 +1,101 @@ +import _ from 'lodash-es'; + +import { IModel, State } from 'types/services/models/model'; +import { + IAppInitialConfig, + IAppModelConfig, +} from 'types/services/models/explorer/createAppModel'; + +import { getItem, setItem } from 'utils/storage'; +import { AIM64_ENCODING_PREFIX, encode } from 'utils/encoder/encoder'; +import getStateFromUrl from 'utils/getStateFromUrl'; +import { getCompatibleSelectConfig } from 'utils/app/getCompatibleSelectConfig'; +import { getCompatibleChartConfig } from 'utils/app/getCompatibleChartConfig'; +import decodeWithBase58Checker from 'utils/decodeWithBase58Checker'; + +import updateURL from './updateURL'; + +export default function setDefaultAppConfigData({ + config, + appInitialConfig, + model, + recoverTableState = true, +}: { + config: IAppModelConfig; + appInitialConfig: IAppInitialConfig; + model: IModel; + recoverTableState: boolean; +}): void { + const { grouping, selectForm, components, appName } = appInitialConfig; + const searchParam = new URLSearchParams(window.location.search); + + const liveUpdateConfigHash = getItem(`${appName}LUConfig`); + const luConfig = liveUpdateConfigHash + ? JSON.parse( + decodeWithBase58Checker({ + value: liveUpdateConfigHash, + localStorageKey: `${appName}LUConfig`, + }), + ) + : config?.liveUpdate; + + // Backward compatibility, update users storage data if code has change in delay + // @ts-ignore + if (luConfig.delay !== config?.liveUpdate.delay) { + // @ts-ignore + luConfig.delay = config?.liveUpdate.delay; + setItem(`${appName}LuConfig`, encode(luConfig)); + } + /// + + const defaultConfig: IAppModelConfig = { liveUpdate: luConfig }; + + if (grouping) { + defaultConfig.grouping = getStateFromUrl('grouping') ?? {}; + } + if (selectForm) { + const compatibleSelectConfig = getCompatibleSelectConfig( + ['metrics', 'params', 'images'], + getStateFromUrl('select'), + ); + defaultConfig.select = compatibleSelectConfig ?? {}; + } + if (components.charts) { + const compatibleChartConfig = getCompatibleChartConfig( + getStateFromUrl('chart'), + ); + defaultConfig.chart = compatibleChartConfig ?? {}; + } + if (recoverTableState && components.table) { + const tableConfigHash = getItem(`${appName}Table`); + defaultConfig.table = tableConfigHash + ? JSON.parse( + decodeWithBase58Checker({ + value: tableConfigHash, + localStorageKey: `${appName}Table`, + }), + ) + : config?.table; + } + const configData: IAppModelConfig = _.mergeWith( + {}, + model.getState().config, + defaultConfig, + (objValue, srcValue) => { + if (_.isArray(objValue)) { + return srcValue; + } + }, + ); + if ( + (searchParam.get('grouping') && + !searchParam.get('grouping')?.startsWith(AIM64_ENCODING_PREFIX)) || + (searchParam.get('chart') && + !searchParam.get('chart')?.startsWith(AIM64_ENCODING_PREFIX)) || + (searchParam.get('select') && + !searchParam.get('select')?.startsWith(AIM64_ENCODING_PREFIX)) + ) { + updateURL({ configData, appName }); + } + model.setState({ config: configData }); +} diff --git a/src/src/utils/app/setRequestProgress.ts b/src/src/utils/app/setRequestProgress.ts new file mode 100644 index 00000000..fc55e703 --- /dev/null +++ b/src/src/utils/app/setRequestProgress.ts @@ -0,0 +1,22 @@ +import { IModel, State } from 'types/services/models/model'; + +export interface IRequestProgress { + matched: number; + checked: number; + trackedRuns: number; + percent?: number; +} + +export default function setRequestProgress( + model: IModel, + progress: Partial = {}, +) { + const { checked = 0, trackedRuns = 0 } = progress; + + model.setState({ + requestProgress: { + ...progress, + percent: trackedRuns ? Math.ceil((checked / trackedRuns) * 100) : 0, + }, + }); +} diff --git a/src/src/utils/app/setRequestStatus.ts b/src/src/utils/app/setRequestStatus.ts new file mode 100644 index 00000000..633b571c --- /dev/null +++ b/src/src/utils/app/setRequestStatus.ts @@ -0,0 +1,22 @@ +import { RequestStatusEnum } from 'config/enums/requestStatusEnum'; + +import { IModel, State } from 'types/services/models/model'; + +let timeoutId: number = 0; + +export default function setRequestStatus( + model: IModel, + status: RequestStatusEnum, + delay?: number, +): void { + if (delay || delay === 0) { + if (timeoutId) { + window.clearTimeout(timeoutId); + } + timeoutId = window.setTimeout(() => { + model.setState({ requestStatus: status }); + }, delay); + } else { + model.setState({ requestStatus: status }); + } +} diff --git a/src/src/utils/app/sortDependingArrays.ts b/src/src/utils/app/sortDependingArrays.ts new file mode 100644 index 00000000..1eb27cf2 --- /dev/null +++ b/src/src/utils/app/sortDependingArrays.ts @@ -0,0 +1,34 @@ +/** + * Sort X-axis values in ascending order + * Sort rest arrays values based on corresponding X-axis value order + * + * @property {number[]} xValues - X-axis values + * @property {{key: number[]}} restArrays - object of arrays + * */ +function sortDependingArrays( + xValues: number[], + restArrays: { [key: string]: number[] } = {}, +): { + sortedXValues: number[]; + sortedArrays: { [key: string]: number[] }; +} { + const sortedXValues: number[] = []; + const sortedArrays: { [key: string]: number[] } = {}; + const restArraysKeys = Object.keys(restArrays); + for (let arrKey of restArraysKeys) { + sortedArrays[arrKey] = []; + } + + xValues + .map((value, i) => ({ i, value })) + .sort((a, b) => a.value - b.value) + .forEach((xObj, i) => { + sortedXValues[i] = xValues[xObj.i]; + for (let arrKey of restArraysKeys) { + sortedArrays[arrKey][i] = restArrays[arrKey][xObj.i]; + } + }); + return { sortedXValues, sortedArrays }; +} + +export default sortDependingArrays; diff --git a/src/src/utils/app/toggleSelectAdvancedMode.ts b/src/src/utils/app/toggleSelectAdvancedMode.ts new file mode 100644 index 00000000..6860d4e1 --- /dev/null +++ b/src/src/utils/app/toggleSelectAdvancedMode.ts @@ -0,0 +1,41 @@ +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; + +import getQueryStringFromSelect from './getQueryStringFromSelect'; + +export default function toggleSelectAdvancedMode({ + model, + appName, +}: { + model: IModel; + appName: string; +}): void { + const { config, selectFormData } = model.getState(); + if (config) { + let query = + config.select.advancedQuery || + getQueryStringFromSelect(config?.select, selectFormData.error); + if (query === '()') { + query = ''; + } + const newConfig = { + ...config, + select: { + ...config.select, + advancedQuery: query, + advancedMode: !config.select.advancedMode, + }, + }; + + model.setState({ config: newConfig }); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].useAdvancedSearch} ${ + !config?.select.advancedMode ? 'on' : 'off' + }`, + ); +} diff --git a/src/src/utils/app/updateColumnsWidths.ts b/src/src/utils/app/updateColumnsWidths.ts new file mode 100644 index 00000000..53c19a44 --- /dev/null +++ b/src/src/utils/app/updateColumnsWidths.ts @@ -0,0 +1,55 @@ +import _ from 'lodash-es'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; + +/** + * + * @param {string} key - key of table column + * @param {number} width - width of table column + * @param {boolean} isReset - checking if in columns should be reset + * @param {IModel} model - instance of create model + */ + +export default function updateColumnsWidths({ + key, + width, + isReset, + model, + appName, + updateModelData, +}: { + key: string; + width: number; + isReset: boolean; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.table && configData?.table?.columnsWidths) { + let columnsWidths = configData?.table?.columnsWidths; + if (isReset) { + columnsWidths = _.omit(columnsWidths, [key]); + } else { + columnsWidths = { ...columnsWidths, [key]: width }; + } + const table = { + ...configData.table, + columnsWidths, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + setItem(`${appName.toLowerCase()}Table`, encode(table)); + updateModelData(config); + } +} diff --git a/src/src/utils/app/updateTableSortFields.ts b/src/src/utils/app/updateTableSortFields.ts new file mode 100644 index 00000000..4f513937 --- /dev/null +++ b/src/src/utils/app/updateTableSortFields.ts @@ -0,0 +1,49 @@ +import { isEmpty } from 'lodash-es'; + +import { ANALYTICS_EVENT_KEYS } from 'config/analytics/analyticsKeysMap'; + +import * as analytics from 'services/analytics'; + +import { IModel, State } from 'types/services/models/model'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from 'utils/encoder/encoder'; +import { setItem } from 'utils/storage'; +import { SortFields } from 'utils/getSortedFields'; + +export default function updateSortFields({ + sortFields, + model, + appName, + updateModelData, +}: { + sortFields: SortFields; + model: IModel; + appName: string; + updateModelData: ( + configData: IAppModelConfig | any, + shouldURLUpdate?: boolean, + ) => void; +}): void { + const configData = model.getState()?.config; + if (configData?.table) { + const table = { + ...configData.table, + sortFields, + }; + const config = { + ...configData, + table, + }; + model.setState({ config }); + + setItem(`${appName}Table`, encode(table)); + updateModelData(config); + } + analytics.trackEvent( + // @ts-ignore + `${ANALYTICS_EVENT_KEYS[appName].table.changeSorting} ${ + isEmpty(sortFields) ? 'Reset' : 'Apply' + }`, + ); +} diff --git a/src/src/utils/app/updateURL.ts b/src/src/utils/app/updateURL.ts new file mode 100644 index 00000000..dd787d38 --- /dev/null +++ b/src/src/utils/app/updateURL.ts @@ -0,0 +1,28 @@ +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { encode } from '../encoder/encoder'; + +import updateUrlParam from './updateUrlParam'; + +export default function updateURL({ + configData, + appName, +}: { + configData: IAppModelConfig; + appName: string; +}) { + const { grouping, chart, select } = configData || {}; + const encodedParams: { [key: string]: string } = {}; + + if (grouping) { + encodedParams.grouping = encode(grouping as {}); + } + if (chart) { + encodedParams.chart = encode(chart as {}); + } + if (select) { + encodedParams.select = encode(select as {}); + } + + updateUrlParam({ data: encodedParams, appName }); +} diff --git a/src/src/utils/app/updateUrlParam.ts b/src/src/utils/app/updateUrlParam.ts new file mode 100644 index 00000000..ac491cbc --- /dev/null +++ b/src/src/utils/app/updateUrlParam.ts @@ -0,0 +1,41 @@ +import getUrlWithParam from 'utils/getUrlWithParam'; +import { setItem } from 'utils/storage'; + +/** + * function updateURL has 2 major functionalities: + * 1. Keeps URL in sync with the incoming argument "data" + * 2. Stores updated URL in localStorage if App is not in the bookmark state + * @data ex. {IAppConfig} configData - the current state of the app config + */ + +export default function updateUrlParam({ + data, + appName, +}: { + data: { [key: string]: string }; + appName: string; +}): void { + const url: string = getUrlWithParam(data); + + if (url === `${window.location.pathname}${window.location.search}`) { + return; + } + + const isExistBasePath = (window as any).API_BASE_PATH !== '{{ base_path }}'; + + const appId: string = + window.location.pathname.split('/')[isExistBasePath ? 3 : 2]; + if (!appId) { + let fullURL = url; + + if (isExistBasePath) { + fullURL = fullURL.replace((window as any).API_BASE_PATH, ''); + } + + if (fullURL.startsWith(`/${appName}?`)) { + setItem(`${appName}Url`, fullURL); + } + } + + window.history.pushState(null, '', url); +} diff --git a/src/src/utils/arrayBufferToBase64.ts b/src/src/utils/arrayBufferToBase64.ts new file mode 100644 index 00000000..f5e031d3 --- /dev/null +++ b/src/src/utils/arrayBufferToBase64.ts @@ -0,0 +1,9 @@ +export default function arrayBufferToBase64(buffer: ArrayBuffer) { + let binary = ''; + const bytes = new Uint8Array(buffer); + const len = bytes.byteLength; + for (let i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return window.btoa(binary); +} diff --git a/src/src/utils/changeDasharraySize.ts b/src/src/utils/changeDasharraySize.ts new file mode 100644 index 00000000..ed21db6d --- /dev/null +++ b/src/src/utils/changeDasharraySize.ts @@ -0,0 +1,13 @@ +function changeDasharraySize( + dasharray: string = 'none', + multiplier: number = 1, +): string { + if (dasharray === 'none') return dasharray; + + return dasharray + .split(' ') + .map((elem) => parseInt(elem) * multiplier) + .join(' '); +} + +export default changeDasharraySize; diff --git a/src/src/utils/contextToString.ts b/src/src/utils/contextToString.ts new file mode 100644 index 00000000..c96c35bd --- /dev/null +++ b/src/src/utils/contextToString.ts @@ -0,0 +1,21 @@ +import { formatValue } from './formatValue'; + +function contextToString( + obj: { [key: string]: unknown }, + mode?: string, +): string | null { + return obj + ? Object.keys(obj) + .map((key) => { + switch (mode) { + case 'keyHash': + return `${key}-${obj[key]}`; + default: + return `${key}=${formatValue(obj[key])}`; + } + }) + .join(mode === 'keyHash' ? '' : ', ') + : null; +} + +export default contextToString; diff --git a/src/src/utils/d3/areaGenerator.ts b/src/src/utils/d3/areaGenerator.ts new file mode 100644 index 00000000..d0ea4b9e --- /dev/null +++ b/src/src/utils/d3/areaGenerator.ts @@ -0,0 +1,15 @@ +import * as d3 from 'd3'; + +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { CurveEnum } from './'; + +export default function areaGenerator(xScale: IAxisScale, yScale: IAxisScale) { + return d3 + .area() + .x0((d: any) => xScale(d[0])) + .y0((d: any) => yScale(d[1])) + .x1((d: any) => xScale(d[2])) + .y1((d: any) => yScale(d[3])) + .curve(d3[CurveEnum.Linear]); +} diff --git a/src/src/utils/d3/clearArea.ts b/src/src/utils/d3/clearArea.ts new file mode 100644 index 00000000..f58b4eb0 --- /dev/null +++ b/src/src/utils/d3/clearArea.ts @@ -0,0 +1,17 @@ +import * as d3 from 'd3'; + +import { IClearAreaProps } from 'types/utils/d3/clearArea'; + +function clearArea(props: IClearAreaProps): void { + if (!props.visAreaRef?.current) { + return; + } + + const area = d3.select(props.visAreaRef.current); + if (area) { + area.selectAll('*').remove(); + area.attr('style', null); + } +} + +export default clearArea; diff --git a/src/src/utils/d3/drawArea.ts b/src/src/utils/d3/drawArea.ts new file mode 100644 index 00000000..08e09821 --- /dev/null +++ b/src/src/utils/d3/drawArea.ts @@ -0,0 +1,171 @@ +import * as d3 from 'd3'; + +import { IDrawAreaArgs } from 'types/utils/d3/drawArea'; + +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { isSystemMetric } from 'utils/isSystemMetric'; +import { toTextEllipsis } from 'utils/helper'; + +import { CircleEnum } from './index'; + +function drawArea(args: IDrawAreaArgs): void { + const { + index, + id, + nameKey, + parentRef, + visAreaRef, + svgNodeRef, + bgRectNodeRef, + visBoxRef, + plotNodeRef, + axesNodeRef, + plotBoxRef, + linesNodeRef, + attributesNodeRef, + chartTitle = {}, + } = args; + + if (!parentRef?.current || !visAreaRef?.current) { + return; + } + + const parent = d3.select(parentRef.current); + const visArea = d3.select(visAreaRef.current); + + const parentRect = parent.node().getBoundingClientRect(); + + const { width, height } = parentRect; + const { margin } = visBoxRef.current; + + // set visual box dimensions + visBoxRef.current = { + ...visBoxRef.current, + width, + height, + }; + + // set plot box dimensions + plotBoxRef.current = { + ...plotBoxRef.current, + width: width - margin.left - margin.right, + height: height - margin.top - margin.bottom, + }; + + const offsetWidth = + width - margin.left - margin.right >= 0 + ? width - margin.left - margin.right + : 0; + + const offsetHeight = + height - margin.top - margin.bottom >= 0 + ? height - margin.top - margin.bottom + : 0; + + visArea.style('width', `${width}px`).style('height', `${height}px`); + + svgNodeRef.current = visArea + .append('svg') + .attr('class', 'Visualization') + .attr('id', `${nameKey}-svg-area-${id}`) + .attr('width', `${width}px`) + .attr('height', `${height}px`) + .attr('xmlns', 'http://www.w3.org/2000/svg') + .style('fill', 'transparent'); + + bgRectNodeRef.current = svgNodeRef.current + .append('rect') + .attr('x', margin.left) + .attr('y', margin.top) + .attr('class', 'backgroundRect') + .attr('width', offsetWidth) + .attr('height', offsetHeight) + .style('fill', 'transparent'); + + plotNodeRef.current = svgNodeRef.current + .append('g') + .attr('transform', `translate(${margin.left}, ${margin.top})`); + + axesNodeRef.current = plotNodeRef.current.append('g').attr('class', 'Axes'); + linesNodeRef.current = plotNodeRef.current.append('g').attr('class', 'Lines'); + + linesNodeRef.current + .append('clipPath') + .attr('id', `${nameKey}-lines-rect-clip-${id}`) + .append('rect') + .attr('x', 0) + .attr('y', 0) + .attr('width', offsetWidth) + .attr('height', offsetHeight); + + attributesNodeRef.current = plotNodeRef.current + .append('g') + .attr('class', 'Attributes'); + + attributesNodeRef.current + .append('clipPath') + .attr('id', `${nameKey}-circles-rect-clip-${id}`) + .append('rect') + .attr('x', -CircleEnum.Radius) + .attr('y', -CircleEnum.Radius) + .attr('width', offsetWidth + 2 * CircleEnum.Radius) + .attr('height', offsetHeight + 2 * CircleEnum.Radius); + + const titleText = Object.entries(chartTitle || {}) + .map( + ([key, value]) => + `${key}=${ + isSystemMetric(value) ? formatSystemMetricName(value) : value + }`, + ) + .join(', '); + + const title = { + x: margin.left / 6, + fontSize: 11, + fontFamily: 'Inter, sans-serif', + fontWeight: 400, + chartIndex: { + fontFamily: 'Inconsolata, monospace', + }, + }; + const textEllipsis = toTextEllipsis({ + text: titleText, + width: title.x + offsetWidth, + fontSize: `${title.fontSize}px`, + fontFamily: title.fontFamily, + fontWeight: title.fontWeight, + }); + if (titleText) { + const titleGroup = svgNodeRef.current + .append('g') + .attr('transform', `translate(${title.x}, 3)`) + .attr('font-size', `${title.fontSize}px`) + .attr('font-weight', title.fontWeight) + .attr('font-family', title.fontFamily); + + if (index || index === 0) { + titleGroup + .append('text') + .attr('x', 0) + .attr('y', 12) + .attr('fill', '#484f56') + .style('outline', '1px solid #dee6f3') + .style('border-radius', '1px') + .style('white-space', 'pre') + .text(` ${index + 1} `) + .style('font-family', title.chartIndex.fontFamily); + } + + titleGroup + .append('text') + .attr('x', title.x + 39) + .attr('y', 12) + .attr('fill', '#484f56') + .text(textEllipsis) + .append('svg:title') + .text(titleText); + } +} + +export default drawArea; diff --git a/src/src/utils/d3/drawAxes.ts b/src/src/utils/d3/drawAxes.ts new file mode 100644 index 00000000..2302c9f0 --- /dev/null +++ b/src/src/utils/d3/drawAxes.ts @@ -0,0 +1,350 @@ +import * as d3 from 'd3'; +import _ from 'lodash-es'; +import moment from 'moment'; + +import { DATE_CHART_TICK } from 'config/dates/dates'; + +import { IDrawAxesArgs } from 'types/utils/d3/drawAxes'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { + formatValueByAlignment, + getKeyByAlignment, +} from 'utils/formatByAlignment'; + +import shortEnglishHumanizer from '../shortEnglishHumanizer'; + +import { + formatXAxisByDefault, + formatYAxisByDefault, + IFormatAxis, +} from './tickFormatting'; + +import { AlignmentOptionsEnum, ScaleEnum } from './index'; + +function drawAxes(args: IDrawAxesArgs): void { + const { + svgNodeRef, + axesNodeRef, + axesRef, + plotBoxRef, + xScale, + yScale, + visBoxRef, + alignmentConfig, + axesScaleType, + humanizerConfigRef, + drawBgTickLines = { + x: false, + y: false, + }, + } = args; + + if ( + !axesNodeRef?.current || + !axesRef?.current || + !svgNodeRef?.current || + !visBoxRef?.current + ) { + return; + } + + const { width, height, margin } = visBoxRef.current; + + function formatByStep(args: IFormatAxis) { + const { xAxis } = formatXAxisByDefault(args); + return { + xAxis, + xAxisTitle: _.capitalize(getKeyByAlignment(alignmentConfig)) + 's', + }; + } + + function formatByEpoch(args: IFormatAxis) { + const { xAxis, ticksCount } = formatXAxisByDefault({ + ...args, + tickAdditionalConfig: { + minCount: 3, + }, + }); + + const { scale } = args; + + const domain = scale.domain(); + const first = domain[0] as number; + const last = domain[domain.length - 1] as number; + const distance = Math.ceil((last - first) / (ticksCount - 1)); + const tickValues: number[] = []; + for (let i = 0; i < ticksCount; i++) { + const current = Math.floor(first + i * distance); + if ( + current >= first && + current <= last && + tickValues.indexOf(current) === -1 + ) { + tickValues.push(current); + } + } + + xAxis.tickValues(tickValues); + + return { + xAxis, + xAxisTitle: _.capitalize(getKeyByAlignment(alignmentConfig)) + 's', + }; + } + + function formatByRelativeTime(args: IFormatAxis) { + let { xAxis, ticksCount, tickConfig, tickValues } = formatXAxisByDefault({ + ...args, + tickAdditionalConfig: { + distance: 120, + }, + }); + + const { scale } = args; + + const sec = 1; + const minute = 60 * sec; + const hour = 60 * minute; + const day = 24 * hour; + const week = 7 * day; + + const domain = scale.domain(); + const first = domain[0] as number; + const last = domain[domain.length - 1] as number; + + const diff = Math.ceil((last - first) / 1000); + let formatUnit: string; + if (diff / week > 4) { + formatUnit = 'w'; + } else if (diff / day > 3) { + formatUnit = 'd'; + } else if (diff / hour > 3) { + formatUnit = 'h'; + } else if (diff / minute > 4) { + formatUnit = 'm'; + } else if (diff / sec > 4) { + formatUnit = 's'; + } else { + formatUnit = 'ms'; + } + + humanizerConfigRef.current = { + units: [formatUnit], + maxDecimalPoints: 4, + }; + + if (axesScaleType.xAxis === ScaleEnum.Log) { + xAxis.tickValues(tickValues).tickFormat((d, i) => + _.truncate( + shortEnglishHumanizer(d as number, humanizerConfigRef.current), + { + length: tickConfig.maxLength, + }, + ), + ); + } else { + xAxis.ticks(ticksCount).tickFormat((d, i) => + _.truncate( + shortEnglishHumanizer(d as number, humanizerConfigRef.current), + { + length: tickConfig.maxLength, + }, + ), + ); + } + + return { + xAxis, + xAxisTitle: _.capitalize(getKeyByAlignment(alignmentConfig)), + }; + } + + function formatByAbsoluteTime(args: IFormatAxis) { + const { xAxis, ticksCount, tickConfig } = formatXAxisByDefault({ + ...args, + tickAdditionalConfig: { + distance: 180, + maxLength: 20, + }, + }); + + const { scale } = args; + + const domain = scale.domain(); + const first = domain[0] as number; + const last = domain[domain.length - 1] as number; + const distance = Math.ceil((last - first) / (ticksCount - 1)); + const tickValues: number[] = []; + for (let i = 0; i < ticksCount; i++) { + const lastRounded = Math.ceil(last); + const current = Math.floor(first + i * distance); + if (i === ticksCount - 1 && tickValues.indexOf(lastRounded) === -1) { + tickValues.push(lastRounded); + } else if (current < last) { + tickValues.push(current); + } + } + + xAxis + .ticks(ticksCount) + .tickValues(tickValues) + .tickFormat((d, i) => + _.truncate(moment(+d).format(DATE_CHART_TICK), { + length: tickConfig.maxLength, + }), + ); + + return { + xAxis, + xAxisTitle: _.capitalize(getKeyByAlignment(alignmentConfig)), + }; + } + + function formatByCustomMetric(args: IFormatAxis) { + const { xAxis } = formatXAxisByDefault(args); + return { + xAxis, + xAxisTitle: getKeyByAlignment(alignmentConfig), + }; + } + + function getFormattedXAxis(scale: d3.AxisScale) { + const formatters: { [key: string]: Function } = { + [AlignmentOptionsEnum.STEP]: formatByStep, + [AlignmentOptionsEnum.EPOCH]: formatByEpoch, + [AlignmentOptionsEnum.RELATIVE_TIME]: formatByRelativeTime, + [AlignmentOptionsEnum.ABSOLUTE_TIME]: formatByAbsoluteTime, + [AlignmentOptionsEnum.CUSTOM_METRIC]: formatByCustomMetric, + default: formatXAxisByDefault, + }; + const formatter = formatters[alignmentConfig?.type || 'default']; + return formatter({ + scale, + drawTickLines: { + ...drawBgTickLines, + tickSize: -height + (margin.top + margin.bottom), + }, + plotBoxRef, + scaleType: axesScaleType, + }); + } + + function getFormattedYAxis(scale: d3.AxisScale) { + const { yAxis } = formatYAxisByDefault({ + scale, + drawTickLines: { + ...drawBgTickLines, + tickSize: -width + (margin.left + margin.right), + }, + plotBoxRef, + scaleType: axesScaleType, + }); + return yAxis; + } + + function drawYAxis(scale: IAxisScale): void { + axesNodeRef.current?.select('.yAxis')?.remove(); + + const yAxis = getFormattedYAxis(scale); + const tickFontSize = 10; + + axesRef.current.yAxis = axesNodeRef.current + ?.append('g') + .attr('class', 'yAxis') + .attr('stroke-width', 0.2) + .attr('color', '#414b6d') + .attr('fill', 'none') + .call(yAxis) + .attr('font-size', tickFontSize); + + axesRef.current.yAxis + .select('.domain') + .attr('stroke', '#414b6d') + .attr('stroke-width', 0.4); + + const ticks = axesRef.current.yAxis.selectAll('.tick'); + + ticks?.append('svg:title').text((d: string | number) => d); + + ticks?.select('line').attr('stroke', '#8E9BAE').attr('x1', '-6'); + + if (!drawBgTickLines.y) { + ticks + ?.select('line') + .attr('stroke', '#414b6d') + .attr('stroke-width', 0.4) + .attr('y2', '0.5'); + } + } + + function drawXAxis(scale: IAxisScale): void { + axesNodeRef.current?.select('.xAxis')?.remove(); + + const { xAxisTitle, xAxis } = getFormattedXAxis(scale); + const tickFontSize = 10; + + axesRef.current.xAxis = axesNodeRef.current + ?.append('g') + .attr('class', 'xAxis') + .attr('stroke-width', 0.2) + .attr('color', '#414b6d') + .attr('fill', 'none') + .attr('transform', `translate(0, ${plotBoxRef.current.height})`) + .call(xAxis) + .attr('font-size', tickFontSize); + + axesRef.current.xAxis + .select('.domain') + .attr('stroke', '#414b6d') + .attr('stroke-width', 0.4); + + const ticks = axesRef.current.xAxis.selectAll('.tick'); + + ticks?.append('svg:title').text((d: number) => + formatValueByAlignment({ + xAxisTickValue: d ?? null, + type: alignmentConfig?.type, + }), + ); + + ticks?.select('line').attr('stroke', '#8E9BAE').attr('y1', '6'); + + if (!drawBgTickLines.x) { + ticks + ?.select('line') + .attr('stroke', '#414b6d') + .attr('stroke-width', 0.4) + .attr('y2', '0.5'); + } + + axesRef.current.xAxis + .append('text') + .attr( + 'transform', + `translate(${width - margin.left - margin.right - 20},-5)`, + ) + .attr('text-anchor', 'end') + .attr('alignment-baseline', 'ideographic') + .style('font-size', '1.1em') + .style('fill', '#586069') + .text(xAxisTitle); + } + + drawYAxis(yScale); + drawXAxis(xScale); + + axesRef.current.updateXAxis = function ( + xScaleUpdate: d3.AxisScale, + ) { + drawXAxis(xScaleUpdate); + }; + + axesRef.current.updateYAxis = function ( + yScaleUpdate: d3.AxisScale, + ) { + drawYAxis(yScaleUpdate); + }; +} + +export default drawAxes; diff --git a/src/src/utils/d3/drawBrush.ts b/src/src/utils/d3/drawBrush.ts new file mode 100644 index 00000000..2c374699 --- /dev/null +++ b/src/src/utils/d3/drawBrush.ts @@ -0,0 +1,199 @@ +import * as d3 from 'd3'; +import _ from 'lodash-es'; + +import { IDrawBrushArgs } from 'types/utils/d3/drawBrush'; + +import { ZoomEnum } from 'utils/d3'; + +import getAxisScale from './getAxisScale'; + +function drawBrush(args: IDrawBrushArgs): void { + const { + id, + plotBoxRef, + plotNodeRef, + visBoxRef, + axesRef, + attributesRef, + linesRef, + svgNodeRef, + axesScaleType, + axesScaleRange, + min, + max, + zoom, + onZoomChange, + readOnly, + unableToDrawConditions, + } = args; + + if (!plotNodeRef.current) { + return; + } + + const brush = d3 + .brush() + .extent([ + [0, 0], + [plotBoxRef.current.width, plotBoxRef.current.height], + ]) + .on('end', handleBrushChange); + + if (zoom?.active && !readOnly) { + plotNodeRef.current.append('g').call(brush).attr('class', 'brush'); + } + + function handleZoomIn( + brushXValuesDomain: [number, number], + brushYValuesDomain: [number, number], + ): void { + const { width, height, margin } = visBoxRef.current; + + let [xMin, xMax] = brushXValuesDomain; + let [yMin, yMax] = brushYValuesDomain; + + if (axesScaleRange?.xAxis && !_.isEmpty(axesScaleRange?.xAxis)) { + xMin = xMin < min.x ? min.x : xMin; + xMax = xMax < max.x ? xMax : max.x; + unableToDrawConditions.unshift({ + condition: xMin > xMax, + text: 'Unable to draw lines with the current x-axis range. Please adjust the x-axis range.', + }); + } + + if (axesScaleRange?.yAxis && !_.isEmpty(axesScaleRange?.yAxis)) { + yMin = yMin < min.y ? min.y : yMin; + yMax = yMax < max.y ? yMax : max.y; + unableToDrawConditions.unshift({ + condition: yMin > yMax, + text: 'Unable to draw lines with the current y-axis range. Please adjust the y-axis range.', + }); + } + + // updating Scales domain + attributesRef.current.xScale + .domain([xMin, xMax]) + .range([0, width - margin.left - margin.right]); + + attributesRef.current.yScale + .domain([yMin, yMax]) + .range([height - margin.top - margin.bottom, 0]); + + // updating axes with new Scales + axesRef.current.updateXAxis(attributesRef.current.xScale); + axesRef.current.updateYAxis(attributesRef.current.yScale); + + linesRef.current.updateScales?.( + attributesRef.current.xScale, + attributesRef.current.yScale, + ); + + linesRef.current.updateAggregatedAreasScales?.( + attributesRef.current.xScale, + attributesRef.current.yScale, + ); + + linesRef.current.updateAggregatedLinesScales?.( + attributesRef.current.xScale, + attributesRef.current.yScale, + ); + + attributesRef.current.updateScales?.( + attributesRef.current.xScale, + attributesRef.current.yScale, + ); + } + + // This remove the grey brush area as soon as the selection has been done + function removeBrush() { + plotNodeRef.current.select('.brush').call(brush.move, null); + } + + // This event firing after brush selection ends + function handleBrushChange(event: d3.D3BrushEvent): void { + const extent: d3.BrushSelection | any = event.selection; + if (!extent) { + return; + } else if ( + extent[1][0] - extent[0][0] < 5 || + extent[1][1] - extent[0][1] < 5 + ) { + removeBrush(); + } else { + // inverting pixels to x,y values + const left: number = attributesRef.current.xScale.invert(extent[0][0]); + const right: number = attributesRef.current.xScale.invert(extent[1][0]); + + const top: number = attributesRef.current.yScale.invert(extent[0][1]); + const bottom: number = attributesRef.current.yScale.invert(extent[1][1]); + + const [xMin, xMax]: number[] = attributesRef.current.xScale.domain(); + const [yMin, yMax]: number[] = attributesRef.current.yScale.domain(); + + const xValues: [number, number] | null = + extent[1][0] - extent[0][0] < 5 + ? null + : [left < xMin ? xMin : left, right > xMax ? xMax : right]; + + const yValues: [number, number] | null = + extent[1][1] - extent[0][1] < 5 + ? null + : [bottom < yMin ? yMin : bottom, top > yMax ? yMax : top]; + + if (xValues && yValues) { + handleZoomIn?.(xValues, yValues); + if (typeof onZoomChange === 'function' && zoom) { + onZoomChange({ + active: zoom.mode !== ZoomEnum.SINGLE, + history: [ + ...zoom.history, + { + id, + xValues, + yValues, + }, + ], + }); + } + } + } + svgNodeRef.current.on('dblclick', handleZoomOut); + removeBrush(); + } + + function handleZoomOut(event: Event): void { + const { width, height, margin } = visBoxRef.current; + + const xScale = getAxisScale({ + domainData: [min.x, max.x], + rangeData: [0, width - margin.left - margin.right], + scaleType: axesScaleType.xAxis, + }); + const yScale = getAxisScale({ + domainData: [min.y, max.y], + rangeData: [height - margin.top - margin.bottom, 0], + scaleType: axesScaleType.yAxis, + }); + // setting axes to initial state + axesRef.current.updateXAxis(xScale); + axesRef.current.updateYAxis(yScale); + + // setting scales and lines to initial state + linesRef.current.updateScales?.(xScale, yScale); + linesRef.current.updateAggregatedAreasScales?.(xScale, yScale); + linesRef.current.updateAggregatedLinesScales?.(xScale, yScale); + + attributesRef.current.updateScales?.(xScale, yScale); + attributesRef.current.updateFocusedChart?.(); + } + + if (zoom?.history?.length) { + const chartZoomHistory = zoom.history.filter((item) => item.id === id); + const lastHistoryDomain = chartZoomHistory[chartZoomHistory.length - 1]; + if (lastHistoryDomain) { + handleZoomIn(lastHistoryDomain.xValues, lastHistoryDomain.yValues); + } + } +} + +export default drawBrush; diff --git a/src/src/utils/d3/drawHoverAttributes.ts b/src/src/utils/d3/drawHoverAttributes.ts new file mode 100644 index 00000000..d6c1b587 --- /dev/null +++ b/src/src/utils/d3/drawHoverAttributes.ts @@ -0,0 +1,976 @@ +import * as d3 from 'd3'; +import _ from 'lodash-es'; + +import { + HoverAttrData, + IActivePoint, + IAxisLineData, + IDrawHoverAttributesArgs, + INearestCircle, + ISyncHoverStateArgs, +} from 'types/utils/d3/drawHoverAttributes'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; +import { IUpdateFocusedChartArgs } from 'types/components/LineChart/LineChart'; +import { IProcessedData } from 'types/utils/d3/processLineChartData'; +import { IFocusedState } from 'types/services/models/metrics/metricsAppModel'; + +import { AggregationAreaMethods } from 'utils/aggregateGroupData'; +import getRoundedValue from 'utils/roundValue'; + +import { formatValueByAlignment } from '../formatByAlignment'; + +import { getDimensionValue } from './getDimensionValue'; + +import { CircleEnum, HighlightEnum, ScaleEnum } from './index'; + +function drawHoverAttributes(args: IDrawHoverAttributesArgs): void { + const { + index, + id, + nameKey, + data, + processedData = [], + axesScaleType, + alignmentConfig, + plotBoxRef, + visAreaRef, + visBoxRef, + svgNodeRef, + bgRectNodeRef, + xAxisLabelNodeRef, + yAxisLabelNodeRef, + linesNodeRef, + highlightedNodeRef, + attributesNodeRef: attrNodeRef, + attributesRef: attrRef, + highlightMode = HighlightEnum.Off, + syncHoverState, + aggregationConfig, + drawAxisLines = { + x: true, + y: true, + }, + drawAxisLabels = { + x: true, + y: true, + }, + } = args; + + if (!svgNodeRef?.current || !bgRectNodeRef?.current) { + return; + } + + let rafID = 0; + + const { margin, width, height } = visBoxRef.current; + + function isMouseInVisArea(x: number, y: number): boolean { + const padding = 5; + return ( + x > margin.left - padding && + x < width - margin.right + padding && + y > margin.top - padding && + y < height - margin.bottom + padding + ); + } + + function getClosestCircle( + mouseX: number, + mouseY: number, + data: HoverAttrData[], + ): INearestCircle | null { + const { scaledValues } = attrRef.current; + if (!scaledValues) { + return null; + } + // find active point + let closestCircles: INearestCircle[] = []; + let minDistance: number = Infinity; + for (let i = 0; i < data.length; i++) { + const item = data[i]; + for (let j = 0; j < scaledValues[i].length; j++) { + const scaledValue = scaledValues[i][j]; + const rX = Math.abs(scaledValue.x - mouseX); + const rY = Math.abs(scaledValue.y - mouseY); + const r = Math.sqrt(rX * rX + rY * rY); + if (r <= minDistance) { + const isLastCircle = + item.data.xValues.length > 0 && j === item.data.xValues.length - 1; + const circle = { + key: item.key, + color: item.color || '#000', + inProgress: isLastCircle && !!item?.run?.props?.active, + ...scaledValue, + }; + if (r === minDistance) { + // Circle coordinates can be equal + // To show only one circle on hover we need to keep array of closest circles + closestCircles.push(circle); + } else { + minDistance = r; + closestCircles = [circle]; + } + } + } + } + + closestCircles.sort((a, b) => (a.key > b.key ? 1 : -1)); + return closestCircles.length ? closestCircles[0] : null; + } + + function getNearestCircles(mouseX: number): INearestCircle[] { + const nearestCircles: INearestCircle[] = []; + // Closest xValue for mouseX + const xValue = getInvertedValue( + axesScaleType.xAxis, + mouseX, + attrRef.current.xScale, + false, + ); + for (let i = 0; i < data.length; i++) { + const item = data[i]; + let index = 0; + if (axesScaleType.xAxis !== ScaleEnum.Point) { + index = d3.bisectCenter( + item.data.xValues as number[], + xValue as number, + ); + while ( + index && + getRoundedValue((item.data.xValues as number[])[index]) > xValue + ) { + index--; + } + } + const x = item.data.xValues[index]; + const y = item.data.yValues[index]; + if ((x || x === 0) && x !== '-' && (y || y === 0) && y !== '-') { + const isLastCircle = + item.data.xValues.length > 0 && + index === item.data.xValues.length - 1; + + nearestCircles.push({ + key: item.key, + color: item.color || '#000', + x: attrRef.current.xScale(x) || 0, + y: attrRef.current.yScale(y) || 0, + inProgress: isLastCircle && !!item?.run?.props?.active, + }); + } + } + return nearestCircles; + } + + function drawXAxisLabel(xValue: string | number): void { + if (xAxisLabelNodeRef && drawAxisLabels.x) { + const visArea = d3.select(visAreaRef.current); + if (visArea?.empty()) return; + let xAxisValueText = xValue; + if (typeof xValue === 'number') { + xAxisValueText = formatValueByAlignment({ + xAxisTickValue: xValue ?? null, + type: alignmentConfig?.type, + }); + } + if (xValue || xValue === 0) { + // X Axis Label + const axisLeftEdge = margin.left - 1; + const axisRightEdge = width - margin.right + 1; + let xAxisValueWidth = + xAxisLabelNodeRef.current?.node()?.offsetWidth || 0; + if (xAxisValueWidth > plotBoxRef.current.width) { + xAxisValueWidth = plotBoxRef.current.width; + } + + const x = attrRef.current.xScale(xValue); + const left = + x - xAxisValueWidth / 2 < 0 + ? axisLeftEdge + xAxisValueWidth / 2 + : x + axisLeftEdge + xAxisValueWidth / 2 > axisRightEdge + ? axisRightEdge - xAxisValueWidth / 2 + : x + axisLeftEdge; + const top = height - margin.bottom + 1; + + if (xAxisLabelNodeRef.current && xAxisValueWidth) { + // update x-axis label + xAxisLabelNodeRef.current + .attr('title', xAxisValueText) + .style('top', `${top}px`) + .style('left', `${left}px`) + .style('min-width', '24px') + .style('max-width', '150px') + .text(xAxisValueText); + } else { + // create x-axis label + xAxisLabelNodeRef.current = visArea + .append('div') + .attr('class', 'ChartMouseValue ChartMouseValueXAxis') + .attr('title', xAxisValueText) + .style('top', `${top}px`) + .style('left', `${left}px`) + .style('min-width', '24px') + .style('max-width', '150px') + .text(xAxisValueText); + } + } + } + } + + function clearYAxisLabel(): void { + if (yAxisLabelNodeRef?.current) { + yAxisLabelNodeRef.current.remove(); + yAxisLabelNodeRef.current = null; + } + } + + function drawYAxisLabel(yValue: string | number): void { + if (yAxisLabelNodeRef && drawAxisLabels.y) { + const visArea = d3.select(visAreaRef.current); + if (visArea?.empty()) return; + + if (yValue || yValue === 0) { + // Y Axis Label + const axisTopEdge = margin.top - 1; + const axisBottomEdge = height - margin.top; + const yAxisValueHeight = + yAxisLabelNodeRef.current?.node()?.offsetHeight || 0; + const y = attrRef.current.yScale(yValue); + const top = + y - yAxisValueHeight / 2 < 0 + ? axisTopEdge + yAxisValueHeight / 2 + : y + axisTopEdge + yAxisValueHeight / 2 > axisBottomEdge + ? axisBottomEdge - yAxisValueHeight / 2 + : y + axisTopEdge; + + const right = width - margin.left; + const maxWidth = margin.left - 5; + + if (yAxisLabelNodeRef.current && yAxisValueHeight) { + // update y-axis label + yAxisLabelNodeRef.current + .attr('title', yValue) + .style('top', `${top}px`) + .style('right', `${right}px`) + .style('max-width', `${maxWidth}px`) + .text(yValue); + } else { + // create y-axis label + yAxisLabelNodeRef.current = visArea + .append('div') + .attr('class', 'ChartMouseValue ChartMouseValueYAxis') + .attr('title', yValue) + .style('top', `${top}px`) + .style('right', `${right}px`) + .style('max-width', `${maxWidth}px`) + .text(yValue); + } + } + } + } + + function drawHighlightedLines(dataSelector?: string): void { + if (dataSelector && highlightMode !== HighlightEnum.Off) { + highlightedNodeRef.current + ?.classed('highlighted', false) + .classed('active', false); + + highlightedNodeRef.current = linesNodeRef.current + .selectAll(`[data-selector=${dataSelector}]`) + .classed('highlighted', true) + .raise(); + } + } + + function drawActiveLine(key: string): void { + if (attrRef.current.lineKey) { + linesNodeRef.current + .select(`[id=Line-${attrRef.current.lineKey}]`) + .classed('active', false); + } + + const newActiveLine = linesNodeRef.current.select(`[id=Line-${key}]`); + if (!newActiveLine.empty()) { + const dataSelector = newActiveLine.attr('data-selector'); + drawHighlightedLines(dataSelector); + // set active line + newActiveLine.classed('active', true).raise(); + if (aggregationConfig?.isApplied) { + const groupKey = newActiveLine.attr('groupKey'); + drawActiveAggrLine(groupKey); + if (aggregationConfig.methods.area !== AggregationAreaMethods.NONE) { + drawActiveAggrArea(groupKey); + } + } + + attrRef.current.lineKey = key; + attrRef.current.dataSelector = dataSelector; + } + } + + function drawActiveAggrLine( + nextGroupKey: string, + prevGroupKey = attrRef.current.groupKey, + ): void { + if (prevGroupKey) { + linesNodeRef.current + .select(`[id=AggrLine-${attrRef.current.groupKey}]`) + .classed('highlighted', false); + } + linesNodeRef.current + .select(`[id=AggrLine-${nextGroupKey}]`) + .classed('highlighted', true) + .raise(); + } + + function drawActiveAggrArea( + nextGroupKey: string, + prevGroupKey = attrRef.current.groupKey, + ): void { + if (prevGroupKey) { + linesNodeRef.current + .select(`[id=AggrArea-${attrRef.current.groupKey}]`) + .classed('highlighted', false); + } + + linesNodeRef.current + .select(`[id=AggrArea-${nextGroupKey}]`) + .classed('highlighted', true) + .raise(); + + attrRef.current.groupKey = nextGroupKey; + } + + function drawVerticalAxisLine(x: number): void { + if (drawAxisLines.y && plotBoxRef.current) { + const { height, width } = plotBoxRef.current; + + const boundedHoverLineX = x < 0 ? 0 : x > width ? width : x; + + const axisLineData: IAxisLineData = { + // hoverLine-y projection + x1: boundedHoverLineX, + y1: 0, + x2: boundedHoverLineX, + y2: height, + }; + + const hoverLineY = attrNodeRef.current.select('#HoverLine-y'); + + // Draw vertical axis line + if (!hoverLineY.empty()) { + // update vertical hoverLine + hoverLineY + .attr('x1', axisLineData.x1.toFixed(2)) + .attr('y1', axisLineData.y1.toFixed(2)) + .attr('x2', axisLineData.x2.toFixed(2)) + .attr('y2', axisLineData.y2.toFixed(2)); + } else { + // create vertical hoverLine + attrNodeRef.current + .append('line') + .attr('id', 'HoverLine-y') + .attr('class', 'HoverLine') + .style('stroke', '#94999f') + .style('stroke-width', 1) + .style('stroke-dasharray', '4 2') + .style('fill', 'none') + .style('pointer-events', 'none') + .attr('x1', axisLineData.x1.toFixed(2)) + .attr('y1', axisLineData.y1.toFixed(2)) + .attr('x2', axisLineData.x2.toFixed(2)) + .attr('y2', axisLineData.y2.toFixed(2)) + .lower(); + } + } + } + + function clearHorizontalAxisLine(): void { + attrNodeRef.current.select('#HoverLine-x').remove(); + } + + function drawHorizontalAxisLine(y: number): void { + if (drawAxisLines.x) { + const { height, width } = plotBoxRef.current; + const boundedHoverLineY = y < 0 ? 0 : y > height ? height : y; + + const axisLineData: IAxisLineData = { + // hoverLine-x projection + x1: 0, + y1: boundedHoverLineY, + x2: width, + y2: boundedHoverLineY, + }; + + const hoverLineX = attrNodeRef.current.select('#HoverLine-x'); + + // Draw horizontal axis line + if (!hoverLineX.empty()) { + // update horizontal hoverLine + hoverLineX + .attr('x1', axisLineData.x1) + .attr('y1', axisLineData.y1) + .attr('x2', axisLineData.x2) + .attr('y2', axisLineData.y2); + } else { + // create horizontal hoverLine + attrNodeRef.current + .append('line') + .attr('id', 'HoverLine-x') + .attr('class', 'HoverLine') + .style('stroke', '#94999f') + .style('stroke-width', 1) + .style('stroke-dasharray', '4 2') + .style('fill', 'none') + .style('pointer-events', 'none') + .attr('x1', axisLineData.x1) + .attr('y1', axisLineData.y1) + .attr('x2', axisLineData.x2) + .attr('y2', axisLineData.y2) + .lower(); + } + } + } + + function drawActiveCircle(key: string, inProgress: boolean = false): void { + attrNodeRef.current + .select(`[id=Circle-${key}]`) + .attr('r', CircleEnum.ActiveRadius) + .classed('active', true) + .classed('inProgressLineIndicator', inProgress) + .raise(); + } + + function drawFocusedCircle(key: string, inProgress: boolean = false): void { + attrNodeRef.current + .selectAll('.HoverCircle') + .attr('r', CircleEnum.Radius) + .classed('active', false) + .classed('focus', false); + + attrNodeRef.current.select('.focus__shadow')?.remove(); + + const newFocusedPoint = attrNodeRef.current.select(`[id=Circle-${key}]`); + newFocusedPoint + .classed('focus', true) + .classed('inProgressLineIndicator', inProgress) + .attr('r', CircleEnum.ActiveRadius) + .raise(); + + attrNodeRef.current + .append('circle') + .classed('HoverCircle focus focus__shadow', true) + .attr('r', CircleEnum.ActiveRadius) + .attr('cx', newFocusedPoint.attr('cx')) + .attr('cy', newFocusedPoint.attr('cy')) + .attr('stroke', newFocusedPoint.attr('stroke')) + .attr('stroke-opacity', 0.4) + .lower(); + } + + function drawCircles(nearestCircles: INearestCircle[]): void { + attrNodeRef.current + .selectAll('.HoverCircle') + .data( + nearestCircles.filter( + (circle) => + !( + (axesScaleType.xAxis === ScaleEnum.Log && circle.x === 0) || + (axesScaleType.yAxis === ScaleEnum.Log && circle.y === 0) + ), + ), + ) + .join('circle') + .attr('class', 'HoverCircle') + .attr('id', (d: INearestCircle) => `Circle-${d.key}`) + .attr('clip-path', `url(#${nameKey}-circles-rect-clip-${id})`) + .attr('cx', (d: INearestCircle) => d.x.toFixed(2)) + .attr('cy', (d: INearestCircle) => d.y.toFixed(2)) + .attr('r', CircleEnum.Radius) + .attr('stroke', (d: INearestCircle) => d.color) + .attr('fill', (d: INearestCircle) => d.color) + .attr('stroke-opacity', 1) + .on('click', handlePointClick); + + updateActiveRunsIndicators(); + } + + function drawActiveRunsIndicators(data: IProcessedData[]): void { + const activeRuns = data?.filter((d) => d?.run?.props?.active) || []; + + attrNodeRef.current + ?.selectAll('.inProgressLineIndicator') + .data(activeRuns) + .join('circle') + .attr('id', (d: IProcessedData) => `inProgressLineIndicator-${d.key}`) + .attr('clip-path', `url(#${nameKey}-circles-rect-clip-${id})`) + .attr('class', 'inProgressLineIndicator') + .style('stroke', (d: IProcessedData) => d.color) + .style('fill', (d: IProcessedData) => d.color) + .attr('cx', (d: IProcessedData) => { + if (d.data.length > 0) { + const lastPoint = d.data[d.data.length - 1]; + return attrRef.current.xScale(lastPoint[0]).toFixed(2); + } + }) + .attr('cy', (d: IProcessedData) => { + if (d.data.length > 0) { + const lastPoint = d.data[d.data.length - 1]; + return attrRef.current.yScale(lastPoint[1]).toFixed(2); + } + }) + .attr('r', CircleEnum.InProgress) + .on('click', handlePointClick); + } + + function updateActiveRunsIndicators(): void { + attrNodeRef.current + ?.selectAll('.inProgressLineIndicator') + .attr('cx', (d: IProcessedData) => { + if (d.data?.length > 0) { + const lastPoint = d.data[d.data.length - 1]; + return attrRef.current.xScale(lastPoint[0]).toFixed(2); + } + }) + .attr('cy', (d: IProcessedData) => { + if (d.data?.length > 0) { + const lastPoint = d.data[d.data.length - 1]; + return attrRef.current.yScale(lastPoint[1]).toFixed(2); + } + }) + .raise(); + } + + function setLinesHighlightMode(): void { + linesNodeRef.current.classed( + 'highlight', + highlightMode !== HighlightEnum.Off, + ); + } + + function setCirclesHighlightMode(): void { + attrNodeRef.current.classed( + 'highlight', + highlightMode !== HighlightEnum.Off, + ); + } + + function getBoundedPosition( + xPos: number, + yPos: number, + ): { + boundedX: number; + boundedY: number; + } { + const [yMax, yMin] = attrRef.current.yScale.range(); + const [xMin, xMax] = attrRef.current.xScale.range(); + + return { + boundedY: yPos > yMax ? yMax : yPos < yMin ? yMin : yPos, + boundedX: xPos > xMax ? xMax : xPos < xMin ? xMin : xPos, + }; + } + + function getInvertedValue( + scaleType: ScaleEnum, + pos: number, + axisScale: IAxisScale, + reverse: boolean = false, // need to reverse domain for inverting Y axis value + rounded: boolean = true, + ): number | string { + if (scaleType === ScaleEnum.Point) { + return getDimensionValue({ + pos, + domainData: reverse ? axisScale.domain().reverse() : axisScale.domain(), + axisScale, + }); + } else { + return rounded + ? getRoundedValue(axisScale.invert(pos)) + : axisScale.invert(pos); + } + } + + function getActivePoint( + circle: INearestCircle, + xValue: string | number, + yValue: string | number, + ): IActivePoint { + const xPos = circle.x; + const yPos = circle.y; + const { boundedX, boundedY } = getBoundedPosition(xPos, yPos); + + const chartRect: DOMRect = + visAreaRef.current?.getBoundingClientRect() || {}; + + const rect = { + top: +(margin.top + boundedY - CircleEnum.ActiveRadius).toFixed(2), + bottom: +(margin.top + boundedY + CircleEnum.ActiveRadius).toFixed(2), + left: +(margin.left + boundedX - CircleEnum.ActiveRadius).toFixed(2), + right: +(margin.left + boundedX + CircleEnum.ActiveRadius).toFixed(2), + }; + // @TODO - remove "pointRect" after refactoring (removing old metrics explorer) + const pointRect = { + top: +(chartRect.top + rect.top).toFixed(2), + bottom: +(chartRect.top + rect.bottom).toFixed(2), + left: +(chartRect.left + rect.left).toFixed(2), + right: +(chartRect.left + rect.right).toFixed(2), + }; + return { + key: circle.key, + xValue, + yValue, + xPos, + yPos, + inProgress: !!circle.inProgress, + chartIndex: index || 0, + visId: id, + pointRect, + rect, + }; + } + + function updateHoverAttributes(xValue: number, dataSelector?: string): void { + const mouseX = attrRef.current.xScale(xValue) || 0; + const nearestCircles = getNearestCircles(mouseX); + + drawHighlightedLines(dataSelector); + + setLinesHighlightMode(); + setCirclesHighlightMode(); + + clearHorizontalAxisLine(); + clearYAxisLabel(); + + drawVerticalAxisLine(mouseX); + drawCircles(nearestCircles); + + const newXValue = getInvertedValue( + axesScaleType.xAxis, + mouseX, + attrRef.current.xScale, + ); + + drawXAxisLabel(newXValue); + attrRef.current.currentXValue = newXValue; + attrRef.current.dataSelector = dataSelector; + attrRef.current.nearestCircles = nearestCircles; + } + + function clearHoverAttributes(): void { + attrRef.current.activePoint = undefined; + attrRef.current.lineKey = undefined; + attrRef.current.dataSelector = undefined; + + linesNodeRef.current.classed('highlight', false); + attrNodeRef.current.classed('highlight', false); + + linesNodeRef.current + .selectAll('path') + .classed('highlighted', false) + .classed('active', false); + + attrNodeRef.current + .selectAll('.HoverCircle') + .attr('r', CircleEnum.Radius) + .classed('active', false) + .classed('focus', false); + + clearHorizontalAxisLine(); + clearYAxisLabel(); + } + + function drawAttributes( + circle: INearestCircle, + nearestCircles: INearestCircle[], + force: boolean = false, + ): IActivePoint { + // hover line changed case + if (force || circle.key !== attrRef.current.lineKey) { + setLinesHighlightMode(); + drawActiveLine(circle.key); + } + + const xValue: number | string = getInvertedValue( + axesScaleType.xAxis, + circle.x, + attrRef.current.xScale, + ); + const yValue: number | string = getInvertedValue( + axesScaleType.yAxis, + circle.y, + attrRef.current.yScale, + true, + ); + + // hover circle changed case + if ( + force || + circle.key !== attrRef.current.activePoint?.key || + circle.x !== attrRef.current.activePoint?.xPos || + circle.y !== attrRef.current.activePoint?.yPos || + !_.isEqual(attrRef.current.nearestCircles, nearestCircles) + ) { + setCirclesHighlightMode(); + drawVerticalAxisLine(circle.x); + drawHorizontalAxisLine(circle.y); + drawXAxisLabel(xValue); + drawYAxisLabel(yValue); + drawCircles(nearestCircles); + drawActiveCircle(circle.key, circle.inProgress); + } + + const activePoint = getActivePoint(circle, xValue, yValue); + attrRef.current.currentXValue = activePoint.xValue; + attrRef.current.activePoint = activePoint; + attrRef.current.nearestCircles = nearestCircles; + return activePoint; + } + + function updateFocusedChart(args: IUpdateFocusedChartArgs = {}): void { + const { xScale, yScale, focusedState, activePoint, dataSelector } = + attrRef.current; + + const { + mousePos, + focusedStateActive = focusedState?.active || false, + force = false, + } = args; + + let mousePosition: [number, number] | [] = []; + if (mousePos) { + mousePosition = mousePos; + } else if (focusedState?.active && focusedState.visId === id) { + mousePosition = [ + xScale(focusedState.xValue), + yScale(focusedState.yValue), + ]; + } else if (activePoint?.xValue && activePoint.yValue) { + mousePosition = [xScale(activePoint.xValue), yScale(activePoint.yValue)]; + } + + if (mousePosition?.length) { + const [mouseX, mouseY] = mousePosition; + const closestCircle = getClosestCircle(mouseX, mouseY, data); + if (closestCircle) { + const nearestCircles = getNearestCircles(closestCircle.x); + let activePoint = drawAttributes(closestCircle, nearestCircles, force); + if (focusedStateActive) { + drawFocusedCircle(activePoint.key, activePoint.inProgress); + } + const focusedState = getFocusedState(activePoint, focusedStateActive); + attrRef.current.focusedState = focusedState; + + safeSyncHoverState({ activePoint, focusedState, dataSelector }); + } + } else { + drawInitialAttributes(); + } + } + + function drawInitialAttributes() { + const { + xScale, + focusedState, + currentXValue = xScale.domain()[1], + } = attrRef.current; + + const xValue = focusedState?.active ? focusedState.xValue : currentXValue; + const mouseX = xScale(xValue); + + if (isNaN(xValue) || isNaN(mouseX)) return; + + const nearestCircles = getNearestCircles(mouseX); + clearHorizontalAxisLine(); + clearYAxisLabel(); + + if (focusedState?.active) { + setLinesHighlightMode(); + setCirclesHighlightMode(); + } + + drawVerticalAxisLine(mouseX); + drawCircles(nearestCircles); + + const newXValue = getInvertedValue( + axesScaleType.xAxis, + mouseX, + attrRef.current.xScale, + ); + drawXAxisLabel(newXValue); + attrRef.current.currentXValue = newXValue; + } + + function setActiveLineAndCircle( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ): void { + const { xScale, currentXValue, dataSelector } = attrRef.current; + if (currentXValue || currentXValue === 0) { + const mouseX = xScale(currentXValue); + const closestCircle = getNearestCircles(mouseX).find( + (c) => c.key === lineKey, + ); + if (closestCircle) { + safeSyncHoverState({ activePoint: null }); + // get nearestCircles depends on closestCircle.x position + const nearestCircles = getNearestCircles(closestCircle.x); + const activePoint = drawAttributes( + closestCircle, + nearestCircles, + force, + ); + if (focusedStateActive) { + drawFocusedCircle(activePoint.key, activePoint.inProgress); + } + const focusedState = getFocusedState(activePoint, focusedStateActive); + attrRef.current.focusedState = focusedState; + + safeSyncHoverState({ activePoint, focusedState, dataSelector }); + } + } + } + + function updateScales(xScale: IAxisScale, yScale: IAxisScale): void { + attrRef.current.xScale = xScale; + attrRef.current.yScale = yScale; + setScaledValues(data); + } + + // Interactions + function safeSyncHoverState(args: ISyncHoverStateArgs): void { + if (typeof syncHoverState === 'function') { + syncHoverState(args); + } + } + + function handlePointClick(this: SVGElement, event: MouseEvent): void { + if (attrRef.current.focusedState?.visId !== id) { + safeSyncHoverState({ activePoint: null }); + } + const mousePos = d3.pointer(event); + const [mouseX, mouseY] = mousePos; + const closestCircle = getClosestCircle(mouseX, mouseY, data); + if (closestCircle) { + const nearestCircles = getNearestCircles(closestCircle.x); + let activePoint = drawAttributes(closestCircle, nearestCircles, true); + const focusedState = getFocusedState(activePoint, true); + attrRef.current.focusedState = focusedState; + + drawFocusedCircle(activePoint.key, activePoint.inProgress); + safeSyncHoverState({ + activePoint, + focusedState, + dataSelector: attrRef.current.dataSelector, + }); + } + } + + function getFocusedState( + activePoint: IActivePoint, + focusedStateActive: boolean = false, + ): IFocusedState { + return { + active: focusedStateActive, + key: activePoint.key, + xValue: activePoint.xValue, + yValue: activePoint.yValue, + chartIndex: activePoint.chartIndex, + visId: activePoint.visId, + }; + } + + function handleLineClick(this: SVGElement, event: MouseEvent): void { + if (attrRef.current.focusedState?.visId !== id) { + safeSyncHoverState({ activePoint: null }); + } + const mousePos = d3.pointer(event); + updateFocusedChart({ mousePos, focusedStateActive: false, force: true }); + } + + function handleLeaveFocusedPoint(event: MouseEvent): void { + if (attrRef.current.focusedState?.visId !== id) { + safeSyncHoverState({ activePoint: null }); + } + const mousePos = d3.pointer(event); + updateFocusedChart({ + mousePos: [ + Math.floor(mousePos[0]) - margin.left, + Math.floor(mousePos[1]) - margin.top, + ], + force: true, + focusedStateActive: false, + }); + } + + function handleMouseMove(event: MouseEvent): void { + if (attrRef.current.focusedState?.active) { + return; + } + const mousePos = d3.pointer(event); + if (isMouseInVisArea(mousePos[0], mousePos[1])) { + rafID = window.requestAnimationFrame(() => { + updateFocusedChart({ + mousePos: [ + Math.floor(mousePos[0]) - margin.left, + Math.floor(mousePos[1]) - margin.top, + ], + focusedStateActive: false, + }); + }); + } + } + + function handleMouseLeave(event: MouseEvent): void { + if (attrRef.current.focusedState?.active) { + return; + } + const mousePos = d3.pointer(event); + if (!isMouseInVisArea(mousePos[0], mousePos[1])) { + if (rafID) { + window.cancelAnimationFrame(rafID); + } + clearHoverAttributes(); + safeSyncHoverState({ activePoint: null }); + } + } + + function setScaledValues( + data: HoverAttrData[], + xScale = attrRef.current?.xScale, + yScale = attrRef.current?.yScale, + ): void { + if (attrRef.current && xScale && yScale) { + attrRef.current.scaledValues = []; + for (let i = 0; i < data.length; i++) { + attrRef.current.scaledValues.push( + data[i].data.xValues.map((xValue, index) => ({ + x: xScale(xValue) as number, + y: yScale(data[i].data.yValues[index]) as number, + })), + ); + } + } + } + + attrRef.current.updateScales = updateScales; + attrRef.current.setActiveLineAndCircle = setActiveLineAndCircle; + attrRef.current.updateHoverAttributes = updateHoverAttributes; + attrRef.current.updateFocusedChart = updateFocusedChart; + attrRef.current.clearHoverAttributes = clearHoverAttributes; + + svgNodeRef.current?.on('mousemove', handleMouseMove); + svgNodeRef.current?.on('mouseleave', handleMouseLeave); + linesNodeRef.current?.on('click', handleLineClick); + bgRectNodeRef.current?.on('click', handleLeaveFocusedPoint); + + // call on every render + setScaledValues(data); + drawActiveRunsIndicators(processedData); + if (attrRef.current.focusedState?.key) { + updateFocusedChart({ force: true }); + } else { + drawInitialAttributes(); + } +} +export default drawHoverAttributes; diff --git a/src/src/utils/d3/drawLegends.ts b/src/src/utils/d3/drawLegends.ts new file mode 100644 index 00000000..12349a8e --- /dev/null +++ b/src/src/utils/d3/drawLegends.ts @@ -0,0 +1,441 @@ +import * as d3 from 'd3'; +import _ from 'lodash-es'; + +import { + LegendsDataType, + LegendColumnDataType, +} from 'components/VisualizationLegends'; + +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import changeDasharraySize from '../changeDasharraySize'; +import shortenRunPropLabel from '../shortenRunPropLabel'; +import { GroupType } from '../../modules/core/pipeline'; + +interface DrawLegendsArgs { + data?: LegendsDataType; + containerNode: HTMLDivElement | null; + readOnly?: boolean; +} +interface GroupLegendProp { + title: string; + label: { + key: string; + element: string; + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => void; + }; +} + +const config = { + margin: { top: 8, right: 8, bottom: 8, left: 8 }, + groupsGap: 20, + groupTitle: { + marginTop: 10, + fontSize: '12px', + fontFamily: 'Inter, sans-serif', + fontWeight: 600, + }, + cellTitle: { + height: 20, + fontWeight: 600, + margin: 20, + maxWidth: 100, + }, + cell: { + height: 20, + fontSize: '11px', + fontFamily: 'Inter, sans-serif', + fontWeight: 400, + }, + columnGap: 15, + label: { + width: 25, + fontFamily: 'Inconsolata, monospace', + }, + defaultColor: '#484f56', +}; + +const getGroupLegendProps: Record GroupLegendProp> = + { + [GroupNameEnum.CHART]: (title = 'Charts') => ({ + title, + label: { + key: '#', + element: 'text', + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => { + const y = + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height; + + element + ?.attr('y', y) + .attr('fill', '#484f56') + .style('outline', '1px solid #dee6f3') + .style('border-radius', '1px') + .style('padding', '2px') + .style('white-space', 'pre') + .text(` ${(cell.chartIndex || 0) + 1} `) + .style('font-family', config.label.fontFamily); + }, + }, + }), + [GroupType.COLOR]: (title = 'Colors') => ({ + title, + label: { + key: '', + element: 'line', + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => { + const y = + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height; + + element + ?.attr('stroke', cell.color || config.defaultColor) + .attr('stroke-dasharray', 'none') + .attr('stroke-width', 2) + .attr('x1', 0) + .attr('x2', config.label.width) + .attr('y1', y - 4) + .attr('y2', y - 4); + }, + }, + }), + [GroupType.STROKE]: (title = 'Stroke styles') => ({ + title, + label: { + key: '', + element: 'line', + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => { + const y = + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height; + + element + ?.attr('stroke', config.defaultColor) + .attr( + 'stroke-dasharray', + changeDasharraySize(cell.dasharray, 3 / 5), + ) + .attr('stroke-width', 2) + .attr('x1', 0) + .attr('x2', config.label.width) + .attr('y1', y - 4) + .attr('y2', y - 4) + .attr('font-family', config.cell.fontFamily); + }, + }, + }), + [GroupType.ROW]: (title = 'Rows') => ({ + title, + label: { + key: '#', + element: 'text', + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => { + const y = + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height; + + element + ?.attr('y', y) + .attr('fill', '#484f56') + .style('outline', '1px solid #dee6f3') + .style('border-radius', '1px') + .style('padding', '2px') + .style('white-space', 'pre') + .text(` ${(cell.order || 0) + 1} `) + .style('font-family', config.label.fontFamily); + }, + }, + }), + [GroupType.COLUMN]: (title = 'Columns') => ({ + title, + label: { + key: '#', + element: 'text', + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => { + const y = + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height; + + element + ?.attr('y', y) + .attr('fill', '#484f56') + .style('outline', '1px solid #dee6f3') + .style('border-radius', '1px') + .style('padding', '2px') + .style('white-space', 'pre') + .text(` ${(cell.order || 0) + 1} `) + .style('font-family', config.label.fontFamily); + }, + }, + }), + default: (title: string = '') => ({ + title, + label: { + key: '', + element: 'text', + setAttr: ( + cell: LegendColumnDataType, + element: d3.Selection, + cellIndex: number, + ) => { + const y = + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height; + + element?.attr('y', y); + }, + }, + }), + }; + +function drawLegends({ + data = {}, + containerNode, + readOnly, +}: DrawLegendsArgs): void { + if (!containerNode || _.isEmpty(data)) { + return; + } + const { svgWrapper, bgRect, groupsWrapper } = drawLegendArea( + containerNode, + readOnly, + ); + const { margin, groupsGap } = config; + let currentGroupHeight = 0; + for (const [legendName, legend] of Object.entries(data)) { + const groupElement = drawLegend( + legendName, + legend, + groupsWrapper, + currentGroupHeight, + ); + if (groupElement) { + currentGroupHeight += groupElement.node()?.getBBox().height || 0; + currentGroupHeight += groupsGap; + } + } + const { width: groupsWrapperWidth = 0, height: groupsWrapperHeight = 0 } = + groupsWrapper.node()?.getBBox() || {}; + + const svgWidth = margin.left + margin.right + groupsWrapperWidth; + const svgHeight = margin.top + margin.bottom + groupsWrapperHeight; + + bgRect.attr('height', svgHeight).attr('width', svgWidth); + svgWrapper.attr('height', svgHeight).attr('width', svgWidth); +} + +function drawLegendArea( + containerNode: HTMLDivElement | null, + readOnly: boolean = false, +) { + const container = d3.select(containerNode); + container.select('*')?.remove(); + + const { margin, defaultColor } = config; + + const svgWrapper = container + .append('svg') + .attr('xmlns', 'http://www.w3.org/2000/svg') + .attr('class', 'Legends') + .style('fill', 'transparent') + .raise(); + + const bgRect = svgWrapper + .append('rect') + .attr('x', 0) + .attr('y', 0) + .attr('class', 'Legends-bgRect') + .style('fill', 'transparent'); + + if (readOnly) { + bgRect.style('stroke-width', 1).style('stroke', '#bdcee8'); + } + + const groupsWrapper = svgWrapper + .append('g') + .attr('class', 'Legend-groups-wrapper') + .attr('transform', `translate(${margin.left}, ${margin.top})`) + .style('fill', defaultColor); + + return { svgWrapper, groupsWrapper, bgRect }; +} + +function drawLegend( + legendName: string, + legend: Record, + wrapperGroup: d3.Selection, + currentGroupHeight: number, +) { + if (_.isEmpty(legend)) { + return; + } + + const groupElement = wrapperGroup + .append('g') + .attr('id', `Legend-group-${legendName}`) + .attr('transform', `translate(${0}, ${currentGroupHeight})`); + + const cb = getGroupLegendProps[legendName] || getGroupLegendProps.default; + const groupLegendProp = cb(); + + // group title + groupElement + .append('text') + .text(groupLegendProp.title) + .attr('font-size', config.groupTitle.fontSize) + .attr('font-weight', config.groupTitle.fontWeight) + .attr('font-family', config.groupTitle.fontFamily) + .attr('y', config.groupTitle.marginTop) + .style('text-transform', 'uppercase'); + + drawLegendColumns( + legendName, + Object.entries(legend), + groupElement, + config.groupTitle.marginTop, + groupLegendProp, + ); + + return groupElement; +} + +function drawLegendColumns( + legendName: string, + columns: [string, LegendColumnDataType[]][] = [], + wrapperGroup: d3.Selection, + groupYPos: number, + groupLegendProp: GroupLegendProp, +) { + if (columns.length === 0) { + return; + } + + const labelColumnCells = columns[0][1]; + // column labels + drawLegendColumn( + legendName, + groupLegendProp.label.key, + labelColumnCells, + wrapperGroup, + { x: 0, y: groupYPos }, + groupLegendProp.label, + ); + + let currentColumnWidth = config.label.width + config.columnGap; + + for (let [columnKey, columnCells] of columns) { + const columnWrapper = drawLegendColumn( + legendName, + columnKey, + columnCells, + wrapperGroup, + { + x: currentColumnWidth, + y: groupYPos, + }, + ); + + if (columnWrapper) { + currentColumnWidth += columnWrapper.node()?.getBBox().width || 0; + currentColumnWidth += config.columnGap; + } + } +} + +function drawLegendColumn( + legendName: string, + columnKey: string, + columnCells: LegendColumnDataType[] = [], + wrapperGroup: d3.Selection, + groupPos: { x: number; y: number }, + label?: GroupLegendProp['label'], +) { + if (columnCells.length === 0) { + return; + } + + const columnGroup = wrapperGroup + .append('g') + .attr('class', `Legend-${legendName}-column`) + .attr('font-size', config.cell.fontSize) + .attr('font-family', config.cell.fontFamily) + .attr('font-weight', config.cell.fontWeight) + .attr('transform', `translate(${groupPos.x}, ${groupPos.y})`); + + const { shortenValue } = shortenRunPropLabel( + columnKey, + config.cellTitle.maxWidth, + ); + + // column title + columnGroup + .append('text') + .text(shortenValue) + .attr('font-weight', config.cellTitle.fontWeight) + .attr('x', 0) + .attr('y', config.cellTitle.height) + .append('svg:title') + .text(columnKey); + + if (label) { + // column label + columnGroup + .selectAll('.Legend-label') + .data(columnCells) + .join(label.element) + .attr('class', 'Legend-label') + .each((d, i, nodes) => label.setAttr(d, d3.select(nodes[i]), i)); + } else { + // column cells + columnGroup + .selectAll('.Legend-cell') + .data(columnCells) + .join('text') + .attr('class', 'Legend-cell') + .text((cell) => cell.value) + .attr('fill', (cell) => cell.color || config.defaultColor) + .attr('x', 0) + .attr( + 'y', + (cell, cellIndex) => + config.cellTitle.height + + config.cellTitle.margin + + cellIndex * config.cell.height, + ); + } + + return columnGroup; +} + +export default drawLegends; diff --git a/src/src/utils/d3/drawLines.ts b/src/src/utils/d3/drawLines.ts new file mode 100644 index 00000000..0ac04876 --- /dev/null +++ b/src/src/utils/d3/drawLines.ts @@ -0,0 +1,129 @@ +import { IDrawLinesArgs } from 'types/utils/d3/drawLines'; +import { + IProcessedAggrData, + IProcessedData, +} from 'types/utils/d3/processLineChartData'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { AggregationAreaMethods } from 'utils/aggregateGroupData'; +import { CurveEnum, HighlightEnum } from 'utils/d3'; + +import lineGenerator from './lineGenerator'; +import areaGenerator from './areaGenerator'; + +function drawLines(args: IDrawLinesArgs): void { + const { + id, + nameKey, + xScale, + yScale, + linesRef, + linesNodeRef, + curveInterpolation, + highlightMode, + aggregationConfig, + processedData, + processedAggrData, + } = args; + + if (!linesNodeRef?.current) { + return; + } + + linesRef.current.updateScales = function ( + xScale: IAxisScale, + yScale: IAxisScale, + curve?: CurveEnum, + ): void { + linesNodeRef.current + .selectAll('.Line') + .attr('d', lineGenerator(xScale, yScale, curve)); + }; + + linesRef.current.updateLines = function (data: IProcessedData[]): void { + linesNodeRef.current + ?.selectAll('.Line') + .data(data) + .join('path') + .attr('class', `Line ${aggregationConfig?.isApplied ? 'aggregated' : ''}`) + .attr('id', (d: IProcessedData) => `Line-${d.key}`) + .attr('clip-path', `url(#${nameKey}-lines-rect-clip-${id})`) + .attr('groupKey', (d: IProcessedData) => d.groupKey) + .attr( + 'data-selector', + (d: IProcessedData) => + `Line-Sel-${highlightMode}-${d.selectors?.[highlightMode]}`, + ) + .style('fill', 'none') + .style('stroke', (d: IProcessedData) => d.color) + .style('stroke-dasharray', (d: IProcessedData) => d.dasharray) + .data(data.map((d: IProcessedData) => d.data)) + .attr('d', lineGenerator(xScale, yScale, curveInterpolation)); + }; + + linesRef.current.updateAggregatedAreasScales = function ( + xScale: IAxisScale, + yScale: IAxisScale, + ): void { + linesNodeRef.current + .selectAll('.AggrArea') + .attr('d', areaGenerator(xScale, yScale)); + }; + + linesRef.current.updateAggregatedAreas = function ( + data: IProcessedAggrData[], + ): void { + linesNodeRef.current + .selectAll('.AggrArea') + .data(data) + .join('path') + .attr('class', 'AggrArea') + .attr('id', (d: IProcessedAggrData) => `AggrArea-${d.key}`) + .attr('clip-path', `url(#${nameKey}-lines-rect-clip-${id})`) + .attr('fill', (d: IProcessedAggrData) => d.color) + .attr('fill-opacity', '0.3') + .data(data.map((d: IProcessedAggrData) => d?.area || [])) + .attr('d', areaGenerator(xScale, yScale)); + }; + + linesRef.current.updateAggregatedLinesScales = function ( + xScale: IAxisScale, + yScale: IAxisScale, + curve?: CurveEnum, + ): void { + linesNodeRef.current + .selectAll('.AggrLine') + .attr('d', lineGenerator(xScale, yScale, curve)); + }; + + linesRef.current.updateAggregatedLines = function ( + data: IProcessedAggrData[], + ): void { + linesNodeRef.current + .selectAll('.AggrLine') + .data(data) + .join('path') + .attr('class', 'AggrLine') + .attr('id', (d: IProcessedAggrData) => `AggrLine-${d.key}`) + .attr('clip-path', `url(#${nameKey}-lines-rect-clip-${id})`) + .style('fill', 'none') + .style('stroke', (d: IProcessedAggrData) => d.color) + .style('stroke-dasharray', (d: IProcessedAggrData) => d.dasharray) + .data(data.map((d: IProcessedAggrData) => d.line || [])) + .attr('d', lineGenerator(xScale, yScale, curveInterpolation)); + }; + + if (aggregationConfig?.isApplied) { + if (aggregationConfig.methods.area !== AggregationAreaMethods.NONE) { + linesRef.current.updateAggregatedAreas(processedAggrData); + } + linesRef.current.updateAggregatedLines(processedAggrData); + if (highlightMode !== HighlightEnum.Off) { + linesRef.current.updateLines(processedData); + } + } else { + linesRef.current.updateLines(processedData); + } +} + +export default drawLines; diff --git a/src/src/utils/d3/drawParallelAxes.ts b/src/src/utils/d3/drawParallelAxes.ts new file mode 100644 index 00000000..d5c883a1 --- /dev/null +++ b/src/src/utils/d3/drawParallelAxes.ts @@ -0,0 +1,137 @@ +import _ from 'lodash-es'; +import * as d3 from 'd3'; + +import { + IDrawParallelAxesProps, + YScaleType, +} from 'types/utils/d3/drawParallelAxes'; + +import { getAxisScale, ScaleEnum } from 'utils/d3'; +import { formatSystemMetricName } from 'utils/formatSystemMetricName'; +import { isSystemMetric } from 'utils/isSystemMetric'; + +import getColorFromRange from './getColorFromRange'; +import { formatYAxisByDefault } from './tickFormatting'; + +function drawParallelAxes({ + axesNodeRef, + visBoxRef, + attributesRef, + axesRef, + dimensions, + plotBoxRef, +}: IDrawParallelAxesProps): void { + if (!axesNodeRef?.current && !dimensions && _.isEmpty(dimensions)) { + return; + } + const keysOfDimensions = Object.keys(dimensions); + const { width, height, margin } = visBoxRef.current; + const xScale = getAxisScale({ + domainData: keysOfDimensions, + rangeData: [0, width - margin.left - margin.right], + scaleType: ScaleEnum.Point, + }); + axesRef.current.yAxes = {}; + + const yScale: YScaleType = {}; + + function getFormattedYAxis(scale: d3.AxisScale) { + const { yAxis } = formatYAxisByDefault({ + scale, + tickAdditionalConfig: { + distance: 30, + }, + drawTickLines: { + tickSize: -width + (margin.left + margin.right), + }, + plotBoxRef, + scaleType: ScaleEnum.Point, + }); + return yAxis; + } + + keysOfDimensions.forEach((keyOfDimension: string, i: number) => { + const { domainData, scaleType, displayName, dimensionType } = + dimensions[keyOfDimension]; + const first = 0; + const last = keysOfDimensions.length - 1; + + const tmpYScale = getAxisScale({ + domainData, + scaleType, + rangeData: [height - margin.top - margin.bottom, 0], + }); + yScale[keyOfDimension] = tmpYScale; + const tickWidth = i === first ? 40 : plotBoxRef.current.width / last - 20; + const titleWidth = plotBoxRef.current.width / last; + + const yAxis = getFormattedYAxis(tmpYScale); + const axes = axesNodeRef.current + ?.append('g') + .attr('class', 'Axis') + .data([keyOfDimension]) + .attr('stroke-width', 0.6) + .attr('transform', `translate(${xScale(keyOfDimension)})`) + .call(yAxis); + + axes + ?.selectAll('.tick') + .append('foreignObject') + .attr('x', -tickWidth - 10) + .attr('y', -8) + .attr('height', 12) + .attr('width', tickWidth) + .html( + (d: string) => + `
${d}
`, + ); + + const dimensionTitleWidth = + i === first || i === last ? titleWidth : titleWidth * 2; + + axes + ?.append('foreignObject') + .attr('width', dimensionTitleWidth) + .attr('height', 20) + .attr( + 'transform', + `translate(${ + i === first + ? 0 + : i === last + ? -dimensionTitleWidth + : -dimensionTitleWidth / 2 + }, ${i % 2 === 0 ? -25 : -40})`, + ) + .html(() => { + let [label1, label2 = ''] = displayName.split(' '); + const styledLabel2 = label2 + ? `${label2}` + : ''; + let label = isSystemMetric(label1) + ? formatSystemMetricName(label1) + : label1; + return ` +
+
${label} ${styledLabel2}
+
+ `; + }); + + axesRef.current.yAxes[keyOfDimension] = axes; + }); + + attributesRef.current.xScale = xScale; + attributesRef.current.yScale = yScale; + const lastYScale = + attributesRef.current.yScale[keysOfDimensions[keysOfDimensions.length - 1]]; + const range = lastYScale?.range(); + if (range) { + attributesRef.current.yColorIndicatorScale = getColorFromRange(range); + } +} + +export default drawParallelAxes; diff --git a/src/src/utils/d3/drawParallelAxesBrush.ts b/src/src/utils/d3/drawParallelAxesBrush.ts new file mode 100644 index 00000000..e01b8748 --- /dev/null +++ b/src/src/utils/d3/drawParallelAxesBrush.ts @@ -0,0 +1,206 @@ +import * as d3 from 'd3'; +import _ from 'lodash-es'; + +import { ILineDataType } from 'types/utils/d3/drawParallelLines'; +import { + IDrawParallelAxesBrushBrushArgs, + IFilterDataByBrushedScaleProps, + DomainsDataType, +} from 'types/utils/d3/drawParallelAxesBrush'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +function drawParallelAxesBrush({ + brushRef, + plotBoxRef, + plotNodeRef, + dimensions, + data, + visBoxRef, + linesRef, + brushExtents, + onAxisBrushExtentChange, + attributesRef, + index, +}: IDrawParallelAxesBrushBrushArgs): void { + if (!brushRef.current.domainsData) { + brushRef.current.xScale = attributesRef.current.xScale; + brushRef.current.yScale = { ...attributesRef.current.yScale }; + brushRef.current.updateLinesAndHoverAttributes = + updateLinesAndHoverAttributes; + brushRef.current.domainsData = Object.keys(dimensions).reduce( + (acc: DomainsDataType, keyOfDimension: string) => { + acc[keyOfDimension] = dimensions[keyOfDimension].domainData; + return acc; + }, + {}, + ); + } + + function handleBrushChange( + event: d3.D3BrushEvent, + keyOfDimension: string, + ): void { + if (brushRef.current.yScale[keyOfDimension]) { + brushRef.current.yScale = { + ...attributesRef.current.yScale, + ...brushRef.current.yScale, + }; + } + const extent: d3.BrushSelection | any = event.selection; + let brushPosition: [number, number] | [string, string] | null = null; + if (!_.isNil(extent) && brushRef.current?.yScale?.[keyOfDimension]) { + if (dimensions[keyOfDimension].scaleType === 'point') { + const domainData = scalePointDomainData( + brushRef.current.yScale[keyOfDimension], + extent, + ); + brushRef.current.domainsData[keyOfDimension] = domainData; + brushPosition = [domainData[0], _.last(domainData)] as [string, string]; + } else { + const top: number = brushRef.current.yScale[keyOfDimension].invert( + extent[0], + ); + const bottom: number = brushRef.current.yScale[keyOfDimension].invert( + extent[1], + ); + brushRef.current.domainsData[keyOfDimension] = [bottom, top]; + brushPosition = [bottom, top]; + } + } else { + brushRef.current.domainsData[keyOfDimension] = + dimensions[keyOfDimension].domainData; + } + if (event.type === 'end') { + onAxisBrushExtentChange(keyOfDimension, brushPosition, index); + } + updateLinesAndHoverAttributes({ keyOfDimension }); + } + + function updateLinesAndHoverAttributes({ + keyOfDimension, + mouse, + }: { + keyOfDimension?: string; + mouse?: number[]; + }) { + const filteredData = data.filter((line: ILineDataType) => + filterDataByBrushedScale({ + line, + domainsData: brushRef.current.domainsData, + dimensions, + attributesRef, + }), + ); + linesRef.current.updateLines(filteredData); + linesRef.current.data = filteredData; + + if ( + (!_.isNil(attributesRef.current.focusedState?.yValue) && + !_.isNil(keyOfDimension)) || + mouse + ) { + attributesRef.current.updateFocusedChart({ + mouse: mouse ?? [ + brushRef.current?.xScale?.(keyOfDimension) ?? 0, + brushRef.current?.yScale?.[keyOfDimension ?? 0]?.( + attributesRef.current.focusedState?.yValue, + ) + visBoxRef.current.margin.top, + ], + force: true, + }); + } + } + + function handleBrushStart(event: d3.D3BrushEvent): void { + event?.sourceEvent?.stopPropagation(); + } + const brushHeight = plotBoxRef.current.height; + plotNodeRef.current + .selectAll('.Axis') + .append('g') + .attr('class', 'axisBrush') + .each(function (this: any, keyOfDimension: string) { + const brushExtent = brushExtents?.[index]?.[keyOfDimension]; + d3.select(this).call( + d3 + .brushY() + .extent([ + [-15, 0], + [15, brushHeight], + ]) + .handleSize(4) + .on('start', handleBrushStart) + .on('brush', (event) => handleBrushChange(event, keyOfDimension)) + .on('end', (event) => handleBrushChange(event, keyOfDimension)), + ); + if (brushExtent) { + const yScale = brushRef.current.yScale[keyOfDimension]; + const extent = [yScale(brushExtent[1]), yScale(brushExtent[0])]; + if (!_.isNil(extent[0]) && !_.isNil(extent[1])) { + d3.select(this).call(d3.brush().handleSize(4).move, [ + [-15, extent[0]], + [15, extent[1]], + ]); + handleBrushChange( + { + selection: extent, + } as any, + keyOfDimension, + ); + } else { + onAxisBrushExtentChange(keyOfDimension, null, index); + } + } + }); +} + +function scalePointDomainData(yScale: IAxisScale, extent: number[]): string[] { + const domain: string[] = yScale.domain(); + const resultDomainData: string[] = []; + domain.forEach((item: string) => { + const yPosOfDomain = yScale(item); + if (yPosOfDomain >= extent[0] && yPosOfDomain <= extent[1]) { + resultDomainData.push(item); + } + }); + + return resultDomainData; +} + +function filterDataByBrushedScale({ + line, + domainsData, + dimensions, + attributesRef, +}: IFilterDataByBrushedScaleProps) { + const keysOfDimension: string[] = Object.keys(dimensions); + if ( + attributesRef?.current?.focusedState?.active && + attributesRef.current.focusedState.key === line.key + ) { + return true; + } + + const { values } = line; + for (let i = 0; i < keysOfDimension.length; i++) { + const keyOfDimension = keysOfDimension[i]; + const value: string | number | null = values[keyOfDimension]; + const domainData: Array = + domainsData[keyOfDimension] ?? dimensions?.[keyOfDimension]?.domainData; + const { scaleType } = dimensions[keyOfDimension]; + + if ( + value !== null && + ((scaleType === 'point' && !domainData?.includes(value)) || + (scaleType !== 'point' && + !_.isNil(domainData) && + (domainData[0] > value || domainData[1] < value))) + ) { + return false; + } + } + + return true; +} + +export default drawParallelAxesBrush; diff --git a/src/src/utils/d3/drawParallelColorIndicator.ts b/src/src/utils/d3/drawParallelColorIndicator.ts new file mode 100644 index 00000000..6e621a85 --- /dev/null +++ b/src/src/utils/d3/drawParallelColorIndicator.ts @@ -0,0 +1,43 @@ +import { IDrawParallelColorIndicator } from 'types/utils/d3/drawParallelColorIndicator'; + +import { gradientStartColor, gradientEndColor } from './index'; + +function drawParallelColorIndicator({ + index, + plotBoxRef, + plotNodeRef, +}: IDrawParallelColorIndicator): void { + const linearGradientNode = plotNodeRef.current + .append('linearGradient') + .attr('id', `ParCoordsGradient-${index}`) + .attr('class', 'ParCoordsGradient') + .attr('x1', 0) + .attr('x2', 0) + .attr('y1', 0) + .attr('y2', 1) + .lower(); + + linearGradientNode + .append('stop') + .attr('offset', '0%') + .attr('stop-color', gradientEndColor); + + linearGradientNode + .append('stop') + .attr('offset', '100%') + .attr('stop-color', gradientStartColor); + + plotNodeRef.current + .append('rect') + .attr('class', 'ParCoordsGradient__rect') + .attr('x', plotBoxRef.current.width + 1) + .attr('y', 0) + .attr('width', 15) + .attr('height', plotBoxRef.current.height) + .attr('stroke', '#777') + .attr('stroke-width', 1) + .attr('fill', `url(#ParCoordsGradient-${index})`) + .lower(); +} + +export default drawParallelColorIndicator; diff --git a/src/src/utils/d3/drawParallelHoverAttributes.ts b/src/src/utils/d3/drawParallelHoverAttributes.ts new file mode 100644 index 00000000..dc2e14f2 --- /dev/null +++ b/src/src/utils/d3/drawParallelHoverAttributes.ts @@ -0,0 +1,559 @@ +import * as d3 from 'd3'; +import _ from 'lodash-es'; + +import { + IActivePoint, + ISyncHoverStateArgs, +} from 'types/utils/d3/drawHoverAttributes'; +import { + IDrawParallelHoverAttributesArgs, + IParallelNearestCircle, + IUpdateParallelFocusedChartProps, +} from 'types/utils/d3/drawParallelHoverAttributes'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; +import { ILineDataType } from 'types/utils/d3/drawParallelLines'; +import { IFocusedState } from 'types/services/models/metrics/metricsAppModel'; + +import getRoundedValue from 'utils/roundValue'; + +import { CircleEnum, ScaleEnum } from './'; + +const drawParallelHoverAttributes = ({ + dimensions, + index, + id, + nameKey, + attributesNodeRef: attrNodeRef, + attributesRef: attrRef, + linesRef, + visAreaRef, + visBoxRef, + bgRectNodeRef, + isVisibleColorIndicator, + syncHoverState, + linesNodeRef, + highlightedNodeRef, + axesNodeRef, + svgNodeRef, +}: IDrawParallelHoverAttributesArgs) => { + let rafID = 0; + + const { margin, width, height } = visBoxRef.current; + + function isMouseInVisArea(x: number, y: number): boolean { + const padding = 5; + return ( + x > margin.left - padding && + x < width - margin.right + padding && + y > margin.top - padding && + y < height - margin.bottom + padding + ); + } + + const keysOfDimensions = Object.keys(dimensions); + + function getNearestCircles(mouseX: number): IParallelNearestCircle[] { + const { xScale, yScale } = attrRef.current; + const nearestCircles: IParallelNearestCircle[] = []; + for (const line of linesRef.current.data) { + const xAxesValues = keysOfDimensions.map((d: string) => xScale(d)); + const index = d3.bisectCenter(xAxesValues, mouseX); + const closestXPixel = xScale(keysOfDimensions[index]); + const closestYPixel = yScale[keysOfDimensions[index]]( + line.values[keysOfDimensions[index]], + ); + if (!_.isNil(closestYPixel)) { + nearestCircles.push({ + x: closestXPixel, + y: closestYPixel, + lastYScalePos: getColorIndicatorYPixel(line), + key: line.key, + values: line.values, + color: line.color, + }); + } + } + + return nearestCircles; + } + + function getClosestCircle( + nearestCircles: IParallelNearestCircle[], + mouseX: number, + mouseY: number, + ): IParallelNearestCircle { + let closestCircles: IParallelNearestCircle[] = []; + let minRadius = null; + // Find closest circles + for (let circle of nearestCircles) { + const rX = Math.abs(circle.x - mouseX); + const rY = Math.abs(circle.y - mouseY); + const r = Math.sqrt(Math.pow(rX, 2) + Math.pow(rY, 2)); + if (minRadius === null || r <= minRadius) { + if (r === minRadius) { + // Circle coordinates can be equal, to show only one circle on hover + // we need to keep array of closest circles + closestCircles.push(circle); + } else { + minRadius = r; + closestCircles = [circle]; + } + } + } + closestCircles.sort((a, b) => (a.key > b.key ? 1 : -1)); + return closestCircles[0]; + } + + function getLineCirclesOfClosestCircle( + closestCircle: IParallelNearestCircle, + nearestCircles: IParallelNearestCircle[], + ): IParallelNearestCircle[] { + const { xScale, yScale } = attrRef.current; + const lineCirclesOfClosestCircle: IParallelNearestCircle[] = []; + + keysOfDimensions.forEach((dimension: string) => { + const closestXPixel = xScale(dimension); + const closestYPixel = yScale[dimension]( + closestCircle.values && closestCircle.values[dimension], + ); + if (nearestCircles[0]?.x !== closestXPixel && !_.isNil(closestYPixel)) { + lineCirclesOfClosestCircle.push({ + x: closestXPixel, + y: closestYPixel, + lastYScalePos: closestCircle.lastYScalePos, + key: closestCircle.key + 'line', + color: closestCircle.color, + }); + } + }); + return lineCirclesOfClosestCircle; + } + + function getColorIndicatorYPixel(line: ILineDataType) { + const { yScale } = attrRef.current; + let colorIndicatorYPixel: number = 0; + if (isVisibleColorIndicator) { + const lastKeyOfDimension: string = + keysOfDimensions[keysOfDimensions.length - 1]; + const lastYScale: IAxisScale = yScale[lastKeyOfDimension]; + colorIndicatorYPixel = lastYScale(line.values[lastKeyOfDimension]) || 0; + } + + return colorIndicatorYPixel; + } + + function getActivePoint(circle: IParallelNearestCircle): IActivePoint { + const dimensionLabel = scalePointValue(attrRef.current.xScale, circle.x); + let yValue: number = 0; + + if (dimensions[dimensionLabel].scaleType === ScaleEnum.Point) { + yValue = scalePointValue( + attrRef.current.yScale[dimensionLabel], + circle.y, + true, + ); + } else { + yValue = getRoundedValue( + attrRef.current.yScale[dimensionLabel].invert(circle.y), + ); + } + + const chartRect: DOMRect = + visAreaRef.current?.getBoundingClientRect() || {}; + + const rect = { + top: +(margin.top + circle.y - CircleEnum.ActiveRadius).toFixed(2), + bottom: +(margin.top + circle.y + CircleEnum.ActiveRadius).toFixed(2), + left: +(margin.left + circle.x - CircleEnum.ActiveRadius).toFixed(2), + right: +(margin.left + circle.x + CircleEnum.ActiveRadius).toFixed(2), + }; + // @TODO - remove "pointRect" after refactoring (removing old params explorer) + const pointRect = { + top: +(chartRect.top + rect.top).toFixed(2), + bottom: +(chartRect.top + rect.bottom).toFixed(2), + left: +(chartRect.left + rect.left).toFixed(2), + right: +(chartRect.left + rect.right).toFixed(2), + }; + + return { + key: circle.key, + xValue: dimensionLabel, + yValue, + xPos: circle.x, + yPos: circle.y, + chartIndex: index, + visId: id, + pointRect, + rect, + }; + } + + function getFocusedState( + activePoint: IActivePoint, + focusedStateActive: boolean = false, + ): IFocusedState { + return { + active: focusedStateActive, + key: activePoint.key, + xValue: activePoint.xValue, + yValue: activePoint.yValue, + chartIndex: activePoint.chartIndex, + visId: activePoint.visId, + }; + } + + function updateFocusedChart(args: IUpdateParallelFocusedChartProps = {}) { + const { xScale, yScale, focusedState, activePoint } = attrRef.current; + + const { + mousePos, + focusedStateActive = focusedState?.active || false, + force = false, + } = args; + + let mousePosition: [number, number] | [] = []; + let dimensionLabel = ''; + if (mousePos) { + dimensionLabel = scalePointValue(xScale, mousePos[0]); + mousePosition = mousePos; + } else if (focusedState?.active && focusedState.visId === id) { + const xPos = xScale(focusedState.xValue); + dimensionLabel = scalePointValue(xScale, xPos); + mousePosition = [xPos, yScale[dimensionLabel]?.(focusedState.yValue)]; + } else if (activePoint?.xValue && activePoint.yValue) { + const xPos = xScale(activePoint.xValue); + dimensionLabel = scalePointValue(xScale, xPos); + mousePosition = [ + xScale(activePoint.xValue), + yScale[dimensionLabel]?.(activePoint.yValue), + ]; + } + if (dimensionLabel && mousePosition.length === 2) { + const [mouseX, mouseY] = mousePosition; + const nearestCircles = getNearestCircles(mouseX); + const closestCircle = getClosestCircle(nearestCircles, mouseX, mouseY); + const lineCirclesOfClosestCircle = closestCircle + ? getLineCirclesOfClosestCircle(closestCircle, nearestCircles) + : []; + + // hover Line Changed case + if (closestCircle?.key !== attrRef.current?.lineKey || force) { + linesNodeRef.current.classed('highlight', false); + // previous line + clearActiveLine(attrRef.current.lineKey); + // new line + drawActiveLine(closestCircle?.key); + if (closestCircle) { + const activePoint = getActivePoint(closestCircle); + drawParallelCircles( + nearestCircles, + lineCirclesOfClosestCircle, + closestCircle, + ); + if (focusedStateActive) { + drawFocusedCircle(activePoint.key); + } + const focusedState = getFocusedState(activePoint, focusedStateActive); + attrRef.current.focusedState = focusedState; + safeSyncHoverState({ activePoint, focusedState }); + attrRef.current.activePoint = activePoint; + attrRef.current.lineKey = closestCircle.key; + attrRef.current.x = closestCircle.x; + attrRef.current.y = closestCircle.y; + } + } + } + } + + function drawActiveCircle(key: string) { + d3.selectAll(`[id=Circle-${key}]`) + .attr('r', CircleEnum.ActiveRadius) + .classed('active', true) + .raise(); + d3.selectAll(`[id=Circle-${key}line]`) + .attr('r', CircleEnum.ActiveRadius) + .classed('active', true) + .raise(); + } + + function drawActiveLine(key: string): void { + // new line + const newActiveLine = linesNodeRef.current.selectAll(`[id=Line-${key}]`); + + if (!_.isEmpty(newActiveLine.nodes())) { + const linesSelectorToHighlight = newActiveLine.attr('data-selector'); + // set highlighted lines + highlightedNodeRef.current = linesNodeRef.current + .selectAll(`[data-selector=${linesSelectorToHighlight}]`) + .classed('highlighted', true) + .raise(); + // set active line + newActiveLine?.classed('active', true).raise(); + } + + attrRef.current.lineKey = key; + } + + function clearActiveLine(key?: string): void { + // previous line + if (key) { + linesNodeRef.current + .selectAll(`[id=Line-${key}]`) + .classed('active', false); + highlightedNodeRef.current.classed('highlighted', false); + } + } + + function drawFocusedCircle(key: string): void { + if (!attrNodeRef.current) return; + + attrNodeRef.current + .selectAll('circle') + .attr('r', CircleEnum.Radius) + .classed('active', false) + .classed('focus', false); + + attrNodeRef.current.select('.focus__shadow')?.remove(); + + const newFocusedPoint = attrNodeRef.current.select(`[id=Circle-${key}]`); + + newFocusedPoint + .classed('focus', true) + .attr('r', CircleEnum.ActiveRadius) + .raise(); + + attrNodeRef.current + .append('circle') + .classed('HoverCircle focus focus__shadow', true) + .attr('r', CircleEnum.ActiveRadius) + .attr('cx', newFocusedPoint.attr('cx')) + .attr('cy', newFocusedPoint.attr('cy')) + .attr('stroke', newFocusedPoint.attr('stroke')) + .attr('stroke-opacity', 0.4) + .lower(); + } + + function drawParallelCircles( + nearestCircles: IParallelNearestCircle[], + lineCirclesOfClosestCircle: IParallelNearestCircle[], + closestCircle: IParallelNearestCircle, + ) { + attrNodeRef.current.classed('highlight', false); + attrNodeRef.current + .selectAll('circle') + .data([...nearestCircles, ...lineCirclesOfClosestCircle]) + .join('circle') + .raise() + .attr('class', 'HoverCircle') + .attr('id', (d: IParallelNearestCircle) => `Circle-${d.key}`) + .attr('data-key', (d: IParallelNearestCircle) => d.key) + .attr('clip-path', `url(#${nameKey}-circles-rect-clip-${index})`) + .attr('cx', (d: IParallelNearestCircle) => d.x.toFixed(2)) + .attr('cy', (d: IParallelNearestCircle) => d.y.toFixed(2)) + .attr('r', CircleEnum.Radius) + .attr('stroke', (d: IParallelNearestCircle) => + isVisibleColorIndicator + ? attrRef.current.yColorIndicatorScale(d.lastYScalePos) + : d.color, + ) + .attr('stroke-opacity', 1) + .on('click', handlePointClick); + // set active circle + drawActiveCircle(closestCircle?.key); + } + + // Interactions + function handlePointClick(this: SVGElement, event: MouseEvent): void { + if (attrRef.current.focusedState?.visId !== id) { + safeSyncHoverState({ activePoint: null }); + } + const mousePos = d3.pointer(event); + updateFocusedChart({ mousePos, focusedStateActive: true, force: true }); + } + + function handleLineClick(this: SVGElement, event: MouseEvent): void { + if (attrRef.current.focusedState?.visId !== id) { + safeSyncHoverState({ activePoint: null }); + } + const mousePos = d3.pointer(event); + updateFocusedChart({ mousePos, focusedStateActive: false, force: true }); + } + + function setActiveLineAndCircle( + lineKey: string, + focusedStateActive: boolean = false, + force: boolean = false, + ): void { + let xPos = 0; + const xStep = attrRef.current.xScale.step(); + let closestCircle; + let nearestCircles; + while (xPos <= attrRef.current.xScale.range()[1]) { + nearestCircles = getNearestCircles(xPos); + closestCircle = nearestCircles.find((c) => c.key === lineKey); + if (closestCircle) { + break; + } + xPos += xStep; + } + + if (closestCircle?.key !== attrRef.current?.lineKey || force) { + const lineCirclesOfClosestCircle = closestCircle + ? //@ts-ignore + getLineCirclesOfClosestCircle(closestCircle, nearestCircles) + : []; + linesNodeRef.current.classed('highlight', false); + // previous line + clearActiveLine(attrRef.current.lineKey); + // new line + //@ts-ignore + drawActiveLine(closestCircle?.key); + if (closestCircle) { + const activePoint = getActivePoint(closestCircle); + drawParallelCircles( + //@ts-ignore + nearestCircles, + lineCirclesOfClosestCircle, + closestCircle, + ); + if (focusedStateActive) { + drawFocusedCircle(closestCircle?.key); + } + const focusedState = getFocusedState(activePoint, focusedStateActive); + attrRef.current.focusedState = focusedState; + safeSyncHoverState({ activePoint, focusedState }); + attrRef.current.activePoint = activePoint; + attrRef.current.lineKey = closestCircle.key; + attrRef.current.x = closestCircle.x + margin.left; + attrRef.current.y = closestCircle.y + margin.top; + } + } + } + + function handleMouseMove(event: MouseEvent): void { + if (attrRef.current.focusedState?.active) { + return; + } + const mousePos = d3.pointer(event); + if (isMouseInVisArea(mousePos[0], mousePos[1])) { + rafID = window.requestAnimationFrame(() => { + updateFocusedChart({ + mousePos: [ + Math.floor(mousePos[0]) - margin.left, + Math.floor(mousePos[1]) - margin.top, + ], + focusedStateActive: false, + }); + }); + } + } + + function handleMouseLeave() { + if (attrRef.current.focusedState?.active) { + return; + } + if (attrRef.current?.lineKey) { + linesNodeRef.current.classed('highlight', false); + + linesNodeRef.current + .selectAll(`[id=Line-${attrRef.current?.lineKey}]`) + .classed('active', false); + + attrNodeRef.current.classed('highlight', false); + + attrNodeRef.current + .selectAll(`[id=Circle-${attrRef.current?.lineKey}]`) + .attr('r', CircleEnum.Radius) + .classed('active', false); + + attrNodeRef.current + .selectAll(`[id=Circle-${attrRef.current?.lineKey}line]`) + .remove(); + + if (rafID) { + window.cancelAnimationFrame(rafID); + } + clearHoverAttributes(); + safeSyncHoverState({ activePoint: null }); + } + } + + function handleLeaveFocusedPoint( + event: MouseEvent, + type: 'axes' | 'bg', + ): void { + if (attrRef.current.focusedState?.visId !== id) { + safeSyncHoverState({ activePoint: null }); + } + const mousePos = d3.pointer(event); + updateFocusedChart({ + mousePos: + type === 'axes' + ? mousePos + : [ + Math.floor(mousePos[0]) - margin.left, + Math.floor(mousePos[1]) - margin.top, + ], + force: true, + focusedStateActive: false, + }); + } + + function clearHoverAttributes(): void { + attrRef.current.activePoint = undefined; + attrRef.current.lineKey = undefined; + + linesNodeRef.current.classed('highlight', false); + attrNodeRef.current.classed('highlight', false); + + linesNodeRef.current + .selectAll('path') + .classed('highlighted', false) + .classed('active', false); + + attrNodeRef.current.selectAll('circle').remove(); + } + + function safeSyncHoverState(args: ISyncHoverStateArgs): void { + if (typeof syncHoverState === 'function') { + syncHoverState(args); + } + } + + attrRef.current.updateFocusedChart = updateFocusedChart; + attrRef.current.setActiveLineAndCircle = setActiveLineAndCircle; + attrRef.current.clearHoverAttributes = clearHoverAttributes; + + svgNodeRef.current?.on('mousemove', handleMouseMove); + svgNodeRef.current?.on('mouseleave', handleMouseLeave); + linesNodeRef.current?.on('click', handleLineClick); + bgRectNodeRef.current?.on('click', (e: MouseEvent) => + handleLeaveFocusedPoint(e, 'bg'), + ); + axesNodeRef.current?.on('click', (e: MouseEvent) => + handleLeaveFocusedPoint(e, 'axes'), + ); + + // call on every render + if (attrRef.current.focusedState) { + updateFocusedChart({ force: true }); + } +}; + +function scalePointValue( + xScale: IAxisScale, + xPos: number, + rangeReversed: boolean = false, +) { + const domain = rangeReversed ? xScale.domain().reverse() : xScale.domain(); + const range = rangeReversed ? xScale.range().reverse() : xScale.range(); + const rangePoints = d3.range( + range[0], + range[1], + xScale.step && xScale.step() - 1, + ); + + return domain[d3.bisect(rangePoints, xPos) - 1]; +} + +export default drawParallelHoverAttributes; diff --git a/src/src/utils/d3/drawParallelLines.ts b/src/src/utils/d3/drawParallelLines.ts new file mode 100644 index 00000000..19203502 --- /dev/null +++ b/src/src/utils/d3/drawParallelLines.ts @@ -0,0 +1,207 @@ +import _ from 'lodash-es'; + +import { + IDrawParallelLinesArgs, + InitialPathDataType, + ILineDataType, + ILineRendererArgs, + IGetColorIndicatorScaleValueArgs, + IDrawParallelLineArgs, +} from 'types/utils/d3/drawParallelLines'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import lineGenerator from './lineGenerator'; + +const initialPathData: InitialPathDataType = { + dimensionList: [], + lineData: {}, + isEmpty: true, + isDotted: false, +}; + +function drawParallelLines({ + index, + nameKey, + linesNodeRef, + attributesRef, + dimensions, + curveInterpolation, + linesRef, + data, + attributesNodeRef, + isVisibleColorIndicator, +}: IDrawParallelLinesArgs) { + if (!linesNodeRef?.current || !linesRef?.current || !attributesRef?.current) { + return; + } + const keysOfDimensions: string[] = Object.keys(dimensions); + + linesRenderer({ + index, + nameKey, + data, + keysOfDimensions, + curveInterpolation, + linesNodeRef, + attributesRef, + isVisibleColorIndicator, + }); + + linesRef.current.updateLines = function (updatedData: ILineDataType[]) { + linesNodeRef.current?.selectAll('*')?.remove(); + attributesNodeRef.current?.selectAll('*')?.remove(); + linesRenderer({ + index, + nameKey, + data: updatedData, + keysOfDimensions, + curveInterpolation, + linesNodeRef, + attributesRef, + isVisibleColorIndicator, + }); + }; +} + +function linesRenderer({ + index, + nameKey, + data, + keysOfDimensions, + curveInterpolation, + linesNodeRef, + attributesRef, + isVisibleColorIndicator, +}: ILineRendererArgs) { + data.forEach(({ values: line, key, color, dasharray }: ILineDataType) => { + const arrayOfPathData: InitialPathDataType[] = [ + _.cloneDeep(initialPathData), + ]; + let pathDataArrayIndex: number = 0; + for (let i = 0; i < keysOfDimensions.length; i++) { + const keyOfDimension: string = keysOfDimensions[i]; + if (_.isNil(line[keyOfDimension])) { + if (i === 0) continue; + let nextStep: number = 1; + while ( + keysOfDimensions[i + nextStep] && + _.isNil(line[keysOfDimensions[i + nextStep]]) + ) { + nextStep++; + } + if ( + nextStep + i < keysOfDimensions.length && + line[keysOfDimensions[i - 1]] && + line[keysOfDimensions[i + nextStep]] + ) { + arrayOfPathData[pathDataArrayIndex + 1] = { + dimensionList: [ + keysOfDimensions[i - 1], + keysOfDimensions[i + nextStep], + ], + lineData: { + [keysOfDimensions[i - 1]]: line[keysOfDimensions[i - 1]], + [keysOfDimensions[i + nextStep]]: + line[keysOfDimensions[i + nextStep]], + }, + isEmpty: false, + isDotted: true, + }; + arrayOfPathData[pathDataArrayIndex + 2] = + _.cloneDeep(initialPathData); + pathDataArrayIndex = pathDataArrayIndex + 2; + } + i = i + nextStep - 1; + } else { + arrayOfPathData[pathDataArrayIndex].isEmpty = false; + arrayOfPathData[pathDataArrayIndex].dimensionList.push(keyOfDimension); + arrayOfPathData[pathDataArrayIndex].lineData[keyOfDimension] = + line[keyOfDimension]; + } + } + + arrayOfPathData.forEach((pathData) => { + if (!pathData.isEmpty) { + drawParallelLine({ + index, + nameKey, + linesNodeRef, + attributesRef, + curveInterpolation, + dimensionList: pathData.dimensionList, + lineData: pathData.lineData, + isDotted: pathData.isDotted, + dasharray, + key, + color: isVisibleColorIndicator + ? getColorIndicatorScaleValue({ + line, + keysOfDimensions, + yColorIndicatorScale: + attributesRef.current.yColorIndicatorScale, + yScale: attributesRef.current.yScale, + }) + : color, + }); + } + }); + }); +} + +function drawParallelLine({ + index, + nameKey, + linesNodeRef, + attributesRef, + dimensionList, + curveInterpolation, + lineData, + dasharray, + isDotted, + color, + key, +}: IDrawParallelLineArgs) { + if (!linesNodeRef.current) { + return; + } + + linesNodeRef.current + .append('path') + .lower() + .data([ + dimensionList.map((dimension: number | string, i: number) => [ + dimension, + lineData[dimensionList[i]], + ]), + ]) + .attr('id', `Line-${key}`) + .attr('clip-path', `url(#${nameKey}-lines-rect-clip-${index})`) + .attr( + 'd', + lineGenerator( + attributesRef.current.xScale, + attributesRef.current.yScale, + curveInterpolation, + ), + ) + .attr('class', 'Line') + .style('fill', 'none') + .style('stroke', isDotted ? '#9c9292' : color) + .style('stroke-opacity', 1) + .style('stroke-dasharray', isDotted ? '4 1' : dasharray); +} + +function getColorIndicatorScaleValue({ + line, + keysOfDimensions, + yColorIndicatorScale, + yScale, +}: IGetColorIndicatorScaleValueArgs) { + const lastKeyOfDimension: string = + keysOfDimensions[keysOfDimensions.length - 1]; + const lastYScale: IAxisScale = yScale[lastKeyOfDimension]; + + return yColorIndicatorScale(lastYScale(line[lastKeyOfDimension]) || 0); +} + +export default drawParallelLines; diff --git a/src/src/utils/d3/drawPoints.ts b/src/src/utils/d3/drawPoints.ts new file mode 100644 index 00000000..9d35593f --- /dev/null +++ b/src/src/utils/d3/drawPoints.ts @@ -0,0 +1,51 @@ +import { IPoint } from 'components/ScatterPlot'; + +import { IDrawPointsArgs } from 'types/utils/d3/drawPoints'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { CircleEnum } from './index'; + +function drawPoints(args: IDrawPointsArgs): void { + const { index, nameKey, data, xScale, yScale, pointsRef, pointsNodeRef } = + args; + + if (!pointsNodeRef?.current) { + return; + } + + pointsRef.current.updateScales = function ( + xScale: IAxisScale, + yScale: IAxisScale, + ): void { + pointsNodeRef.current + .selectAll('.Circle') + .attr('cx', (p: IPoint) => xScale(p.data.xValues[0]).toFixed(2)) + .attr('cy', (p: IPoint) => yScale(p.data.yValues[0]).toFixed(2)) + .attr('r', CircleEnum.Radius); + }; + + pointsRef.current.updatePoints = function (pointData: IPoint[]): void { + pointsNodeRef.current + ?.selectAll('.Circle') + .data( + pointData.filter( + (p: IPoint) => p.data.yValues[0] !== '-' && p.data.xValues[0] !== '-', + ), + ) + .join('circle') + .attr('class', 'Circle') + .attr('id', (p: IPoint) => `Circle-${p.key}`) + .attr('clip-path', `url(#${nameKey}-lines-rect-clip-${index})`) + .attr('groupKey', (p: IPoint) => p.groupKey) + .attr('cx', (p: IPoint) => xScale(p.data.xValues[0]).toFixed(2)) + .attr('cy', (p: IPoint) => yScale(p.data.yValues[0]).toFixed(2)) + .attr('r', CircleEnum.Radius) + .attr('fill', (p: IPoint) => p.color) + .attr('stroke', (d: IPoint) => d.color) + .attr('color', (d: IPoint) => d.color); + }; + + pointsRef.current.updatePoints(data); +} + +export default drawPoints; diff --git a/src/src/utils/d3/drawScatterTrendline.ts b/src/src/utils/d3/drawScatterTrendline.ts new file mode 100644 index 00000000..67f5d129 --- /dev/null +++ b/src/src/utils/d3/drawScatterTrendline.ts @@ -0,0 +1,67 @@ +import * as d3 from 'd3'; + +import { IPoint } from 'components/ScatterPlot'; + +import { + linearRegression, + linearRegressionLine, +} from 'utils/regression/linearRegression'; +import loess from 'utils/regression/loess'; + +import { TrendlineTypeEnum } from '.'; + +/** + * Given the params with the type for trendline + * respectively, draws a line on the ScatterPlot + */ +function drawScatterTrendline({ + index, + nameKey, + data, + type, + xScale, + yScale, + bandwidth, + targetRef, +}: any): void { + if (!targetRef?.current) { + return; + } + + const points = data + .map((d: IPoint) => [xScale(d.data.xValues[0]), yScale(d.data.yValues[0])]) + .filter((d: [number, number]) => d[0] !== undefined && d[1] !== undefined) + .sort((a: [number, number], b: [number, number]) => a[0] - b[0]); + + let regressionPoints; + + if (type === TrendlineTypeEnum.SLR) { + const slr = linearRegression(points); + const slrLine = linearRegressionLine(slr); + + const firstX = points[0][0]; + const lastX = points[points.length - 1][0]; + const xCoordinates = [firstX, lastX]; + + regressionPoints = xCoordinates.map((d) => [d, slrLine(d as number)]); + } else { + regressionPoints = loess(points, bandwidth ?? 0.66); + } + + const line = d3 + .line() + .x((d) => d[0]) + .y((d) => d[1]); + + targetRef.current + .append('path') + .datum(regressionPoints) + .classed('RegressionLine', true) + .attr('clip-path', `url(#${nameKey}-lines-rect-clip-${index})`) + .attr('d', line) + .attr('stroke-width', 2.2) + .attr('fill', 'none') + .attr('stroke', '#E64E48FF'); // error-color +} + +export default drawScatterTrendline; diff --git a/src/src/utils/d3/drawUnableToRender.ts b/src/src/utils/d3/drawUnableToRender.ts new file mode 100644 index 00000000..19a39377 --- /dev/null +++ b/src/src/utils/d3/drawUnableToRender.ts @@ -0,0 +1,37 @@ +import React from 'react'; +import * as d3 from 'd3'; + +import { ISyncHoverStateArgs } from 'types/utils/d3/drawHoverAttributes'; + +function drawUnableToRender({ + renderArr = [], + visAreaRef, + attributesRef, + readOnly = false, + syncHoverState, +}: { + renderArr: { condition: boolean; text?: string }[]; + attributesRef: React.MutableRefObject; + visAreaRef: React.MutableRefObject; + readOnly?: boolean; + syncHoverState?: (args: ISyncHoverStateArgs) => void; +}) { + const renderItem = renderArr.find((item) => item.condition); + + if (renderItem?.condition && visAreaRef.current && !readOnly) { + const visArea = d3.select(visAreaRef.current); + visArea.selectAll('*').remove(); + visArea + .append('text') + .classed('unableToDrawText', true) + .text(renderItem.text || ''); + + if (attributesRef.current?.clearHoverAttributes) { + attributesRef.current.clearHoverAttributes(); + } + attributesRef.current = {}; + syncHoverState?.({ activePoint: null }); + } +} + +export default drawUnableToRender; diff --git a/src/src/utils/d3/getAxisScale.ts b/src/src/utils/d3/getAxisScale.ts new file mode 100644 index 00000000..4dee7998 --- /dev/null +++ b/src/src/utils/d3/getAxisScale.ts @@ -0,0 +1,30 @@ +import * as d3 from 'd3'; + +import { IAxisScale, IGetAxisScaleProps } from 'types/utils/d3/getAxisScale'; + +import { ScaleEnum } from './index'; + +function getScaleBaseFor(scaleType?: ScaleEnum) { + switch (scaleType) { + case ScaleEnum.Log: + return d3.scaleLog(); + case ScaleEnum.Linear: + return d3.scaleLinear(); + case ScaleEnum.Point: + return d3.scalePoint(); + default: + return d3.scaleLinear(); + } +} + +function getAxisScale({ + scaleType, + domainData, + rangeData, +}: IGetAxisScaleProps): IAxisScale { + const scaleBase = getScaleBaseFor(scaleType); + //@ts-ignore + return scaleBase.domain(domainData).range(rangeData); +} + +export default getAxisScale; diff --git a/src/src/utils/d3/getColorFromRange.ts b/src/src/utils/d3/getColorFromRange.ts new file mode 100644 index 00000000..4a96ddb7 --- /dev/null +++ b/src/src/utils/d3/getColorFromRange.ts @@ -0,0 +1,18 @@ +import * as d3 from 'd3'; + +import { gradientStartColor, gradientEndColor } from 'utils/d3'; + +function getColorFromRange( + range: [number, number], + startColor: string = gradientStartColor, + endColor: string = gradientEndColor, +) { + return range + ? d3 + .scaleSequential() + .domain(range) + .interpolator(d3.interpolateRgb(startColor, endColor)) + : null; +} + +export default getColorFromRange; diff --git a/src/src/utils/d3/getCoordinates.ts b/src/src/utils/d3/getCoordinates.ts new file mode 100644 index 00000000..b910b7ac --- /dev/null +++ b/src/src/utils/d3/getCoordinates.ts @@ -0,0 +1,21 @@ +import { + IGetCoordinates, + IGetCoordinatesArgs, +} from 'types/utils/d3/drawHoverAttributes'; + +export default function getCoordinates({ + mouse, + margin, + xScale, + yScale, +}: IGetCoordinatesArgs): IGetCoordinates { + const xPixel = Math.floor(mouse[0]) - margin.left; + const yPixel = Math.floor(mouse[1]) - margin.top; + const [xMin, xMax] = xScale.range(); + const [yMax, yMin] = yScale.range(); + + return { + mouseX: xPixel < xMin ? xMin : xPixel > xMax ? xMax : xPixel, + mouseY: yPixel < yMin ? yMin : yPixel > yMax ? yMax : yPixel, + }; +} diff --git a/src/src/utils/d3/getDimensionValue.ts b/src/src/utils/d3/getDimensionValue.ts new file mode 100644 index 00000000..a4b12958 --- /dev/null +++ b/src/src/utils/d3/getDimensionValue.ts @@ -0,0 +1,18 @@ +import * as d3 from 'd3'; + +import { IDimensionType } from 'types/utils/d3/drawParallelAxes'; +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +export function getDimensionValue({ + pos, + domainData, + axisScale, +}: { + pos: number; + domainData: IDimensionType['domainData']; + axisScale: IAxisScale; +}) { + const axisValues = (domainData as string[]).map((d: string) => axisScale(d)); + const index = d3.bisectCenter(axisValues, pos); + return domainData[index]; +} diff --git a/src/src/utils/d3/index.ts b/src/src/utils/d3/index.ts new file mode 100644 index 00000000..9d322fac --- /dev/null +++ b/src/src/utils/d3/index.ts @@ -0,0 +1,131 @@ +import clearArea from './clearArea'; +import drawArea from './drawArea'; +import drawAxes from './drawAxes'; +import drawLines from './drawLines'; +import processLineChartData from './processLineChartData'; +import getAxisScale from './getAxisScale'; +import drawBrush from './drawBrush'; +import drawHoverAttributes from './drawHoverAttributes'; +import drawParallelAxes from './drawParallelAxes'; +import drawParallelLines from './drawParallelLines'; +import drawParallelHoverAttributes from './drawParallelHoverAttributes'; +import drawParallelAxesBrush from './drawParallelAxesBrush'; +import drawParallelColorIndicator from './drawParallelColorIndicator'; +import getCoordinates from './getCoordinates'; +import drawPoints from './drawPoints'; +import drawScatterTrendline from './drawScatterTrendline'; +import drawUnableToRender from './drawUnableToRender'; +import drawLegends from './drawLegends'; + +const gradientStartColor = '#2980B9'; +const gradientEndColor = '#E74C3C'; + +enum AlignmentOptionsEnum { + STEP = 'step', + EPOCH = 'epoch', + RELATIVE_TIME = 'relative_time', + ABSOLUTE_TIME = 'absolute_time', + CUSTOM_METRIC = 'custom', +} + +enum CircleEnum { + Radius = 2, + ActiveRadius = 4.6, + InProgress = 1.6, +} + +enum HighlightEnum { + Off = 0, + Metric = 1, + Run = 2, + Custom = 3, +} + +enum ZoomEnum { + SINGLE = 0, + MULTIPLE = 1, +} + +enum LegendsModeEnum { + PINNED = 'pinned', + UNPINNED = 'unpinned', +} + +enum CurveEnum { + Linear = 'curveLinear', + Basis = 'curveBasis', + Bundle = 'curveBundle', + Cardinal = 'curveCardinal', + CatmullRom = 'curveCatmullRom', + MonotoneX = 'curveMonotoneX', + MonotoneY = 'curveMonotoneY', + Natural = 'curveNatural', + Step = 'curveStep', + StepAfter = 'curveStepAfter', + StepBefore = 'curveStepBefore', + BasisClosed = 'curveBasisClosed', +} + +enum ScaleEnum { + Log = 'log', + Linear = 'linear', + Point = 'point', +} + +enum ChartTypeEnum { + LineChart = 'LineChart', + HighPlot = 'HighPlot', + ScatterPlot = 'ScatterPlot', + ImageSet = 'ImageSet', +} + +enum PointSymbolEnum { + CIRCLE = 'symbolCircle', + CROSS = 'symbolCross', + DIAMOND = 'symbolDiamond', + SQUARE = 'symbolSquare', + STAR = 'symbolStar', + TRIANGLE = 'symbolTriangle', + WYE = 'symbolWye', +} + +enum TrendlineTypeEnum { + SLR = 'slr', + LOESS = 'loess', +} + +const MIN_LOG_VALUE = 1e-8; + +export { + CircleEnum, + CurveEnum, + ScaleEnum, + ChartTypeEnum, + AlignmentOptionsEnum, + PointSymbolEnum, + TrendlineTypeEnum, + HighlightEnum, + ZoomEnum, + LegendsModeEnum, + clearArea, + drawArea, + drawAxes, + drawLines, + getCoordinates, + drawParallelColorIndicator, + processLineChartData, + getAxisScale, + drawBrush, + drawHoverAttributes, + drawParallelAxes, + drawParallelLines, + drawParallelHoverAttributes, + drawParallelAxesBrush, + drawPoints, + drawScatterTrendline, + drawUnableToRender, + drawLegends, + gradientStartColor, + gradientEndColor, + MIN_LOG_VALUE, +}; diff --git a/src/src/utils/d3/lineGenerator.ts b/src/src/utils/d3/lineGenerator.ts new file mode 100644 index 00000000..afccda2b --- /dev/null +++ b/src/src/utils/d3/lineGenerator.ts @@ -0,0 +1,24 @@ +import * as d3 from 'd3'; + +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { CurveEnum } from './'; + +export default function lineGenerator( + xScaleValues: IAxisScale, + yScaleValues: IAxisScale | { [key: string]: IAxisScale }, + curve: CurveEnum = CurveEnum.Linear, +) { + if (!xScaleValues) { + return; + } + return d3 + .line() + .x((d) => xScaleValues(d[0])) + .y((d) => + typeof yScaleValues === 'object' + ? yScaleValues[d[0]](d[1]) + : yScaleValues(d[1]), + ) + .curve(d3[curve]); +} diff --git a/src/src/utils/d3/processLineChartData.ts b/src/src/utils/d3/processLineChartData.ts new file mode 100644 index 00000000..47d6a14b --- /dev/null +++ b/src/src/utils/d3/processLineChartData.ts @@ -0,0 +1,498 @@ +import _ from 'lodash-es'; + +import { + ICalculateLineValues, + IGetValueInLine, + IProcessedAggrData, + IProcessedData, + IProcessLineChartData, + IProcessLineChartDataArgs, +} from 'types/utils/d3/processLineChartData'; +import { ILine } from 'types/components/LineChart/LineChart'; + +import { minMaxOfArray } from 'utils/minMaxOfArray'; +import { removeOutliers } from 'utils/removeOutliers'; + +import { toQuadrupleData, toTupleData } from '../toFormatData'; +import getRoundedValue from '../roundValue'; + +import { getAxisScale, MIN_LOG_VALUE, ScaleEnum } from './index'; + +function processLineChartData({ + data, + ignoreOutliers = false, + visBoxRef, + axesScaleType, + axesScaleRange, + aggregatedData, + aggregationConfig, + unableToDrawConditions, + attributesRef, +}: IProcessLineChartDataArgs): IProcessLineChartData { + let allXValues: number[] = []; + let allYValues: number[] = []; + let tupleLineChartData: IProcessedData[] = []; + let quadrupleAggrData: IProcessedAggrData[] = []; + let yBounds: number[] = []; + + for (let i = 0; i < data.length; i++) { + const line: ILine = data[i]; + let { xValues, yValues } = line.data; + + if (xValues.length === 0 || yValues.length === 0) { + continue; + } + + if (axesScaleType.yAxis === ScaleEnum.Log) { + yValues = yValues.map((val) => (val <= 0 ? MIN_LOG_VALUE : val)); + } + if (axesScaleType.xAxis === ScaleEnum.Log) { + xValues = xValues.map((val) => (val <= 0 ? MIN_LOG_VALUE : val)); + } + + const tupleData = toTupleData(xValues, yValues, (x, y) => { + // supposed received x values are sorted by ascending order (y values are sorted by x) + allXValues.push(x); + allYValues.push(y); + }); + + // find y bounds for lines to ignore "acceptable" outliers + if (ignoreOutliers) { + yBounds = yBounds.concat(minMaxOfArray(removeOutliers(yValues, 4))); + } + + tupleLineChartData.push({ + color: '#000', + dasharray: 'none', + ...line, + data: tupleData, + }); + } + + unableToDrawConditions.unshift({ + condition: !allXValues.length || !allYValues.length, + text: 'Unable to draw lines with the current config. Please adjust the controls.', + }); + + if (aggregationConfig?.isApplied && aggregatedData) { + for (let i = 0; i < aggregatedData.length; i++) { + const aggrData = aggregatedData[i]; + quadrupleAggrData.push({ + ...aggrData, + area: toQuadrupleData( + aggrData.area.max?.xValues || [], + aggrData.area.max?.yValues || [], + aggrData.area.min?.xValues || [], + aggrData.area.min?.yValues || [], + ), + line: toTupleData( + aggrData.line?.xValues || [], + aggrData.line?.yValues || [], + ), + }); + } + } + + let [yMin, yMax] = minMaxOfArray( + ignoreOutliers ? yBounds : _.uniq(allYValues), + ); + let [xMin, xMax] = minMaxOfArray(_.uniq(allXValues)); + + // add y-axis scale range manually + if (axesScaleRange?.yAxis && !_.isEmpty(axesScaleRange?.yAxis)) { + if (axesScaleRange.yAxis.min !== undefined) { + yMin = axesScaleRange.yAxis.min; + } + if (axesScaleRange.yAxis.max !== undefined) { + yMax = axesScaleRange.yAxis.max; + } + unableToDrawConditions.unshift({ + condition: yMin > yMax, + text: 'Unable to draw lines with the current y-axis range. Please adjust the y-axis range.', + }); + } + // add x-axis scale range manually + if (axesScaleRange?.xAxis && !_.isEmpty(axesScaleRange?.xAxis)) { + if (axesScaleRange.xAxis.min !== undefined) { + xMin = axesScaleRange.xAxis.min; + } + if (axesScaleRange.xAxis.max !== undefined) { + xMax = axesScaleRange.xAxis.max; + } + unableToDrawConditions.unshift({ + condition: xMin > xMax, + text: 'Unable to draw lines with the current x-axis range. Please adjust the x-axis range.', + }); + } + + if (axesScaleType.xAxis === ScaleEnum.Log) { + if (xMin <= 0) { + xMin = MIN_LOG_VALUE; + } + if (xMax <= 0) { + xMax = MIN_LOG_VALUE; + } + } + + if (axesScaleType.yAxis === ScaleEnum.Log) { + if (yMin <= 0) { + yMin = MIN_LOG_VALUE; + } + if (yMax <= 0) { + yMax = MIN_LOG_VALUE; + } + } + + // ADD margin for y-dimension + const diff = yMax - yMin; + const portion = 0.05; + const yMargin = yMax !== yMin ? diff * portion : 1; + yMax += yMargin; + yMin -= yMin <= yMargin ? 0 : yMargin; + + const { width, height, margin } = visBoxRef.current; + + // create axes scale functions + const xScale = getAxisScale({ + domainData: [xMin, xMax], + rangeData: [0, width - margin.left - margin.right], + scaleType: axesScaleType.xAxis, + }); + const yScale = getAxisScale({ + domainData: [yMin, yMax], + rangeData: [height - margin.top - margin.bottom, 0], + scaleType: axesScaleType.yAxis, + }); + + let processedData = tupleLineChartData; + let processedAggrData = quadrupleAggrData; + + if (ignoreOutliers) { + const offsetScaled = 20; + const minEdge = getRoundedValue(yScale.invert(yScale(yMin) + offsetScaled)); + const maxEdge = getRoundedValue(yScale.invert(yScale(yMax) - offsetScaled)); + + processedData = tupleLineChartData.map((line) => ({ + ...line, + data: calculateLineValues({ + values: line.data, + xMin, + xMax, + minEdge, + maxEdge, + axesScaleType, + }), + })); + + processedAggrData = quadrupleAggrData.map((aggrData) => { + let min: [number, number][] = []; + let max: [number, number][] = []; + + aggrData.area.forEach(([x0, y0, x1, y1]) => { + max.push([x0, y0]); + min.push([x1, y1]); + }); + + const area = { + min: calculateLineValues({ + values: min, + xMin, + xMax, + minEdge, + maxEdge, + axesScaleType, + }), + max: calculateLineValues({ + values: max, + xMin, + xMax, + minEdge, + maxEdge, + axesScaleType, + }), + }; + const line = calculateLineValues({ + values: aggrData.line, + xMin, + xMax, + minEdge, + maxEdge, + axesScaleType, + }); + + // Calculated area's (min/max arrays) can have different length + // need to fill them (to equal their length) to draw aggregated area's correctly + const [longArea, shortArea] = + area.max.length > area.min.length + ? [area.max, area.min] + : [area.min, area.max]; + + let prev: number[]; + const filledAreaData = longArea + .map(([x1, y1], i: number) => { + let x, y; + if (shortArea[i]) { + let [x2, y2] = shortArea[i]; + x = x2; + y = y2; + } else { + if (prev) { + x = prev[0]; + y = getValueInLine({ + x1: x, + x2: x1, + y1: prev[1], + y2: y1, + x: x, + axesScaleType, + }); + } else { + x = x1; + let [nextX, nextY] = shortArea[i + 1] || []; + y = getValueInLine({ + x1, + x2: nextX, + y1, + y2: nextY, + x: x1, + axesScaleType, + }); + } + } + prev = [x, y]; + return [x1, y1, x, y]; + }) + .sort((a, b) => a[0] - b[0]); + + return { + ...aggrData, + area: filledAreaData, + line, + } as IProcessedAggrData; + }); + } + + attributesRef.current.xScale = xScale; + attributesRef.current.yScale = yScale; + + return { + min: { x: xMin, y: yMin }, + max: { x: xMax, y: yMax }, + processedData, + processedAggrData, + allXValues: _.uniq(allXValues), + allYValues: _.uniq(allYValues), + }; +} + +export default processLineChartData; + +// get cropped lines for having an ability to draw large scale lines in browser +function calculateLineValues({ + values, + xMin, + xMax, + minEdge, + maxEdge, + axesScaleType, +}: ICalculateLineValues) { + let leftEdgeIndex = _.findLastIndex(values, (v: number[]) => v[0] <= xMin); + let rightEdgeIndex = _.findIndex(values, (v: number[]) => v[0] >= xMax); + if (leftEdgeIndex === -1) { + leftEdgeIndex = 0; + } + if (rightEdgeIndex === -1) { + rightEdgeIndex = values.length - 1; + } + const visibleValues = values.slice(leftEdgeIndex, rightEdgeIndex + 1); + + let prevValue: number[] = []; + + let result = visibleValues + .map(([xValue, yValue]: number[], i: number) => { + let x = xValue; + let y = _.clamp(yValue, minEdge, maxEdge); + let value: number[][] | number[] = [x, y]; + if (y === yValue) { + prevValue = [x, y]; + } else { + let [nextX, nextYValue] = visibleValues[i + 1] || []; + const nextY = _.clamp(nextYValue, minEdge, maxEdge); + if (i === 0) { + if (visibleValues.length > 1) { + let x2 = getValueInLine({ + x1: x, + x2: nextX, + y1: yValue, + y2: nextY, + y: y, + axesScaleType, + }); + value = [ + [x, y], + [x2, y], + ]; + prevValue = [x2, y]; + } else { + prevValue = [x, y]; + value = [x, y]; + } + } else { + x = getValueInLine({ + x1: prevValue[0], + x2: xValue, + y1: prevValue[1], + y2: yValue, + y: y, + axesScaleType, + }); + if (i !== visibleValues.length - 1) { + let x2 = getValueInLine({ + x1: xValue, + x2: nextX, + y1: yValue, + y2: nextY, + y: y, + axesScaleType, + }); + value = [ + [x, y], + [x2, y], + ]; + prevValue = [x2, y]; + } else { + value = [x, y]; + } + } + } + + return (Array.isArray(value[0]) ? value : [value]) as [number, number][]; + }) + .flat() + .sort((a, b) => a[0] - b[0]); + + let minIndex = -1; + let maxIndex = result.length; + + for (let i = 0; i < result.length; i++) { + const [x] = result[i]; + if (x < xMin && i > minIndex) { + minIndex = i; + } + if (x > xMax && i < maxIndex) { + maxIndex = i; + } + } + + if (minIndex >= maxIndex) { + result = []; + } else { + if (minIndex > -1 && minIndex < result.length - 1) { + result[minIndex] = [ + xMin, + getValueInLine({ + x1: result[minIndex][0], + x2: result[minIndex + 1][0], + y1: result[minIndex][1], + y2: result[minIndex + 1][1], + x: xMin, + axesScaleType, + }), + ]; + } + if (maxIndex < result.length && maxIndex > 0) { + result[maxIndex] = [ + xMax, + getValueInLine({ + x1: result[maxIndex - 1][0], + x2: result[maxIndex][0], + y1: result[maxIndex - 1][1], + y2: result[maxIndex][1], + x: xMax, + axesScaleType, + }), + ]; + } + } + + return result.slice(minIndex > -1 ? minIndex : 0, maxIndex + 1); +} + +// get [x or y] value in line depending on [x1,y1] and [x2, y2] and [y or x] +function getValueInLine({ + x1, + x2, + y1, + y2, + x, + y, + axesScaleType, +}: IGetValueInLine): number { + let value = 0; + if (x === undefined && y) { + let dx1; + let dx2; + let dy1; + let dy2; + if (x1 === x2) { + value = x1; + } else { + if (axesScaleType.xAxis === ScaleEnum.Linear) { + dx1 = x1; + dx2 = x2; + } else { + dx1 = Math.log(x1); + dx2 = Math.log(x2); + } + if (axesScaleType.yAxis === ScaleEnum.Linear) { + dy1 = y - y1; + dy2 = y2 - y1; + } else { + dy1 = Math.log(y) - Math.log(y1); + dy2 = Math.log(y2) - Math.log(y1); + } + if (dx1 > dx2) { + value = dx1 - ((dx1 - dx2) * dy1) / dy2; + } else { + value = ((dx2 - dx1) * dy1) / dy2 + dx1; + } + if (axesScaleType.xAxis === ScaleEnum.Log) { + value = Math.exp(value); + } + } + } else if (y === undefined && x) { + let dx1; + let dx2; + let dy1; + let dy2; + if (x1 === x2 || x === x1) { + value = y1; + } else if (x === x2) { + value = y2; + } else { + if (axesScaleType.xAxis === ScaleEnum.Linear) { + dx1 = x - x1; + dx2 = x2 - x1; + } else { + dx1 = Math.log(x) - Math.log(x1); + dx2 = Math.log(x2) - Math.log(x1); + } + if (axesScaleType.yAxis === ScaleEnum.Linear) { + dy1 = y1; + dy2 = y2; + } else { + dy1 = Math.log(y1); + dy2 = Math.log(y2); + } + if (dy1 > dy2) { + value = dy1 - ((dy1 - dy2) * dx1) / dx2; + } else { + value = ((dy2 - dy1) * dx1) / dx2 + dy1; + } + if (axesScaleType.yAxis === ScaleEnum.Log) { + value = Math.exp(value); + } + } + } + return getRoundedValue(value); +} diff --git a/src/src/utils/d3/symbolGenerator.ts b/src/src/utils/d3/symbolGenerator.ts new file mode 100644 index 00000000..100fa423 --- /dev/null +++ b/src/src/utils/d3/symbolGenerator.ts @@ -0,0 +1,10 @@ +import * as d3 from 'd3'; + +import { PointSymbolEnum } from './index'; + +export default function symbolGenerator( + symbol: PointSymbolEnum = PointSymbolEnum.CIRCLE, + size: number = 40, +) { + return d3.symbol().type(d3[symbol]).size(size); +} diff --git a/src/src/utils/d3/tickFormatting.ts b/src/src/utils/d3/tickFormatting.ts new file mode 100644 index 00000000..35fd5fa3 --- /dev/null +++ b/src/src/utils/d3/tickFormatting.ts @@ -0,0 +1,208 @@ +import React from 'react'; +import * as d3 from 'd3'; +import _ from 'lodash-es'; + +import { IAxisScale } from 'types/utils/d3/getAxisScale'; + +import { ScaleEnum } from './index'; + +export function getLogScaleAttributes( + scale: d3.AxisScale, + ticksCount: number = 10, + precision: number = 2, +) { + const domain = scale.domain() as number[]; + const logScale = d3.scaleLog().domain(domain); + const format = logScale.tickFormat(10); + let ticks = logScale.ticks(ticksCount).filter(format); + if (ticks.length > ticksCount) { + ticks = ticks.filter((v, i, arr) => { + if (i === 0 || i === arr.length - 1) { + return true; + } + const interval = Math.floor((arr.length - 2) / (ticksCount - 2)); + return i % interval === 0 && arr.length - interval > i; + }); + } + + const specifier = d3.formatSpecifier('.' + precision + '~g'); + return { ticks, specifier }; +} + +export function customFormatting( + value: d3.AxisDomain, + tickConfig: { + defaultFormatMaxLength: number; + precision: number; + maxLength: number; + omission: string; + }, +) { + let tick = value.toString(); + if ( + typeof value === 'number' && + tick.length > tickConfig.defaultFormatMaxLength + ) { + const specifier = '.' + tickConfig.precision + '~g'; + tick = d3.format(specifier)(value); + } + return _.truncate(tick, { + length: tickConfig.maxLength, + omission: tickConfig.omission, + }); +} + +export interface IFormatAxis { + scale: d3.AxisScale; + tickAdditionalConfig?: {}; + drawTickLines: { x?: boolean; y?: boolean; tickSize: number }; + plotBoxRef: React.MutableRefObject; + scaleType: IAxisScale; +} + +export function formatXAxisByDefault({ + scale, + tickAdditionalConfig = {}, + drawTickLines = { x: false, y: false, tickSize: 0 }, + plotBoxRef, + scaleType, +}: IFormatAxis) { + const tickConfig = { + distance: 90, + minCount: 2, + maxCount: 20, + precision: { log: 4, linear: 3 }, + maxLength: 14, + omission: '..', + defaultFormatMaxLength: 6, + padding: 10, + tickSizeInner: 0, + ...tickAdditionalConfig, + }; + + const xAxis = d3 + .axisBottom(scale) + .tickPadding(tickConfig.padding) + .tickSizeInner(tickConfig.tickSizeInner); + + if (drawTickLines.x) { + const tickSizeOuter = 0; + xAxis.tickSize(drawTickLines.tickSize).tickSizeOuter(tickSizeOuter); + } + + let ticksCount = _.clamp( + Math.floor(plotBoxRef.current.width / tickConfig.distance), + tickConfig.minCount, + tickConfig.maxCount, + ); + + let tickValues: d3.AxisDomain[] = []; + if (scaleType.xAxis === ScaleEnum.Log) { + const { ticks, specifier } = getLogScaleAttributes( + scale, + ticksCount, + tickConfig.precision.log, + ); + tickValues = ticks; + xAxis + .ticks(ticksCount, specifier) + .tickValues(tickValues) + .tickFormat((d) => { + return customFormatting(d, { + ...tickConfig, + precision: tickConfig.precision.log, + }); + }); + } else { + xAxis.ticks(ticksCount).tickFormat((d) => { + return customFormatting(d, { + ...tickConfig, + precision: tickConfig.precision.linear, + }); + }); + const domainData = scale.domain(); + if (domainData.length > ticksCount) { + tickValues = domainData.filter( + (v, i, arr) => i % Math.ceil(arr.length / ticksCount) === 0, + ); + xAxis.tickValues(tickValues); + } + } + + return { + xAxis, + ticksCount, + tickValues, + tickConfig, + }; +} + +export function formatYAxisByDefault({ + scale, + tickAdditionalConfig = {}, + drawTickLines = { x: false, y: false, tickSize: 0 }, + plotBoxRef, + scaleType, +}: IFormatAxis) { + const tickConfig = { + distance: 40, + minCount: 3, + maxCount: 20, + precision: { log: 7, linear: 3 }, + maxLength: 9, + omission: '..', + defaultFormatMaxLength: 6, + padding: 8, + tickSizeInner: 0, + ...tickAdditionalConfig, + }; + + const yAxis = d3 + .axisLeft(scale) + .tickPadding(tickConfig.padding) + .tickSizeInner(tickConfig.tickSizeInner); + + if (drawTickLines.y) { + const tickSizeOuter = 0; + yAxis.tickSize(drawTickLines.tickSize).tickSizeOuter(tickSizeOuter); + } + + const ticksCount = _.clamp( + Math.floor(plotBoxRef.current.height / tickConfig.distance), + tickConfig.minCount, + tickConfig.maxCount, + ); + + if (scaleType.yAxis === ScaleEnum.Log) { + const { ticks: tickValues, specifier } = getLogScaleAttributes( + scale, + ticksCount, + tickConfig.precision.log, + ); + yAxis + .ticks(ticksCount, specifier) + .tickValues(tickValues) + .tickFormat((d) => { + return customFormatting(d, { + ...tickConfig, + precision: tickConfig.precision.log, + }); + }); + } else { + yAxis.ticks(ticksCount).tickFormat((d) => { + return customFormatting(d, { + ...tickConfig, + precision: tickConfig.precision.linear, + }); + }); + const domainData = scale.domain(); + if (domainData.length > ticksCount) { + const tickValues = domainData.filter( + (v, i, arr) => i % Math.ceil(arr.length / ticksCount) === 0, + ); + yAxis.tickValues(tickValues); + } + } + + return { yAxis }; +} diff --git a/src/src/utils/decodeWithBase58Checker.ts b/src/src/utils/decodeWithBase58Checker.ts new file mode 100644 index 00000000..3bdd2185 --- /dev/null +++ b/src/src/utils/decodeWithBase58Checker.ts @@ -0,0 +1,21 @@ +import { setItem } from 'utils/storage'; + +import { AIM64_ENCODING_PREFIX, decode, encode } from './encoder/encoder'; + +export default function decodeWithBase58Checker({ + value, + localStorageKey, +}: { + value: string; + localStorageKey?: string; +}) { + const decodedValue: string = decode(value); + if (!value.startsWith(AIM64_ENCODING_PREFIX)) { + const encodedValue: string = encode(JSON.parse(decodedValue)); + if (localStorageKey) { + setItem(localStorageKey, encodedValue); + } + } + + return decodedValue; +} diff --git a/src/src/utils/document/documentTitle.ts b/src/src/utils/document/documentTitle.ts new file mode 100644 index 00000000..cd4e0fb2 --- /dev/null +++ b/src/src/utils/document/documentTitle.ts @@ -0,0 +1,19 @@ +import _ from 'lodash-es'; + +export function getDocumentTitle(pathname: string): { + title: string; + withPrefix: boolean; +} { + const paths = pathname.slice(1).split('/'); + if (paths[0]) { + return { title: _.capitalize(paths[0]), withPrefix: true }; + } + return { title: 'Aim', withPrefix: false }; +} + +export function setDocumentTitle( + title: string = 'Aim', + withPrefix: boolean = false, +): void { + document.title = title + (withPrefix ? ' | Aim' : ''); +} diff --git a/src/src/utils/encoder/encoder.ts b/src/src/utils/encoder/encoder.ts new file mode 100644 index 00000000..dece84be --- /dev/null +++ b/src/src/utils/encoder/encoder.ts @@ -0,0 +1,65 @@ +import bs58check from 'bs58check'; +import md5 from 'md5'; + +const BS64_REPLACE_CHARACTERS = { + ENCODING: [ + { searchValue: '=', replaceValue: '' }, + { searchValue: '+', replaceValue: '-' }, + { searchValue: '/', replaceValue: '_' }, + ], + DECODING: [ + { searchValue: '_', replaceValue: '/' }, + { searchValue: '-', replaceValue: '+' }, + ], +}; +// replace URL and CSS selectors, vulnerable characters '+', '/', '=', + +const BS64_ENCODING_PADDING = ['', '===', '==', '=']; + +export const AIM64_ENCODING_PREFIX = 'O-'; +// `O` - is a character which cannot exist in the base58-encoded data, +// ability to resolve backward compatibility issue + +export function aim64encode(value: Record) { + const json_encoded = JSON.stringify(value); + let aim64_encoded = btoa(encodeURI(json_encoded)); + for (let { searchValue, replaceValue } of BS64_REPLACE_CHARACTERS.ENCODING) { + aim64_encoded = aim64_encoded.replaceAll(searchValue, replaceValue); + } + return AIM64_ENCODING_PREFIX + aim64_encoded; +} + +export function aim64decode(aim64_encoded: string) { + if (!aim64_encoded.startsWith(AIM64_ENCODING_PREFIX)) { + throw Error('Aim64 encoding magic bytes not found!'); + } + let bs64_encoded = aim64_encoded.slice(2); + for (let { searchValue, replaceValue } of BS64_REPLACE_CHARACTERS.DECODING) { + bs64_encoded = bs64_encoded.replaceAll(searchValue, replaceValue); + } + // add padding `=` characters back to make the encoded string length a multiple of 4 + bs64_encoded += BS64_ENCODING_PADDING[bs64_encoded.length % 4]; + return decodeURI(atob(bs64_encoded)); +} + +export function encode( + value: Record, + oneWayHashing?: boolean, +): string { + if (oneWayHashing) { + return md5(JSON.stringify(value)); + } + return aim64encode(value); +} + +export function decode(value: string): string { + try { + if (value.startsWith(AIM64_ENCODING_PREFIX)) { + return aim64decode(value); + } + // `base58Decoded` version for backward compatibility + return bs58check.decode(value)?.toString(); + } catch (ex) { + return '{}'; + } +} diff --git a/src/src/utils/encoder/format_bytes.ts b/src/src/utils/encoder/format_bytes.ts new file mode 100644 index 00000000..d90769f9 --- /dev/null +++ b/src/src/utils/encoder/format_bytes.ts @@ -0,0 +1,31 @@ +const HEXDIGITS = '0123456789abcdef'; + +// python 'bytes' representation +export function format_bytes(arr: Uint8Array, quote?: string): string { + if (!quote) { + quote = '"'; + } + let tokens = []; + tokens.push('b'); + tokens.push(quote); + for (let c of arr) { + if (c === quote.charCodeAt(0) || c === 92) { + tokens.push('\\'); + tokens.push(String.fromCharCode(c)); + } else if (c === 9) { + tokens.push('\\t'); + } else if (c === 10) { + tokens.push('\\n'); + } else if (c === 13) { + tokens.push('\\r'); + } else if (c < 32 || c > 0x7f) { + tokens.push('\\x'); + tokens.push(HEXDIGITS[(c & 0xf0) >> 4]); + tokens.push(HEXDIGITS[c & 0x0f]); + } else { + tokens.push(String.fromCharCode(c)); + } + } + tokens.push(quote); + return tokens.join(''); +} diff --git a/src/src/utils/encoder/streamEncoding.ts b/src/src/utils/encoder/streamEncoding.ts new file mode 100644 index 00000000..255c19cf --- /dev/null +++ b/src/src/utils/encoder/streamEncoding.ts @@ -0,0 +1,509 @@ +// @ts-nocheck + +import { isEqual } from 'lodash-es'; + +import struct from '@aksel/structjs'; + +import { IRunProgress } from 'services/api/base-explorer/runsApi'; + +const PATH_SENTINEL = 0xfe; +// const SIZE_T = 'q'; + +const NONE = 0; +const BOOL = 1; +const INT = 2; // Stored as 64-bit Long Long +const FLOAT = 3; // Stored as 64-bit Double +const STRING = 4; +const BYTES = 5; +const ARRAY = 6; +const OBJECT = 7; + +class AimObjectFlag { + private flagType: string; + constructor(flagType: string) { + this.flagType = flagType; + } + + toString() { + return `<${this.flagType}>`; + } +} +const ArrayFlag = new AimObjectFlag('ARRAY_FLAG'); +const ObjectFlag = new AimObjectFlag('OBJECT_FLAG'); + +let utf8decoder = new TextDecoder('utf-8'); + +function decodeNone(buffer: ArrayBuffer) { + return null; +} + +function decodeBool(buffer: ArrayBuffer) { + return struct(', + level: number = 0, +): AsyncGenerator<[AimObjectPath, AimObject | undefined]> { + const stack: AimObject[] = []; + const path: AimObjectPath = []; + + let item: IteratorResult< + [AimObjectPath, AimObjectPrimitive | AimObjectFlag], + void + >; + + item = await pathsVals.next(); + if (item.done) { + if (level > 0) { + return; + } + + yield [[], undefined]; + return; + } + let first_records = item.value; + if (!first_records.length) { + if (level > 0) { + return; + } + yield [[], undefined]; + return; + } + let [keys, val] = first_records.shift(); + if (keys.length) { + return; + } + + let node = valToNode(val); + stack.push(node); + for await (let records of pathsVals) { + if (first_records.length) { + records = [...first_records, ...records]; + first_records = []; + } + for (let [keys, val] of records) { + while (!isEqual(path, keys.slice(0, path.length))) { + let lastState = stack.pop(); + if (stack.length === level) { + yield [path.slice(), lastState]; + } + path.pop(); + } + + node = valToNode(val); + + if (keys.length !== path.length + 1) { + throw new Error('Assertion Error'); + } + let keyToAdd: AimObjectKey = keys[keys.length - 1]; + path.push(keyToAdd); + + if (stack.length === 0) { + throw new Error('Assertion Error'); + } + + let lastState = stack[stack.length - 1] as AimObjectNode; + + if (Array.isArray(lastState)) { + while (lastState.length !== (keyToAdd as number)) { + lastState.push(null); + } + lastState.push(node); + } else { + lastState[keyToAdd] = node; + } + + stack.push(node); + } + } + if (level < stack.length) { + yield [path.slice(0, level), stack[level]]; + } +} + +export async function* decodeBufferPairs( + stream: ReadableStream, +): AsyncGenerator<[Uint8Array, Uint8Array][]> { + let buffer = new Uint8Array(new ArrayBuffer()); + let reader = stream.getReader(); + + let p = reader.read(); + + function merge(a, b) { + const mergedArray = new Uint8Array(a.length + b.length); + mergedArray.set(a); + mergedArray.set(b, a.length); + return mergedArray; + } + + function needs_async_fetch(requested_size) { + return requested_size > buffer.byteLength; + } + + async function do_async_fetch(requested_size) { + // get value and ask to fetch next chunk in background + let item = await p; + if (item.done) { + return false; + } + p = reader.read(); + let chunk = item.value; + buffer = merge(buffer, chunk); + return true; + } + + function get_next(requested_size) { + let response = buffer.subarray(0, requested_size); + buffer = buffer.subarray(requested_size); + return response; + } + + let item; + let records = []; + let done = false; + + asyncLoop: while (true) { + let record = [null, null]; + for (let idx of [0, 1]) { + while (needs_async_fetch(4) && !done) { + let promise = do_async_fetch(4); + yield records; + records = []; + done = !(await promise); + } + if (done) { + break asyncLoop; + } + item = get_next(4); + + let buffer_len = + (item[0] << 0) + (item[1] << 8) + (item[2] << 16) + (item[3] << 24); + + while (needs_async_fetch(buffer_len) && !done) { + let promise = do_async_fetch(buffer_len); + yield records; + records = []; + done = !(await promise); + } + if (done) { + throw new Error('Corrupted stream'); + } + item = get_next(buffer_len); + record[idx] = item; + } + records.push(record); + } + yield records; +} + +function areEqual(a, b) { + if (Number.isInteger(a)) { + if (Number.isInteger(b)) { + return a === b; + } else { + return false; + } + } else { + if (Number.isInteger(a)) { + return false; + } + } + if (a.length !== b.length) { + return false; + } + for (let i = 0; i < a.length; ++i) { + if (a[i] !== b[i]) { + return false; + } + } + return true; +} + +function decodePiece(piece) { + if (Number.isInteger(piece)) { + return piece; + } + return decodeString(piece); +} + +export async function* decodePathsVals( + pathsVals: AsyncGenerator<[Uint8Array, Uint8Array][]>, +): AsyncGenerator<[AimObjectPath, AimObjectPrimitive | AimObjectFlag][]> { + let pieces_state = null; + let path_state = null; + for await (let records of pathsVals) { + let to_yield = []; + for (let [encodedPath, encodedVal] of records) { + let pieces = splitPath(encodedPath); + let val = decodeValue(encodedVal); + if (pieces_state === null) { + if (pieces.length) { + to_yield.push([[], ObjectFlag]); + } + pieces_state = []; + path_state = []; + } + let prefix_len; + for ( + prefix_len = 0; + prefix_len < pieces.length && prefix_len < pieces_state.length; + ++prefix_len + ) { + if (!areEqual(pieces[prefix_len], pieces_state[prefix_len])) { + break; + } + } + while (pieces_state.length > prefix_len) { + path_state.pop(); + pieces_state.pop(); + } + while (pieces_state.length !== pieces.length) { + let piece = pieces[pieces_state.length]; + pieces_state.push(piece); + let key = decodePiece(piece); + path_state.push(key); + if (pieces_state.length !== pieces.length) { + to_yield.push([[...path_state], ObjectFlag]); + } + } + to_yield.push([[...path_state], val]); + } + if (to_yield.length) { + yield to_yield; + } + } + yield []; +} + +/** + * async function parseStream + * This function uses 3 core functions to decode storage data + * decodeBufferPairs + * decodePathsVals + * iterFoldTree + * Receives generic T type to indicate the returned data type + * @param stream + * @param options - the callback functions to send streaming progress + */ +export async function parseStream( + stream: ReadableStream, + options?: { + progressCallback?: (progress: IRunProgress) => void | null; + callback?: (item: any) => void; + dataProcessor?: (keys: any, value: any) => any; + }, +): Promise { + let buffer_pairs = decodeBufferPairs(stream); + let decodedPairs = decodePathsVals(buffer_pairs); + let objects = iterFoldTree(decodedPairs, 1); + if (options?.dataProcessor) { + return options.dataProcessor(objects); + } else { + const data: T = []; + + try { + for await (let [keys, val] of objects) { + const object: T = { ...(val as any), hash: keys[0] }; + if (object.hash?.startsWith?.('progress')) { + // maybe typeof progressCallback === 'function' + if (options?.progressCallback) { + options.progressCallback(object as IRunProgress); + const { 0: checked, 1: trackedRuns } = object; + + options.progressCallback({ + matched: data.length, + checked, + trackedRuns, + }); + } + } else { + if (options?.callback) { + options.callback({ value: val, hash: keys[0] }); + } + data.push(object); + } + } + } catch (e) { + // if (__DEV__) { + // eslint-disable-next-line no-console + console.error(e); + // } + throw e; + } + + return data; + } +} diff --git a/src/src/utils/filterArrayByIndexes.ts b/src/src/utils/filterArrayByIndexes.ts new file mode 100644 index 00000000..fcc67e49 --- /dev/null +++ b/src/src/utils/filterArrayByIndexes.ts @@ -0,0 +1,8 @@ +export function filterArrayByIndexes( + missingIndexes: number[], + array: number[] | Float64Array, +): Float64Array { + return new Float64Array( + array.filter((item, index) => missingIndexes.indexOf(index) === -1), + ); +} diff --git a/src/src/utils/formatAnsiToHtml.ts b/src/src/utils/formatAnsiToHtml.ts new file mode 100644 index 00000000..356bc66b --- /dev/null +++ b/src/src/utils/formatAnsiToHtml.ts @@ -0,0 +1,494 @@ +// Adapted from ansi-to-html by Rob Burns +// License: https://github.com/rburns/ansi-to-html/blob/master/LICENSE-MIT.txt +import _ from 'lodash-es'; + +interface Options { + /** The default foreground color used when reset color codes are encountered. */ + fg?: string; + /** The default background color used when reset color codes are encountered. */ + bg?: string; + /** Convert newline characters to `
`. */ + newline?: boolean; + /** Can override specific colors or the entire ANSI palette. */ + colors?: string[] | { [code: number]: string }; +} + +type Stack = string[]; + +const defaults: Options = { + fg: '#FFF', + bg: '#000', + newline: false, + colors: getDefaultColors(), +}; + +function getDefaultColors(): Record { + const colors: Record = { + 0: '#000', + 1: '#A00', + 2: '#0A0', + 3: '#A50', + 4: '#00A', + 5: '#A0A', + 6: '#0AA', + 7: '#AAA', + 8: '#555', + 9: '#F55', + 10: '#5F5', + 11: '#FF5', + 12: '#55F', + 13: '#F5F', + 14: '#5FF', + 15: '#FFF', + }; + + _.range(0, 6).forEach((red: number) => { + _.range(0, 6).forEach((green: number) => { + _.range(0, 6).forEach((blue: number) => + setStyleColor(red, green, blue, colors), + ); + }); + }); + + _.range(0, 24).forEach((gray: number) => { + const c = gray + 232; + const l = toHexString(gray * 10 + 8); + + colors[c] = '#' + l + l + l; + }); + + return colors; +} + +/** + * @param {number} red + * @param {number} green + * @param {number} blue + * @param {Record} colors + */ +function setStyleColor( + red: number, + green: number, + blue: number, + colors: Record, +): void { + const c = 16 + red * 36 + green * 6 + blue; + const r = red > 0 ? red * 40 + 55 : 0; + const g = green > 0 ? green * 40 + 55 : 0; + const b = blue > 0 ? blue * 40 + 55 : 0; + + colors[c] = toColorHexString([r, g, b]); +} + +/** + * Converts from a number like 15 to a hex string like 'F' + * @param {number} num + * @returns {string} + */ +function toHexString(num: number): string { + let str = num.toString(16); + + while (str.length < 2) { + str = '0' + str; + } + + return str; +} + +/** + * Converts from an array of numbers like [15, 15, 15] to a hex string like 'FFF' + * @param {[red, green, blue]} ref + * @returns {string} + */ +function toColorHexString(ref: number[]): string { + const results = []; + + for (const r of ref) { + results.push(toHexString(r)); + } + + return '#' + results.join(''); +} + +/** + * @param {Stack} stack + * @param {string} token + * @param {string} data + * @param {Options} options + */ +function generateOutput( + stack: Stack, + token: string, + data: string, + options: Options, +) { + let result; + if (token === 'text') { + result = data; + } else if (token === 'display') { + result = handleDisplay(stack, +data, options); + } else if (token === 'xterm256Foreground') { + result = pushForegroundColor(stack, options?.colors?.[+data] as string); + } else if (token === 'xterm256Background') { + result = pushBackgroundColor(stack, options?.colors?.[+data] as string); + } else if (token === 'rgb') { + result = handleRgb(stack, data); + } + + return result; +} + +/** + * @param {Stack} stack + * @param {string} data + * @returns {string} + */ +function handleRgb(stack: Stack, data: string): string { + data = data.substring(2).slice(0, -1); + const operation = +data.substr(0, 2); + + const color = data.substring(5).split(';'); + const rgb = color + .map(function (value) { + return ('0' + Number(value).toString(16)).substring(-2); + }) + .join(''); + + return pushStyle( + stack, + (operation === 38 ? 'color:#' : 'background-color:#') + rgb, + ); +} + +/** + * @param {Stack} stack + * @param {string} code + * @param {Options} options + * @returns {string | number | void } + */ +function handleDisplay( + stack: Stack, + code: number, + options: Options, +): string | number | void { + code = parseInt(`${code}`, 10); + + const codeMap: Record void> = { + '-1': () => '
', + 0: () => stack.length && resetStyles(stack), + 1: () => pushTag(stack, 'b'), + 3: () => pushTag(stack, 'i'), + 4: () => pushTag(stack, 'u'), + 8: () => pushStyle(stack, 'display:none'), + 9: () => pushTag(stack, 'strike'), + 22: () => + pushStyle( + stack, + 'font-weight:normal;text-decoration:none;font-style:normal', + ), + 23: () => closeTag(stack, 'i'), + 24: () => closeTag(stack, 'u'), + 39: () => pushForegroundColor(stack, options.fg as string), + 49: () => pushBackgroundColor(stack, options.bg as string), + 53: () => pushStyle(stack, 'text-decoration:overline'), + }; + + if (codeMap[code]) { + return codeMap[code](); + } else if (4 < code && code < 7) { + return pushTag(stack, 'blink'); + } else if (29 < code && code < 38) { + return pushForegroundColor(stack, options?.colors?.[code - 30] as string); + } else if (39 < code && code < 48) { + return pushBackgroundColor(stack, options?.colors?.[code - 40] as string); + } else if (89 < code && code < 98) { + return pushForegroundColor( + stack, + options?.colors?.[8 + (code - 90)] as string, + ); + } else if (99 < code && code < 108) { + return pushBackgroundColor( + stack, + options?.colors?.[8 + (code - 100)] as string, + ); + } +} + +/** + * Clear all the styles + * @param {Stack} stack + * @returns {string} + */ +function resetStyles(stack: Stack): string { + const stackClone = stack.slice(0); + + stack.length = 0; + + return stackClone + .reverse() + .map(function (tag) { + return ''; + }) + .join(''); +} + +/** + * @param {Stack} stack + * @param {string} tag + * @param {string} [style=''] + * @returns {string} + */ +function pushTag(stack: Stack, tag: string, style?: string): string { + if (!style) { + style = ''; + } + + stack.push(tag); + + return `<${tag}${style ? ` style="${style}"` : ''}>`; +} + +/** + * @param {Stack} stack + * @param {string} style + * @returns {string} + */ +function pushStyle(stack: Stack, style: string): string { + return pushTag(stack, 'span', style); +} + +function pushForegroundColor(stack: Stack, color: string) { + return pushTag(stack, 'span', 'color:' + color); +} + +function pushBackgroundColor(stack: Stack, color: string) { + return pushTag(stack, 'span', 'background-color:' + color); +} + +/** + * @param {Stack} stack + * @param {string} style + * @returns {string | undefined} + */ +function closeTag(stack: Stack, style: string): string | undefined { + let last; + + if (stack.slice(-1)[0] === style) { + last = stack.pop(); + } + + if (last) { + return ''; + } +} + +/** + * @param {string} text + * @param {Options} options + * @param {function} callback + * @returns {Array} + */ +function tokenize( + text: string, + options: Options, + callback: (token: string, data: string | number) => void, +) { + let ansiMatch = false; + const ansiHandler = 3; + + function remove() { + return ''; + } + + function removeXterm256Foreground(z: string, g1: string) { + callback('xterm256Foreground', g1); + return ''; + } + + function removeXterm256Background(m: string, g1: string) { + callback('xterm256Background', g1); + return ''; + } + + function newline(m: string) { + if (options.newline) { + callback('display', -1); + } else { + callback('text', m); + } + + return ''; + } + + function ansiMess(m: string, g1: string) { + ansiMatch = true; + if (g1.trim().length === 0) { + g1 = '0'; + } + + const g2 = g1.trimRight().split(';'); + + for (const g of g2) { + callback('display', g); + } + + return ''; + } + + function realText(m: string) { + callback('text', m); + + return ''; + } + + function rgb(m: string) { + callback('rgb', m); + + return ''; + } + + /* eslint no-control-regex:0 */ + const tokens = [ + { + pattern: /^\x08+/, + sub: remove, + }, + { + pattern: /^\x1b\[[012]?K/, + sub: remove, + }, + { + pattern: /^\x1b\[\(B/, + sub: remove, + }, + { + pattern: /^\x1b\[[34]8;2;\d+;\d+;\d+m/, + sub: rgb, + }, + { + pattern: /^\x1b\[38;5;(\d+)m/, + sub: removeXterm256Foreground, + }, + { + pattern: /^\x1b\[48;5;(\d+)m/, + sub: removeXterm256Background, + }, + { + pattern: /^\n/, + sub: newline, + }, + { + pattern: /^\r+\n/, + sub: newline, + }, + { + pattern: /^\r/, + sub: newline, + }, + { + pattern: /^\x1b\[((?:\d{1,3};?)+|)m/, + sub: ansiMess, + }, + { + // CSI n J + // ED - Erase in Display Clears part of the screen. + // If n is 0 (or missing), clear from cursor to end of screen. + // If n is 1, clear from cursor to beginning of the screen. + // If n is 2, clear entire screen (and moves cursor to upper left on DOS ANSI.SYS). + // If n is 3, clear entire screen and delete all lines saved in the scrollback buffer + // (this feature was added for xterm and is supported by other terminal applications). + pattern: /^\x1b\[\d?J/, + sub: remove, + }, + { + // CSI n ; m f + // HVP - Horizontal Vertical Position Same as CUP + pattern: /^\x1b\[\d{0,3};\d{0,3}f/, + sub: remove, + }, + { + // catch-all for CSI sequences? + pattern: /^\x1b\[?[\d;]{0,3}/, + sub: remove, + }, + { + /** + * extracts real text - not containing: + * - `\x1b' - ESC - escape (Ascii 27) + * - '\x08' - BS - backspace (Ascii 8) + * - `\n` - Newline - linefeed (LF) (ascii 10) + * - `\r` - Windows Carriage Return (CR) + */ + pattern: /^(([^\x1b\x08\r\n])+)/, + sub: realText, + }, + ]; + + function process( + handler: { + pattern: string | RegExp; + sub: (m: string, g1: string) => string; + }, + i: number, + ) { + if (i > ansiHandler && ansiMatch) { + return; + } + + ansiMatch = false; + + text = text.replace(handler.pattern, handler.sub); + } + + const results1 = []; + let { length } = text; + + outer: while (length > 0) { + for (let i = 0, o = 0, len = tokens.length; o < len; i = ++o) { + const handler = tokens[i]; + process(handler, i); + + if (text.length !== length) { + // We matched a token and removed it from the text. We need to + // start matching *all* tokens against the new text. + length = text.length; + continue outer; + } + } + + if (text.length === length) { + break; + } + results1.push(0); + + length = text.length; + } + + return results1; +} + +const formatAnsiToHtml = function ( + input: string | string[], + options?: Options, +) { + input = typeof input === 'string' ? [input] : input; + + let optionsA: Options = Object.assign({}, defaults, options); + let stack: Stack = []; + const buf = []; + + tokenize(input.join(''), optionsA, (token: string, data: string | number) => { + const output = generateOutput(stack, token, `${data}`, optionsA); + + if (output) { + buf.push(output); + } + }); + + if (stack.length) { + buf.push(resetStyles(stack)); + } + return buf.join(''); +}; + +export default formatAnsiToHtml; diff --git a/src/src/utils/formatByAlignment.ts b/src/src/utils/formatByAlignment.ts new file mode 100644 index 00000000..8b93a306 --- /dev/null +++ b/src/src/utils/formatByAlignment.ts @@ -0,0 +1,59 @@ +import moment from 'moment'; + +import { DATE_CHART_TICK } from 'config/dates/dates'; + +import { IAlignmentConfig } from 'types/services/models/metrics/metricsAppModel'; + +import shortEnglishHumanizer from 'utils/shortEnglishHumanizer'; + +import { AlignmentOptionsEnum } from './d3'; +import { formatValue } from './formatValue'; + +function formatValueByAlignment({ + xAxisTickValue, + type, + humanizerConfig = {}, +}: { + xAxisTickValue: number | null; + type?: AlignmentOptionsEnum; + humanizerConfig?: {}; +}) { + let formatted: string | number | null = xAxisTickValue; + + if (xAxisTickValue || xAxisTickValue === 0) { + switch (type) { + case AlignmentOptionsEnum.EPOCH: + formatted = Math.floor(xAxisTickValue); + break; + case AlignmentOptionsEnum.RELATIVE_TIME: + formatted = shortEnglishHumanizer(Math.round(xAxisTickValue), { + ...humanizerConfig, + maxDecimalPoints: 2, + }); + break; + case AlignmentOptionsEnum.ABSOLUTE_TIME: + formatted = moment(xAxisTickValue).format(DATE_CHART_TICK); + break; + default: + formatted = xAxisTickValue; + } + } + return formatValue(formatted); +} + +function getKeyByAlignment(alignmentConfig?: IAlignmentConfig): string { + switch (alignmentConfig?.type) { + case AlignmentOptionsEnum.STEP: + case AlignmentOptionsEnum.EPOCH: + return alignmentConfig?.type; + case AlignmentOptionsEnum.ABSOLUTE_TIME: + case AlignmentOptionsEnum.RELATIVE_TIME: + return alignmentConfig?.type.replace('_', ' '); + case AlignmentOptionsEnum.CUSTOM_METRIC: + return alignmentConfig?.metric || ''; + default: + return AlignmentOptionsEnum.STEP; + } +} + +export { formatValueByAlignment, getKeyByAlignment }; diff --git a/src/src/utils/formatSystemMetricName.ts b/src/src/utils/formatSystemMetricName.ts new file mode 100644 index 00000000..0e370123 --- /dev/null +++ b/src/src/utils/formatSystemMetricName.ts @@ -0,0 +1,7 @@ +import { systemMetricsDict } from 'config/systemMetrics/systemMetrics'; + +import { systemMetricsDictType } from 'types/utils/formatSystemMetricName'; + +export function formatSystemMetricName(metric: string): string { + return systemMetricsDict[metric as keyof systemMetricsDictType] || metric; +} diff --git a/src/src/utils/formatToPositiveNumber.ts b/src/src/utils/formatToPositiveNumber.ts new file mode 100644 index 00000000..4d519517 --- /dev/null +++ b/src/src/utils/formatToPositiveNumber.ts @@ -0,0 +1,9 @@ +export function formatToPositiveNumber(value: number): string { + const formattedToString = `${value}`; + if (value <= 0) { + return '0'; + } else if (+formattedToString[0] === 0 && formattedToString.length > 1) { + return formattedToString.slice(1, formattedToString.length - 1); + } + return formattedToString; +} diff --git a/src/src/utils/formatValue.ts b/src/src/utils/formatValue.ts new file mode 100644 index 00000000..f328dafa --- /dev/null +++ b/src/src/utils/formatValue.ts @@ -0,0 +1,89 @@ +import { format_bytes } from './encoder/format_bytes'; + +const NUMBER_PRECISION = 8; +const UNDEFINED_VALUE = '--'; + +const FORMATTERS: Record = { + undefined: format_undefined, + number: format_number, + string: format_str, + boolean: format_bool, + object: format_object, +}; + +function format_undefined( + value: undefined, + undefinedValue: string = UNDEFINED_VALUE, +): string { + return undefinedValue; +} + +function format_number(value: number): string { + if (isNaN(value)) { + return 'NaN'; + } + if (!isFinite(value)) { + return value > 0 ? 'Inf' : '-Inf'; + } + + return JSON.stringify(parseFloat(value.toFixed(NUMBER_PRECISION))); +} + +function format_str(value: string): string { + return JSON.stringify(value); +} + +function format_bool(value: boolean): string { + return value ? 'True' : 'False'; +} + +function format_list( + value: unknown[], + undefinedValue: string = UNDEFINED_VALUE, +): string { + const pieces = []; + for (let i = 0; i < value.length; i++) { + const piece = formatValue(value[i], undefinedValue); + pieces.push(piece); + } + return '[' + pieces.join(', ') + ']'; +} + +function format_dict( + value: Record, + undefinedValue: string = UNDEFINED_VALUE, +): string { + const pieces = []; + const keys = Object.keys(value); + for (let i = 0; i < keys.length; i++) { + const piece = `${format_str(keys[i])}: ${formatValue( + value[keys[i]], + undefinedValue, + )}`; + pieces.push(piece); + } + return '{' + pieces.join(', ') + '}'; +} + +function format_object( + value: Record, + undefinedValue: string = UNDEFINED_VALUE, +): string { + if (value === null) { + return 'None'; + } else if (value instanceof ArrayBuffer) { + return format_bytes(new Uint8Array(value), "'"); + } else if (Array.isArray(value)) { + return format_list(value, undefinedValue); + } else { + return format_dict(value, undefinedValue); + } +} + +export function formatValue( + value: unknown, + undefinedValue: string = UNDEFINED_VALUE, +): string { + let formatter = FORMATTERS[typeof value]; + return formatter(value, undefinedValue); +} diff --git a/src/src/utils/getAdvancedSuggestions.ts b/src/src/utils/getAdvancedSuggestions.ts new file mode 100644 index 00000000..8295b584 --- /dev/null +++ b/src/src/utils/getAdvancedSuggestions.ts @@ -0,0 +1,17 @@ +import * as dot from 'dot-object'; + +function getAdvancedSuggestion(data: Record): Record { + let obj = {}; + let contextKeys: Record = {}; + Object.keys(data).forEach((key: string) => { + data[key]?.forEach((element: any) => { + obj = { ...obj, ...dot.dot(element) }; + }); + }); + Object.keys(obj).forEach((key) => { + contextKeys[key] = ''; + }); + return dot.object(contextKeys); +} + +export default getAdvancedSuggestion; diff --git a/src/src/utils/getBiggestImageFromList.ts b/src/src/utils/getBiggestImageFromList.ts new file mode 100644 index 00000000..488b3796 --- /dev/null +++ b/src/src/utils/getBiggestImageFromList.ts @@ -0,0 +1,11 @@ +export default function getBiggestImageFromList(list: Array<{}>) { + let maxHeight = 0; + let maxWidth = 0; + list.forEach((item: any) => { + if (maxHeight < item.height) { + maxHeight = item.height; + maxWidth = item.width; + } + }); + return { maxHeight, maxWidth }; +} diff --git a/src/src/utils/getCaretPosition.ts b/src/src/utils/getCaretPosition.ts new file mode 100644 index 00000000..a3760330 --- /dev/null +++ b/src/src/utils/getCaretPosition.ts @@ -0,0 +1,124 @@ +let properties = [ + 'direction', // RTL support + 'boxSizing', + 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does + 'height', + 'overflowX', + 'overflowY', // copy the scrollbar for IE + + 'borderTopWidth', + 'borderRightWidth', + 'borderBottomWidth', + 'borderLeftWidth', + 'borderStyle', + + 'paddingTop', + 'paddingRight', + 'paddingBottom', + 'paddingLeft', + + // https://developer.mozilla.org/en-US/docs/Web/CSS/font + 'fontStyle', + 'fontVariant', + 'fontWeight', + 'fontStretch', + 'fontSize', + 'fontSizeAdjust', + 'lineHeight', + 'fontFamily', + + 'textAlign', + 'textTransform', + 'textIndent', + 'textDecoration', // might not make a difference, but better be safe + + 'letterSpacing', + 'wordSpacing', + + 'tabSize', + 'MozTabSize', +]; + +let isFirefox = (window as any).mozInnerScreenX != null; + +function getCaretCoordinates(element: any, position: any) { + // The mirror div will replicate the textarea's style + let div: any = document.createElement('div'); + div.id = 'input-textarea-caret-position-mirror-div'; + div.style.visibility = 'hidden'; + div.style.height = '0px'; + document.body.appendChild(div); + + let style = div.style; + let computed = window.getComputedStyle + ? window.getComputedStyle(element) + : element.currentStyle; // currentStyle for IE < 9 + let isInput = element.nodeName === 'INPUT'; + + // Default textarea styles + style.whiteSpace = 'pre-wrap'; + if (!isInput) style.wordWrap = 'break-word'; // only for textarea-s + + // Position off-screen + style.position = 'absolute'; // required to return coordinates properly + // if (!debug) style.visibility = 'hidden'; // not 'display: none' because we want rendering + + // Transfer the element's properties to the div + properties.forEach(function (prop) { + if (isInput && prop === 'lineHeight') { + // Special case for s because text is rendered centered and line height may be != height + if (computed.boxSizing === 'border-box') { + let height = parseInt(computed.height); + let outerHeight = + parseInt(computed.paddingTop) + + parseInt(computed.paddingBottom) + + parseInt(computed.borderTopWidth) + + parseInt(computed.borderBottomWidth); + let targetHeight = outerHeight + parseInt(computed.lineHeight); + if (height > targetHeight) { + style.lineHeight = height - outerHeight + 'px'; + } else if (height === targetHeight) { + style.lineHeight = computed.lineHeight; + } else { + style.lineHeight = 0; + } + } else { + style.lineHeight = computed.height; + } + } else { + style[prop] = computed[prop]; + } + }); + + if (isFirefox) { + // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275 + if (element.scrollHeight > parseInt(computed.height)) + style.overflowY = 'scroll'; + } else { + style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll' + } + + div.textContent = element.value.substring(0, position); + // The second special handling for input type="text" vs textarea: + // spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037 + if (isInput) div.textContent = div.textContent.replace(/\s/g, '\u00a0'); + + let span = document.createElement('span'); + // Wrapping must be replicated *exactly*, including when a long word gets + // onto the next line, with whitespace at the end of the line before (#7). + // The *only* reliable way to do that is to copy the *entire* rest of the + // textarea's content into the created at the caret position. + // For inputs, just '.' would be enough, but no need to bother. + span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all + div.appendChild(span); + + let coordinates = { + top: span.offsetTop + parseInt(computed['borderTopWidth']), + left: span.offsetLeft + parseInt(computed['borderLeftWidth']), + height: parseInt(computed['lineHeight']), + }; + document.body.removeChild(div); + return coordinates; +} + +export default getCaretCoordinates; diff --git a/src/src/utils/getClosestValue.ts b/src/src/utils/getClosestValue.ts new file mode 100644 index 00000000..90315aba --- /dev/null +++ b/src/src/utils/getClosestValue.ts @@ -0,0 +1,20 @@ +function getClosestValue( + array: number[], + num: number, +): { value: number; index: number } { + let minDiff = Infinity; + let index = 0; + for (let i = 0; i < array.length; i++) { + let diff = Math.abs(num - array[i]); + if (diff < minDiff) { + minDiff = diff; + index = i; + } + } + return { + value: array[index], + index, + }; +} + +export default getClosestValue; diff --git a/src/src/utils/getColumnOptions.ts b/src/src/utils/getColumnOptions.ts new file mode 100644 index 00000000..34d06c51 --- /dev/null +++ b/src/src/utils/getColumnOptions.ts @@ -0,0 +1,42 @@ +import { AppNameEnum } from 'services/models/explorer'; + +import { IOnGroupingSelectChangeParams } from 'types/services/models/metrics/metricsAppModel'; + +const icons: { [key: string]: string } = { + color: 'coloring', + stroke: 'line-style', + chart: 'chart-group', + group: 'image-group', +}; + +const groupList: any = { + images: ['group'], + metrics: ['color', 'stroke', 'chart'], + params: ['color', 'stroke', 'chart'], + scatters: ['color', 'chart'], +}; +function getColumnOptions( + grouping: { [key: string]: string[] }, + onGroupingToggle: (params: IOnGroupingSelectChangeParams) => void, + appName: AppNameEnum, + field: string, +) { + return groupList[appName].map((groupName: string) => ({ + value: `${ + grouping?.[groupName]?.includes(field) ? 'un' : '' + }group by ${groupName}`, + onClick: () => { + if (onGroupingToggle) { + onGroupingToggle({ + groupName, + list: grouping?.[groupName]?.includes(field) + ? grouping?.[groupName].filter((item) => item !== field) + : grouping?.[groupName].concat([field]), + } as IOnGroupingSelectChangeParams); + } + }, + icon: icons[groupName], + })); +} + +export default getColumnOptions; diff --git a/src/src/utils/getMinAndMaxBetweenArrays.ts b/src/src/utils/getMinAndMaxBetweenArrays.ts new file mode 100644 index 00000000..b87a1b50 --- /dev/null +++ b/src/src/utils/getMinAndMaxBetweenArrays.ts @@ -0,0 +1,19 @@ +function getMinAndMaxBetweenArrays(compArr: number[], arr?: number[]) { + if (!arr && !compArr) { + return []; + } + + let resultArr = []; + if (!compArr) { + return arr; + } + if (arr) { + resultArr[0] = arr[0] < compArr[0] ? compArr[0] : arr[0]; + resultArr[1] = arr[1] > compArr[1] ? compArr[1] : arr[1]; + } else { + resultArr = compArr; + } + return resultArr; +} + +export default getMinAndMaxBetweenArrays; diff --git a/src/src/utils/getObjectPaths.ts b/src/src/utils/getObjectPaths.ts new file mode 100644 index 00000000..9cc5b7b9 --- /dev/null +++ b/src/src/utils/getObjectPaths.ts @@ -0,0 +1,72 @@ +import _ from 'lodash-es'; + +import { getValue } from 'utils/helper'; + +import { formatValue } from './formatValue'; +export const jsValidVariableRegex = new RegExp('^[a-zA-Z_][a-zA-Z0-9d_]*$'); + +function getObjectPaths( + obj: { [key: string]: unknown }, + rootObject: { [key: string]: unknown }, + prefix: string = '', + includeRoot: boolean = false, + withoutLeaves = false, +): string[] { + if (obj === null) { + return []; + } + let rootKeys = Object.keys(obj).map((key) => { + let prefixedKey = ''; + if (prefix) { + prefixedKey = !jsValidVariableRegex.test(key) + ? `${prefix}[${formatValue(key)}]` + : `${prefix}.${key}`; + } else { + prefixedKey = !jsValidVariableRegex.test(key) + ? `[${formatValue(key)}]` + : key; + } + + return { prefixedKey, key }; + }); + let paths: string[] = includeRoot + ? rootKeys.reduce((acc: string[], { prefixedKey, key }) => { + const val: any = getValue(rootObject, prefixedKey); + if (typeof val !== 'object' || _.isNil(val) || _.isArray(val)) { + if (withoutLeaves) { + const indexOfPrefixedKey = prefixedKey.indexOf(`.${key}`); + acc.push( + prefixedKey.slice( + 0, + indexOfPrefixedKey === -1 + ? prefixedKey.length + : indexOfPrefixedKey, + ), + ); + } else { + acc.push(prefixedKey); + } + } + return acc; + }, []) + : Object.keys(obj) + .filter( + (key) => + !_.isObject(obj[key]) || _.isNil(obj[key]) || _.isArray(obj[key]), + ) + .map((key) => { + return key; + }); + rootKeys.forEach(({ prefixedKey }) => { + const val: any = getValue(rootObject, prefixedKey); + if (typeof val === 'object' && !_.isNil(val) && !Array.isArray(val)) { + paths = paths.concat( + getObjectPaths(val, rootObject, prefixedKey, true, withoutLeaves), + ); + } + }); + + return paths; +} + +export default getObjectPaths; diff --git a/src/src/utils/getPositionBasedOnOverflow.ts b/src/src/utils/getPositionBasedOnOverflow.ts new file mode 100644 index 00000000..1043d0b7 --- /dev/null +++ b/src/src/utils/getPositionBasedOnOverflow.ts @@ -0,0 +1,79 @@ +import { TooltipAppearanceEnum } from '../modules/BaseExplorer/components/Controls/ConfigureTooltip'; + +function getPositionBasedOnOverflow( + posRect: { top: number; bottom: number; left: number; right: number }, + popoverRect: DOMRect, + containerRect: DOMRect, + isPopoverPinned: boolean, + tooltipAppearance: TooltipAppearanceEnum, +): { top: number; left: number } { + if (!containerRect || !popoverRect) { + return { + top: posRect.top, + left: posRect.left, + }; + } + let left; + let top; + + const gap = 10; + + if (isPopoverPinned) { + const anchorWidth = posRect.right - posRect.left; + const anchorCenter = posRect.right - anchorWidth / 2; + if (anchorCenter - popoverRect.width / 2 - gap < containerRect.left) { + // left bound case + left = posRect.right - (posRect.right - containerRect.left) + gap; + } else if (anchorCenter + popoverRect.width / 2 > containerRect.right) { + left = + posRect.left - popoverRect.width + (containerRect.right - posRect.left); + } else { + left = anchorCenter - popoverRect.width / 2; + } + + if (tooltipAppearance === TooltipAppearanceEnum.Top) { + top = containerRect.top - (popoverRect.height - 30); + } else { + const pageBottom = document.body.getBoundingClientRect().bottom ?? 0; + const topPosition = containerRect.bottom - 30; + if (pageBottom < containerRect.bottom + popoverRect.height - 40) { + top = pageBottom - popoverRect.height - gap; + } else { + top = topPosition; + } + } + } else { + if (posRect.left < containerRect.left) { + // left bound case + left = + (posRect.right < containerRect.left + ? containerRect.left + : posRect.right) + gap; + } else if ( + posRect.right + 2 * gap + popoverRect.width >= + containerRect.right + ) { + // right bound case + left = posRect.left - popoverRect.width - gap; + } else { + left = posRect.right + gap; + } + + if (posRect.top < containerRect.top) { + // top bound case + top = containerRect.top + gap; + } else if (posRect.top + popoverRect.height > containerRect.bottom) { + // bottom bound case + top = containerRect.bottom - popoverRect.height - gap; + } else { + top = posRect.top + gap; + } + } + + return { + left, + top, + }; +} + +export default getPositionBasedOnOverflow; diff --git a/src/src/utils/getSmoothenedData.ts b/src/src/utils/getSmoothenedData.ts new file mode 100644 index 00000000..2e780308 --- /dev/null +++ b/src/src/utils/getSmoothenedData.ts @@ -0,0 +1,22 @@ +import { + calculateCentralMovingAverage, + calculateExponentialMovingAverage, + SmoothingAlgorithmEnum, +} from './smoothingData'; + +export default function getSmoothenedData({ + smoothingAlgorithm, + smoothingFactor, + data, +}: { + smoothingAlgorithm: SmoothingAlgorithmEnum; + smoothingFactor: number; + data: number[]; +}): number[] { + return smoothingAlgorithm === SmoothingAlgorithmEnum.EMA + ? (calculateExponentialMovingAverage( + data as number[], + smoothingFactor, + ) as any) + : calculateCentralMovingAverage(data as number[], smoothingFactor); +} diff --git a/src/src/utils/getSortedFields.ts b/src/src/utils/getSortedFields.ts new file mode 100644 index 00000000..d1726ef3 --- /dev/null +++ b/src/src/utils/getSortedFields.ts @@ -0,0 +1,67 @@ +import _ from 'lodash-es'; + +import { IGroupingSelectOption } from 'types/services/models/imagesExplore/imagesExploreAppModel'; + +export interface SortField extends IGroupingSelectOption { + readonly?: boolean; + order: 'asc' | 'desc'; +} +export type SortFields = SortField[]; + +export const SortActionTypes = { + DELETE: 'DELETE', + CHANGE: 'CHANGE', + ORDER_CHANGE: 'ORDER_CHANGE', + ORDER_TABLE_TRIGGER: 'ORDER_TABLE_TRIGGER', +}; + +export interface IGetSortedFieldsProps { + sortFields: SortFields; + index?: number; + order?: 'asc' | 'desc'; + actionType: string; + field?: SortField; +} + +export function getSortedFields({ + sortFields, + index, + order, + actionType, + field, +}: IGetSortedFieldsProps) { + switch (actionType) { + case SortActionTypes.DELETE: { + if (!_.isNil(field)) { + return sortFields.filter( + (sortField: SortField) => sortField.value !== field.value, + ); + } + return [...sortFields]; + } + case SortActionTypes.CHANGE: { + return [...sortFields]; + } + case SortActionTypes.ORDER_CHANGE: { + if (!_.isNil(index)) { + sortFields[index].order = order || 'asc'; + } + return [...sortFields]; + } + case SortActionTypes.ORDER_TABLE_TRIGGER: { + if (index === -1) { + sortFields.push({ + ...field, + order: 'asc', + readonly: false, + } as SortField); + } else { + sortFields[index as number].order = + sortFields[index as number].order === 'asc' ? 'desc' : 'asc'; + } + return [...sortFields]; + } + default: + return sortFields; + } +} diff --git a/src/src/utils/getStateFromLocalStorage.ts b/src/src/utils/getStateFromLocalStorage.ts new file mode 100644 index 00000000..66b763e5 --- /dev/null +++ b/src/src/utils/getStateFromLocalStorage.ts @@ -0,0 +1,9 @@ +import { decode } from './encoder/encoder'; + +export default function getStateFromLocalStorage(key: string) { + const data: any = localStorage.getItem(key); + if (data) { + return JSON.parse(decode(data)); + } + return null; +} diff --git a/src/src/utils/getStateFromUrl.ts b/src/src/utils/getStateFromUrl.ts new file mode 100644 index 00000000..f17f6662 --- /dev/null +++ b/src/src/utils/getStateFromUrl.ts @@ -0,0 +1,10 @@ +import { decode } from './encoder/encoder'; + +export default function getStateFromUrl(paramName: string) { + const searchParam = new URLSearchParams(window.location.search); + const url: string = searchParam.get(paramName) || ''; + if (url) { + return JSON.parse(decode(url)); + } + return null; +} diff --git a/src/src/utils/getTooltipContent.ts b/src/src/utils/getTooltipContent.ts new file mode 100644 index 00000000..2c28d90f --- /dev/null +++ b/src/src/utils/getTooltipContent.ts @@ -0,0 +1,81 @@ +import moment from 'moment'; +import _ from 'lodash-es'; + +import { DATE_WITH_SECONDS } from 'config/dates/dates'; +import { GroupNameEnum } from 'config/grouping/GroupingPopovers'; + +import { + IGroupingSelectOption, + IMetricsCollection, + ITooltipContent, +} from 'types/services/models/metrics/metricsAppModel'; +import { IParam } from 'types/services/models/params/paramsAppModel'; +import { IMetric } from 'types/services/models/metrics/metricModel'; +import { IAppModelConfig } from 'types/services/models/explorer/createAppModel'; + +import { getValue } from './helper'; +import getGroupConfig from './app/getGroupConfig'; + +function getTooltipContent({ + groupingNames = [], + groupingSelectOptions = [], + data = [], + configData, + activePointKey = null, + selectedFields = [], +}: { + groupingNames: GroupNameEnum[]; + groupingSelectOptions: IGroupingSelectOption[]; + data: IMetricsCollection[]; + configData: IAppModelConfig; + activePointKey?: string | null; + selectedFields?: string[]; +}) { + let tooltipContent: ITooltipContent = {}; + + for (let collection of data) { + const groupConfig = getGroupConfig({ + collection, + groupingSelectOptions, + groupingNames, + configData, + }); + + const item = collection.data.find((item) => item.key === activePointKey); + + if (item) { + tooltipContent = { + name: item.name, + context: item.context, + step: item.step, + index: item.index, + caption: item.caption, + images_name: item.name, + groupConfig, + run: item.run, + }; + } + } + + const selectedProps: ITooltipContent['selectedProps'] = selectedFields.reduce( + (acc: { [key: string]: string }, param: string) => { + const value: string | number = getValue(tooltipContent, param); + if ( + param === 'run.props.creation_time' || + param === 'run.props.end_time' + ) { + acc[param] = !_.isNil(value) + ? moment((value as number) * 1000).format(DATE_WITH_SECONDS) + : value; + } else { + acc[param] = value as string; + } + return acc; + }, + {}, + ); + + return { ...tooltipContent, selectedProps }; +} + +export default getTooltipContent; diff --git a/src/src/utils/getUrlWithParam.ts b/src/src/utils/getUrlWithParam.ts new file mode 100644 index 00000000..a84ef1fa --- /dev/null +++ b/src/src/utils/getUrlWithParam.ts @@ -0,0 +1,20 @@ +/** + * function getUrlWithParam constructs and returns URL with encoded state values + * @params {[key: string]: string} params - Object properties to store in URL's search object + * ex. params = { grouping: 'some string' } + */ +export default function getUrlWithParam(params: { + [key: string]: string; +}): string { + const paramsKeys: string[] = Object.keys(params); + + const searchParams: URLSearchParams = new URLSearchParams( + window.location.search, + ); + + paramsKeys?.forEach((key: string) => { + searchParams.set(key, params[key]); + }); + + return `${window.location.pathname}?${searchParams.toString()}`; +} diff --git a/src/src/utils/getValueByField.ts b/src/src/utils/getValueByField.ts new file mode 100644 index 00000000..756d4b13 --- /dev/null +++ b/src/src/utils/getValueByField.ts @@ -0,0 +1,13 @@ +import _ from 'lodash-es'; + +export default function getValueByField( + list: Array, + value: any, + comparisonFieldName: string = 'value', + returnFiled: string = 'label', +) { + const foundItem = list.find((listItem) => + _.isEqual(listItem[comparisonFieldName], value), + ); + return foundItem ? foundItem[returnFiled] : ''; +} diff --git a/src/src/utils/getValuesMedian.ts b/src/src/utils/getValuesMedian.ts new file mode 100644 index 00000000..890c5369 --- /dev/null +++ b/src/src/utils/getValuesMedian.ts @@ -0,0 +1,9 @@ +export function getValuesMedian(values: number[] | Float64Array): number { + values.sort((a, b) => a - b); + const length = values.length; + if (length % 2 === 0) { + return (values[length / 2] + values[length / 2 - 1]) / 2; + } + + return values[(length - 1) / 2]; +} diff --git a/src/src/utils/helper/downloadLink/downloadLink.ts b/src/src/utils/helper/downloadLink/downloadLink.ts new file mode 100644 index 00000000..a77096b4 --- /dev/null +++ b/src/src/utils/helper/downloadLink/downloadLink.ts @@ -0,0 +1,20 @@ +/** + * [Download file] + * + * Usage: downloadLink(href, fileName) + * + * @param {string} href a link to file which needs to be downloaded, + * @param {string} fileName a name of file which needs to be downloaded, + * @returns {void} + */ +function downloadLink(href: string, fileName: string = 'file'): void { + let link = document.createElement('a'); + link.download = fileName; + link.style.opacity = '0'; + document.body.append(link); + link.href = href; + link.click(); + link.remove(); +} + +export default downloadLink; diff --git a/src/src/utils/helper/float64FromUint8/float64FromUint8.ts b/src/src/utils/helper/float64FromUint8/float64FromUint8.ts new file mode 100644 index 00000000..33893d60 --- /dev/null +++ b/src/src/utils/helper/float64FromUint8/float64FromUint8.ts @@ -0,0 +1,13 @@ +/** + * [Parse Uint8Array to Float64Array] + * + * Usage: float64FromUint8(buffer) + * + * @param {Uint8Array} uint8 Uint8Array to be parsed to Float64Array, + * @returns {Float64Array} + */ +function float64FromUint8(uint8: Uint8Array = new Uint8Array()): Float64Array { + return new Float64Array(uint8.slice().buffer); +} + +export default float64FromUint8; diff --git a/src/src/utils/helper/getPathSegments/getPathSegments.test.ts b/src/src/utils/helper/getPathSegments/getPathSegments.test.ts new file mode 100644 index 00000000..f16670f1 --- /dev/null +++ b/src/src/utils/helper/getPathSegments/getPathSegments.test.ts @@ -0,0 +1,25 @@ +import { toEqual } from 'tests/utils'; + +import getPathSegments from './getPathSegments'; + +describe('[getPathSegments]', () => { + it('should return object type', () => { + const pathSegments = getPathSegments('run.creation_time'); + toEqual('object', typeof pathSegments); + }); + + it('should equal to', () => { + const pathSegments = getPathSegments('objectWrapper.run.creation_time'); + toEqual(['objectWrapper', 'run', 'creation_time'], pathSegments); + }); + + it('should equal to', () => { + const pathSegments = getPathSegments(''); + toEqual([], pathSegments); + }); + + it('should equal to', () => { + const pathSegments = getPathSegments(false as any); + toEqual([], pathSegments); + }); +}); diff --git a/src/src/utils/helper/getPathSegments/getPathSegments.ts b/src/src/utils/helper/getPathSegments/getPathSegments.ts new file mode 100644 index 00000000..a059f2ab --- /dev/null +++ b/src/src/utils/helper/getPathSegments/getPathSegments.ts @@ -0,0 +1,28 @@ +/** + * [Get segments from path] + * + * Usage: getPathSegments(path) + * + * @param {string} path - full path to object property + * @return {string[]} parts - segments of path + */ +function getPathSegments(path: string): string[] { + if (typeof path !== 'string' || path === '') return []; + const parts = []; + const pathArray = path.split('.'); + + for (let i = 0; i < pathArray.length; i++) { + let p = pathArray[i]; + + while (p[p.length - 1] === '\\' && pathArray[i + 1] !== undefined) { + p = p.slice(0, -1) + '.'; + p += pathArray[++i]; + } + + parts.push(p); + } + + return parts; +} + +export default getPathSegments; diff --git a/src/src/utils/helper/getSVGString/getSVGString.test.ts b/src/src/utils/helper/getSVGString/getSVGString.test.ts new file mode 100644 index 00000000..bfd8b379 --- /dev/null +++ b/src/src/utils/helper/getSVGString/getSVGString.test.ts @@ -0,0 +1,14 @@ +import { toEqual } from 'tests/utils'; + +import getSVGString from './getSVGString'; + +describe('[getSVGString]', () => { + it('should return string type value', () => { + let svgNode: SVGSVGElement = document.createElementNS( + 'http://www.w3.org/2000/svg', + 'svg', + ); + const svgString = getSVGString(svgNode); + toEqual('string', typeof svgString); + }); +}); diff --git a/src/src/utils/helper/getSVGString/getSVGString.ts b/src/src/utils/helper/getSVGString/getSVGString.ts new file mode 100644 index 00000000..60645a8f --- /dev/null +++ b/src/src/utils/helper/getSVGString/getSVGString.ts @@ -0,0 +1,76 @@ +/** + * [Svg node element to serialized string](http://bl.ocks.org/Rokotyan/0556f8facbaf344507cdc45dc3622177) + * + * Usage: getSVGString(svgNode) + * + * @param {SVGSVGElement} svgNode a node element, + * @returns {string} serialized svg by using XMLSerializer(https://developer.mozilla.org/en-US/docs/Web/API/XMLSerializer) + */ +function getSVGString(svgNode: SVGSVGElement): string { + svgNode.setAttribute('xlink', 'http://www.w3.org/1999/xlink'); + const cssStyleText = getCSSStyles(svgNode); + appendCSS(cssStyleText, svgNode); + + const serializer = new XMLSerializer(); + let svgString = serializer.serializeToString(svgNode); + svgString = svgString.replace(/(\w+)?:?xlink=/g, 'xmlns:xlink='); // Fix root xlink without namespace + svgString = svgString.replace(/NS\d+:href/g, 'xlink:href'); // Safari NS namespace fix + return svgString; +} + +function getCSSStyles(parentElement: SVGSVGElement): string { + const selectorTextArr = []; + + // Add Parent element Id and Classes to the list + selectorTextArr.push('#' + parentElement.id); + for (let c = 0; c < parentElement.classList.length; c++) + if (!contains('.' + parentElement.classList[c], selectorTextArr)) + selectorTextArr.push('.' + parentElement.classList[c]); + + // Add Children element Ids and Classes to the list + const nodes = parentElement.getElementsByTagName('*'); + for (let i = 0; i < nodes.length; i++) { + const id = nodes[i].id; + if (!contains('#' + id, selectorTextArr)) selectorTextArr.push('#' + id); + + const classes = nodes[i].classList; + for (let c = 0; c < classes.length; c++) + if (!contains('.' + classes[c], selectorTextArr)) + selectorTextArr.push('.' + classes[c]); + } + + // Extract CSS Rules + let extractedCSSText = ''; + for (let i = 0; i < document.styleSheets.length; i++) { + const s = document.styleSheets[i]; + + try { + if (!s.cssRules) continue; + } catch (e) { + if (e.name !== 'SecurityError') throw e; // for Firefox + continue; + } + + const cssRules = s.cssRules; + for (let r = 0; r < cssRules.length; r++) { + if (contains((cssRules[r] as any).selectorText, selectorTextArr)) + extractedCSSText += cssRules[r].cssText; + } + } + + return extractedCSSText; + + function contains(str: string, arr: string[]) { + return arr.indexOf(str) === -1 ? false : true; + } +} + +function appendCSS(cssText: string, element: SVGSVGElement): void { + let styleElement = document.createElement('style'); + styleElement.setAttribute('type', 'text/css'); + styleElement.innerHTML = cssText; + let refNode = element.hasChildNodes() ? element.children[0] : null; + element.insertBefore(styleElement, refNode); +} + +export default getSVGString; diff --git a/src/src/utils/helper/getValue/getValue.test.ts b/src/src/utils/helper/getValue/getValue.test.ts new file mode 100644 index 00000000..f98c84ec --- /dev/null +++ b/src/src/utils/helper/getValue/getValue.test.ts @@ -0,0 +1,37 @@ +import { toEqual } from 'tests/utils'; + +import getValue from './getValue'; + +describe('[getValue]', () => { + const obj = { + a: { + b: { + length: { + valueOf: { + name: 'nested prop', + }, + }, + }, + }, + }; + + it('should equal to', () => { + const value = getValue(obj, 'a.b.length.valueOf.name'); + toEqual('nested prop', value); + }); + + it('should equal to', () => { + const value = getValue(obj.a.b, 'length.valueOf'); + toEqual({ name: 'nested prop' }, value); + }); + + it('should equal to', () => { + const value = getValue(obj.a.b, ['length', 'valueOf']); + toEqual({ name: 'nested prop' }, value); + }); + + it('should equal to', () => { + const value = getValue(null, ['length', 'valueOf'], 'defaultValue'); + toEqual('defaultValue', value); + }); +}); diff --git a/src/src/utils/helper/getValue/getValue.ts b/src/src/utils/helper/getValue/getValue.ts new file mode 100644 index 00000000..5027d0a8 --- /dev/null +++ b/src/src/utils/helper/getValue/getValue.ts @@ -0,0 +1,55 @@ +import stringToPath from 'utils/stringToPath'; +/** + * [Get value from nested object by passed path](https://github.com/sindresorhus/dot-prop/blob/master/index.js) + * + * Usage: getValue(object, path, defaultValue) + * + * @param {Record|null} object - nested object + * @param {string|string[]} path - key, to nested object property value + * @param {any} defaultValue - default value, if there is no corresponding key + * @return value - nested object property value or default value + */ +export function getValue( + object: Record | null, + path: string | string[], + defaultValue?: any, +) { + if ( + object === null || + typeof object !== 'object' || + !(typeof path === 'string' || Array.isArray(path)) + ) { + return defaultValue; + } + + let pathArray; + if (typeof path === 'string' && object.propertyIsEnumerable(path)) { + pathArray = [path]; + } else if (Array.isArray(path)) { + pathArray = path; + } else { + pathArray = stringToPath(path); + } + + for (let i = 0; i < pathArray.length; i++) { + if ( + typeof object !== 'object' || + !object.propertyIsEnumerable(pathArray[i]) + ) { + return defaultValue; + } + + object = object[pathArray[i]]; + + if (object === undefined || object === null) { + if (i !== pathArray.length - 1) { + return defaultValue; + } + break; + } + } + + return object; +} + +export default getValue; diff --git a/src/src/utils/helper/imgSource2Image/imgSource2Image.ts b/src/src/utils/helper/imgSource2Image/imgSource2Image.ts new file mode 100644 index 00000000..3fa1ac4c --- /dev/null +++ b/src/src/utils/helper/imgSource2Image/imgSource2Image.ts @@ -0,0 +1,52 @@ +import { FORMAT_ENUM } from 'components/ExportPreview/config'; +/** + * [Convert image source to the image by specifying format and dimension] + * + * Usage: imgSource2Image({ imgSrc, width, height, format, callback }) + * + * @param {string} imgSrc valid html image source, + * @param {number} width width of the converted image, + * @param {number} height height of the converted image, + * @param {FORMAT_ENUM} format of the converted image, + * @param {(blob: Blob) => void;} callback of the image conversion, + * @returns {void} + */ +function imgSource2Image({ + imgSrc, + width, + height, + format = FORMAT_ENUM.JPEG, + callback, +}: { + imgSrc: string; + width: number; + height: number; + format: Omit; + callback: (blob: Blob) => void; +}): void { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + if (canvas && context) { + canvas.width = width; + canvas.height = height; + const image = new Image(); + image.onload = function () { + if (context) { + context.clearRect(0, 0, width, height); + context.drawImage(image, 0, 0, width, height); + canvas.toBlob( + (blob) => { + if (blob && callback) { + callback(blob); + } + }, + 'image/' + format, + 1, + ); + } + }; + image.src = imgSrc; + } +} + +export default imgSource2Image; diff --git a/src/src/utils/helper/inIframe/inIframe.ts b/src/src/utils/helper/inIframe/inIframe.ts new file mode 100644 index 00000000..05424c75 --- /dev/null +++ b/src/src/utils/helper/inIframe/inIframe.ts @@ -0,0 +1,9 @@ +function inIframe() { + try { + return window.self !== window.top; + } catch (e) { + return true; + } +} + +export default inIframe; diff --git a/src/src/utils/helper/index.ts b/src/src/utils/helper/index.ts new file mode 100644 index 00000000..3a2470da --- /dev/null +++ b/src/src/utils/helper/index.ts @@ -0,0 +1,21 @@ +import getValue from './getValue/getValue'; +import getPathSegments from './getPathSegments/getPathSegments'; +import inIframe from './inIframe/inIframe'; +import imgSource2Image from './imgSource2Image/imgSource2Image'; +import getSVGString from './getSVGString/getSVGString'; +import downloadLink from './downloadLink/downloadLink'; +import measureTextWidth from './measureTextWidth/measureTextWidth'; +import toTextEllipsis from './toTextEllipsis/toTextEllipsis'; +import float64FromUint8 from './float64FromUint8/float64FromUint8'; + +export { + getPathSegments, + getValue, + inIframe, + imgSource2Image, + getSVGString, + downloadLink, + measureTextWidth, + toTextEllipsis, + float64FromUint8, +}; diff --git a/src/src/utils/helper/measureTextWidth/measureTextWidth.test.ts b/src/src/utils/helper/measureTextWidth/measureTextWidth.test.ts new file mode 100644 index 00000000..d6011f42 --- /dev/null +++ b/src/src/utils/helper/measureTextWidth/measureTextWidth.test.ts @@ -0,0 +1,15 @@ +import { toBeLessThanOrEqual, toEqual } from 'tests/utils'; + +import { measureTextWidth } from 'utils/helper'; + +describe('[measureTextWidth]', () => { + it('should return number type value', () => { + const measuredTextWidth = measureTextWidth({ text: 'test text' }); + toEqual('number', typeof measuredTextWidth); + }); + + it('should return positive number', () => { + const measuredTextWidth = measureTextWidth({ text: 'test text' }); + toBeLessThanOrEqual(0, measuredTextWidth); + }); +}); diff --git a/src/src/utils/helper/measureTextWidth/measureTextWidth.ts b/src/src/utils/helper/measureTextWidth/measureTextWidth.ts new file mode 100644 index 00000000..72d33bb7 --- /dev/null +++ b/src/src/utils/helper/measureTextWidth/measureTextWidth.ts @@ -0,0 +1,36 @@ +/** + * [Measure text width] + * measure the size taken to render the supplied text + * you can supply additional style information too if you have it + * + * Usage: measureTextWidth({ text, fontSize, fontFamily, fontWeight }) + * + * @param {string} text which size needs to measure, + * @param {string} fontSize font size of the measured text, + * @param {string} fontFamily font family of the measured text, + * @param {number} fontWeight font weight of the measured text, + * @returns {number} represents the width of a piece of text in the canvas + */ +const canvas = document.createElement('canvas'); +const context = canvas.getContext('2d'); + +function measureTextWidth({ + text, + fontSize = '16px', + fontFamily = 'Inter, sans-serif', + fontWeight = 400, +}: { + text: string; + fontSize?: string; + fontFamily?: string; + fontWeight?: number; +}): number { + if (canvas && context) { + context.font = `${fontWeight} ${fontSize} ${fontFamily}`; + const textMetrics = context.measureText(text); + return textMetrics?.width || 0; + } + return 0; +} + +export default measureTextWidth; diff --git a/src/src/utils/helper/toTextEllipsis/toTextEllipsis.test.ts b/src/src/utils/helper/toTextEllipsis/toTextEllipsis.test.ts new file mode 100644 index 00000000..7c959481 --- /dev/null +++ b/src/src/utils/helper/toTextEllipsis/toTextEllipsis.test.ts @@ -0,0 +1,16 @@ +import { toBeGreaterThanOrEqual, toEqual } from 'tests/utils'; + +import toTextEllipsis from './toTextEllipsis'; + +describe('[toTextEllipsis]', () => { + it('should return string type value', () => { + const textEllipsis = toTextEllipsis({ text: 'test text', width: 20 }); + toEqual('string', typeof textEllipsis); + }); + + it('should return text which length is smaller or equal to received text length', () => { + const text = 'test text'; + const textEllipsis = toTextEllipsis({ text, width: 20 }); + toBeGreaterThanOrEqual(text.length, textEllipsis.length); + }); +}); diff --git a/src/src/utils/helper/toTextEllipsis/toTextEllipsis.ts b/src/src/utils/helper/toTextEllipsis/toTextEllipsis.ts new file mode 100644 index 00000000..957c8e82 --- /dev/null +++ b/src/src/utils/helper/toTextEllipsis/toTextEllipsis.ts @@ -0,0 +1,52 @@ +import { measureTextWidth } from 'utils/helper'; +/** + * [Display the text by specified width] + * Cut text and display ellipsis if text width is more than specified width + * + * Usage: toTextEllipsis({ text, width, fontSize, fontFamily, fontWeight }) + * + * @param {string} text which needs to display by specified width, + * @param {number} width maximum width of the text, + * @param {string} fontSize font size of the measured text, + * @param {string} fontFamily font family of the measured text, + * @param {number} fontWeight font weight of the measured text, + * @returns {string} ellipsis text + */ +function toTextEllipsis({ + text, + width, + fontSize = '16px', + fontFamily = 'Inter, sans-serif', + fontWeight = 400, + recourseIndex = 0, +}: { + text: string; + width: number; + fontSize?: string; + fontFamily?: string; + fontWeight?: number; + recourseIndex?: number; +}): string { + const currentTextWidth = measureTextWidth({ + text, + fontSize, + fontFamily, + fontWeight, + }); + + if (recourseIndex === 0 && width > currentTextWidth) { + return text; + } else if (currentTextWidth > width) { + return toTextEllipsis({ + text: text.slice(0, -1), + width, + fontSize, + fontFamily, + fontWeight, + recourseIndex: ++recourseIndex, + }); + } + return text.slice(0, -3) + '...'; +} + +export default toTextEllipsis; diff --git a/src/src/utils/hexToRgbA.ts b/src/src/utils/hexToRgbA.ts new file mode 100644 index 00000000..c623927b --- /dev/null +++ b/src/src/utils/hexToRgbA.ts @@ -0,0 +1,22 @@ +function hexToRgbA(hex: string, opacity: number): string { + let hexCode = hex?.substring(1).split(''); + if (hexCode.length === 3) { + hexCode = [ + hexCode[0], + hexCode[0], + hexCode[1], + hexCode[1], + hexCode[2], + hexCode[2], + ]; + } + const tmpHex = +('0x' + hexCode.join('')); + return ( + 'rgba(' + + [(tmpHex >> 16) & 255, (tmpHex >> 8) & 255, tmpHex & 255].join(',') + + ',' + + opacity || 1 + ')' + ); +} + +export default hexToRgbA; diff --git a/src/src/utils/isMetricHash.ts b/src/src/utils/isMetricHash.ts new file mode 100644 index 00000000..4b1380b3 --- /dev/null +++ b/src/src/utils/isMetricHash.ts @@ -0,0 +1,8 @@ +import { AIM64_ENCODING_PREFIX, decode } from './encoder/encoder'; + +export function isMetricHash(key: string) { + return ( + key?.startsWith(AIM64_ENCODING_PREFIX) && + JSON.parse(decode(key)).hasOwnProperty('metricName') + ); +} diff --git a/src/src/utils/isSystemMetric.ts b/src/src/utils/isSystemMetric.ts new file mode 100644 index 00000000..5bd4b5df --- /dev/null +++ b/src/src/utils/isSystemMetric.ts @@ -0,0 +1,7 @@ +import { systemMetricsDict } from 'config/systemMetrics/systemMetrics'; + +import { systemMetricsDictType } from 'types/utils/formatSystemMetricName'; + +export function isSystemMetric(metric: string): boolean { + return !!systemMetricsDict[metric as keyof systemMetricsDictType]; +} diff --git a/src/src/utils/jsonParse.ts b/src/src/utils/jsonParse.ts new file mode 100644 index 00000000..1ee22617 --- /dev/null +++ b/src/src/utils/jsonParse.ts @@ -0,0 +1,8 @@ +export function jsonParse(value: string) { + try { + JSON.parse(value); + } catch (e) { + return false; + } + return JSON.parse(value); +} diff --git a/src/src/utils/minMaxOfArray.ts b/src/src/utils/minMaxOfArray.ts new file mode 100644 index 00000000..97e84c05 --- /dev/null +++ b/src/src/utils/minMaxOfArray.ts @@ -0,0 +1,16 @@ +export function minMaxOfArray(arr: number[]): number[] { + if (arr.length === 0) { + return []; + } + let max: number = arr[0]; + let min: number = arr[0]; + for (let i = 1; i < arr.length; i++) { + if (arr[i] > max) { + max = arr[i]; + } + if (min > arr[i]) { + min = arr[i]; + } + } + return [min, max]; +} diff --git a/src/src/utils/object/getObjectPaths.ts b/src/src/utils/object/getObjectPaths.ts new file mode 100644 index 00000000..b7f84af8 --- /dev/null +++ b/src/src/utils/object/getObjectPaths.ts @@ -0,0 +1,38 @@ +import traverseTree from './traverseTree'; + +/** + * function getObjectPaths + * input - { a: 1, b: 1, c: [], d: { e: { f: 1} } + * trail - '123' + * delimiter - '.' + * output- [ + * '123.a', + * '123.b', + * '123.c', + * '123.d', + * '123.d.e', + * '123.d.e.f' + * ] + * @param {Record} obj - target object + * @param {string} prefix - the prefix should be concatenated at the start of all paths, aka root node value + * @param {string} delimiter - delimiter to connect paths + * @returns {Array} - returns an array of all paths + */ +function getObjectPaths( + obj: Record, + prefix: string = '', + delimiter: string = '.', +): Array { + let arr: Array = []; + traverseTree( + obj, + (...args: any[]) => { + let key = args[2] ? `${args[2]}${delimiter}${args[0]}` : args[0]; + arr.push(key); + }, + prefix, + ); + return arr; +} + +export default getObjectPaths; diff --git a/src/src/utils/object/traverseTree.ts b/src/src/utils/object/traverseTree.ts new file mode 100644 index 00000000..73fcee99 --- /dev/null +++ b/src/src/utils/object/traverseTree.ts @@ -0,0 +1,29 @@ +import _ from 'lodash-es'; + +type Callback = (key: string, value: any, trail: string) => void; + +/** + * function traverseTree + * This function traverses through object keys as tree + * @param {Record} obj - an object should be traversed + * @param {Callback} callback - this callback gets current key, value, and generated trail for the iteration + * this function has context which is the actual object passed to traverseTree method, it means you can use this inside the callback + * @param trail - prefix to add at the start of path + */ +function traverseTree( + obj: Record, + callback: Callback, + trail: string = '', +): void { + Object.keys(obj).forEach((key: string) => { + let value = obj[key]; + callback.call(obj, key, value, trail); + + if (_.isObject(value)) { + const k = trail ? `${trail}.${key}` : key; + traverseTree(value, callback, k); + } + }); +} + +export default traverseTree; diff --git a/src/src/utils/onCopyToClipBoard.ts b/src/src/utils/onCopyToClipBoard.ts new file mode 100644 index 00000000..81e6cb61 --- /dev/null +++ b/src/src/utils/onCopyToClipBoard.ts @@ -0,0 +1,58 @@ +import { INotification } from 'types/components/NotificationContainer/NotificationContainer'; +import { IModel } from 'types/services/models/model'; + +export function onCopyToClipBoard( + text: string, + isCopied?: boolean, + notificationCallBack?: ({ + notification, + model, + }: { + notification: INotification; + model: IModel; + }) => void, + notificationBody?: { notification: INotification; model: IModel }, +) { + if (text && !isCopied) { + if (navigator.clipboard && window.isSecureContext) { + navigator.clipboard + ?.writeText(text) + ?.then(() => { + if (notificationCallBack && notificationBody) { + notificationCallBack(notificationBody); + } + }) + .catch(() => { + if (notificationCallBack && notificationBody) { + notificationBody.notification.severity = 'error'; + notificationBody.notification.messages = ["Content isn't copied"]; + notificationCallBack(notificationBody); + } + }); + } else { + const textArea: HTMLTextAreaElement = document.createElement('textarea'); + textArea.value = text; + + // make the textarea out of viewport + textArea.style.position = 'fixed'; + textArea.style.left = '-400vw'; + textArea.style.top = '-400vh'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + try { + document.execCommand('copy'); + textArea.remove(); + if (notificationCallBack && notificationBody) { + notificationCallBack(notificationBody); + } + } catch (err) { + if (notificationCallBack && notificationBody) { + notificationBody.notification.severity = 'error'; + notificationBody.notification.messages = ["Content isn't copied"]; + notificationCallBack(notificationBody); + } + } + } + } +} diff --git a/src/src/utils/processDurationTime.ts b/src/src/utils/processDurationTime.ts new file mode 100644 index 00000000..67d63860 --- /dev/null +++ b/src/src/utils/processDurationTime.ts @@ -0,0 +1,14 @@ +import moment from 'moment'; + +import shortEnglishHumanizer from './shortEnglishHumanizer'; + +export function processDurationTime( + startTime: number, + endTime: number, +): string { + const duration = moment(startTime).diff(moment(endTime)); + + return shortEnglishHumanizer(duration, { + maxDecimalPoints: 2, + }); +} diff --git a/src/src/utils/regression/linearRegression.test.ts b/src/src/utils/regression/linearRegression.test.ts new file mode 100644 index 00000000..f496b8d3 --- /dev/null +++ b/src/src/utils/regression/linearRegression.test.ts @@ -0,0 +1,64 @@ +import { toEqual } from 'tests/utils'; + +import { linearRegression, linearRegressionLine } from './linearRegression'; + +describe('[linearRegression calculation]', () => { + it('correctly generates a line for a 0, 0 to 1, 1 dataset', () => { + const l = linearRegressionLine( + linearRegression([ + [0, 0], + [1, 1], + ]), + ); + toEqual(l(0), 0); + toEqual(l(0.5), 0.5); + toEqual(l(1), 1); + }); + + it('correctly generates a line for a 0, 0 to 1, 0 dataset', () => { + const l = linearRegressionLine( + linearRegression([ + [0, 0], + [1, 0], + ]), + ); + toEqual(l(0), 0); + toEqual(l(0.5), 0); + toEqual(l(1), 0); + }); + + it('handles a single-point sample', () => { + const l = linearRegressionLine(linearRegression([[0, 0]])); + toEqual(l(10), 0); + }); + + it('a straight line will have a slope of 0', () => { + toEqual( + linearRegression([ + [0, 0], + [1, 0], + ]), + { m: 0, b: 0 }, + ); + }); + + it('a line at 50% grade', () => { + toEqual( + linearRegression([ + [0, 0], + [1, 0.5], + ]), + { m: 0.5, b: 0 }, + ); + }); + + it('a line with a high y-intercept', () => { + toEqual( + linearRegression([ + [0, 20], + [1, 10], + ]), + { m: -10, b: 20 }, + ); + }); +}); diff --git a/src/src/utils/regression/linearRegression.ts b/src/src/utils/regression/linearRegression.ts new file mode 100644 index 00000000..dd22225a --- /dev/null +++ b/src/src/utils/regression/linearRegression.ts @@ -0,0 +1,98 @@ +/** + * [Simple linear regression](http://en.wikipedia.org/wiki/Simple_linear_regression) + * is a simple way to find a fitted line + * between a set of coordinates. This algorithm finds the slope and y-intercept of a regression line + * using the least sum of squares. + * + * @param {Array>} data an array of two-element of arrays, + * like `[[0, 1], [2, 3]]` + * @returns {Object} object containing slope and intersect of regression line + * @example + * linearRegression([[0, 0], [1, 1]]); // => { m: 1, b: 0 } + */ +export function linearRegression(data: [number, number][]): { + m: number; + b: number; +} { + let m; + let b; + + // Store data length in a local variable to reduce + // repeated object property lookups + const dataLength = data.length; + + //if there's only one point, arbitrarily choose a slope of 0 + //and a y-intercept of whatever the y of the initial point is + if (dataLength === 1) { + m = 0; + b = data[0][1]; + } else { + // Initialize our sums and scope the `m` and `b` + // variables that define the line. + let sumX = 0; + let sumY = 0; + let sumXX = 0; + let sumXY = 0; + + // Use local variables to grab point values + // with minimal object property lookups + let point; + let x; + let y; + + // Gather the sum of all x values, the sum of all + // y values, and the sum of x^2 and (x*y) for each + // value. + // + // In math notation, these would be SS_x, SS_y, SS_xx, and SS_xy + for (let i = 0; i < dataLength; i++) { + point = data[i]; + x = point[0]; + y = point[1]; + + sumX += x; + sumY += y; + + sumXX += x * x; + sumXY += x * y; + } + + // `m` is the slope of the regression line + m = (dataLength * sumXY - sumX * sumY) / (dataLength * sumXX - sumX * sumX); + + // `b` is the y-intercept of the line. + b = sumY / dataLength - (m * sumX) / dataLength; + } + + // Return both values as an object. + return { + m: m, + b: b, + }; +} + +/** + * Given the output of `linearRegression`: an object + * with `m` and `b` values indicating slope and intercept, + * respectively, generate a line function that translates + * x values into y values. + * + * @param {Object} mb object with `m` and `b` members, representing + * slope and intersect of desired line + * @returns {Function} method that computes y-value at any given + * x-value on the line. + * @example + * var l = linearRegressionLine(linearRegression([[0, 0], [1, 1]])); + * l(0) // = 0 + * l(2) // = 2 + * linearRegressionLine({ b: 0, m: 1 })(1); // => 1 + * linearRegressionLine({ b: 1, m: 1 })(1); // => 2 + */ +export function linearRegressionLine(mb: { b: number; m: number }) { + // Return a function that computes a `y` value for each + // x value it is given, based on the values of `b` and `a` + // that we just computed. + return function (x: number): number { + return mb.b + mb.m * x; + }; +} diff --git a/src/src/utils/regression/loess.test.ts b/src/src/utils/regression/loess.test.ts new file mode 100644 index 00000000..3dc48e23 --- /dev/null +++ b/src/src/utils/regression/loess.test.ts @@ -0,0 +1,266 @@ +import { toEqual } from 'tests/utils'; + +import loess from './loess'; + +const data: [number, number][] = [ + [1900, 57.5605], + [1901, 57.3214], + [1902, 56.2134], + [1903, 56.317], + [1904, 57.4467], + [1905, 57.1332], + [1906, 57.2392], + [1907, 56.5545], + [1908, 56.2721], + [1909, 56.2912], + [1910, 57.7532], + [1911, 55.474], + [1912, 55.5628], + [1913, 56.5263], + [1914, 57.4455], + [1915, 56.8189], + [1916, 55.5932], + [1917, 56.6997], + [1918, 56.9079], + [1919, 56.3611], + [1920, 56.1257], + [1921, 57.3778], + [1922, 56.1452], + [1923, 56.4466], + [1924, 57.1546], + [1925, 57.206], + [1926, 58.8471], + [1927, 56.94], + [1928, 57.7148], + [1929, 57.3422], + [1930, 56.9745], + [1931, 58.3638], + [1932, 56.9607], + [1933, 56.8247], + [1934, 59.7805], + [1935, 56.8945], + [1936, 58.6637], + [1937, 57.2449], + [1938, 57.3329], + [1939, 58.4247], + [1940, 58.8798], + [1941, 57.1222], + [1942, 57.1411], + [1943, 57.894], + [1944, 56.2842], + [1945, 57.1573], + [1946, 56.8022], + [1947, 57.6003], + [1948, 55.6891], + [1949, 56.2792], + [1950, 58.1899], + [1951, 57.2899], + [1952, 56.8036], + [1953, 57.2433], + [1954, 57.6142], + [1955, 56.3011], + [1956, 57.0172], + [1957, 57.1288], + [1958, 58.9603], + [1959, 59.0416], + [1960, 58.0866], + [1961, 57.8652], + [1962, 57.4384], + [1963, 57.1077], + [1964, 56.6202], + [1965, 56.774], + [1966, 58.0992], + [1967, 57.5668], + [1968, 57.5989], + [1969, 57.5899], + [1970, 57.8767], + [1971, 56.2718], + [1972, 57.2934], + [1973, 57.3641], + [1974, 57.7036], + [1975, 56.3447], + [1976, 57.5107], + [1977, 58.0088], + [1978, 57.6893], + [1979, 57.7485], + [1980, 58.1052], + [1981, 59.3551], + [1982, 56.4003], + [1983, 57.6184], + [1984, 58.2609], + [1985, 57.3929], + [1986, 58.9427], + [1987, 58.3293], + [1988, 58.7852], + [1989, 58.1885], + [1990, 58.0488], + [1991, 58.16], + [1992, 59.2918], + [1993, 57.7408], + [1994, 58.1055], + [1995, 58.9677], + [1996, 59.594], + [1997, 59.1923], + [1998, 56.7942], + [1999, 58.0356], + [2000, 58.8363], + [2001, 59.2216], + [2002, 58.8964], + [2003, 59.529], + [2004, 58.9128], + [2005, 58.6833], + [2006, 58.6975], + [2007, 58.9929], + [2008, 58.9459], + [2009, 58.917], + [2010, 57.7926], + [2011, 57.5186], + [2012, 59.5448], + [2013, 59.3921], + [2014, 61.5208], + [2015, 60.7992], + [2016, 60.1429], + [2017, 60.4208], +]; + +describe('[loess calculation]', () => { + it('loess(data, bandwidth) calculates the LOESS regression', () => { + function shuffle(arr: [number, number][]) { + let m = arr.length, + t, + i; + while (m) { + i = Math.floor(Math.random() * m--); + t = arr[m]; + arr[m] = arr[i]; + arr[i] = t; + } + return arr; + } + + const r = loess(shuffle(data), 0.3); + + const output = [ + [1900, 56.842036038120746], + [1901, 56.82388042072633], + [1902, 56.8070189828568], + [1903, 56.791439968282916], + [1904, 56.777183782649004], + [1905, 56.76433479172034], + [1906, 56.75292962790576], + [1907, 56.74294889153739], + [1908, 56.73431787165204], + [1909, 56.72695170364497], + [1910, 56.72078756696423], + [1911, 56.71576021371101], + [1912, 56.711699920350995], + [1913, 56.708473636333565], + [1914, 56.7060880931565], + [1915, 56.70480534893961], + [1916, 56.70576431788093], + [1917, 56.71232026149931], + [1918, 56.747900012306594], + [1919, 56.789420693808246], + [1920, 56.83748213534298], + [1921, 56.89225052264274], + [1922, 56.95199450220717], + [1923, 57.014438615650704], + [1924, 57.07859385148974], + [1925, 57.14473392742243], + [1926, 57.21214134229593], + [1927, 57.27901032976046], + [1928, 57.343086401323646], + [1929, 57.40283047680427], + [1930, 57.45672812128807], + [1931, 57.50254743337572], + [1932, 57.5382672855882], + [1933, 57.561956392439235], + [1934, 57.57327443318934], + [1935, 57.57348137525841], + [1936, 57.56400274816263], + [1937, 57.54670946886326], + [1938, 57.52367643827728], + [1939, 57.49687396721632], + [1940, 57.46813369606984], + [1941, 57.43860331605789], + [1942, 57.40872244047538], + [1943, 57.37987901554629], + [1944, 57.35366139781617], + [1945, 57.331848081812225], + [1946, 57.315396344090935], + [1947, 57.30449888731605], + [1948, 57.29847592437323], + [1949, 57.2955374044323], + [1950, 57.29521879323507], + [1951, 57.298018542818255], + [1952, 57.303440826136594], + [1953, 57.31226477763196], + [1954, 57.32510063614931], + [1955, 57.34264762617605], + [1956, 57.363678118397104], + [1957, 57.38591358081206], + [1958, 57.40755388563386], + [1959, 57.42815511755062], + [1960, 57.44632106674749], + [1961, 57.46071240516167], + [1962, 57.471416346181], + [1963, 57.478388358377934], + [1964, 57.48179755794645], + [1965, 57.48281654883124], + [1966, 57.4843219223156], + [1967, 57.48668592399354], + [1968, 57.488693587174154], + [1969, 57.490265177390114], + [1970, 57.49205947840186], + [1971, 57.49573834430299], + [1972, 57.503546856084725], + [1973, 57.518706091853566], + [1974, 57.54298958003794], + [1975, 57.575914537813304], + [1976, 57.61500221122251], + [1977, 57.65826392696781], + [1978, 57.703917579810366], + [1979, 57.7507160415611], + [1980, 57.79897718774289], + [1981, 57.85045711635498], + [1982, 57.90635482156091], + [1983, 57.96475127434016], + [1984, 58.022715613240194], + [1985, 58.07845598392329], + [1986, 58.1311956998041], + [1987, 58.18085072813873], + [1988, 58.22812103454775], + [1989, 58.27418703914001], + [1990, 58.31918578044981], + [1991, 58.36292543303682], + [1992, 58.40569657511456], + [1993, 58.44831291989403], + [1994, 58.490331693451246], + [1995, 58.53005874798704], + [1996, 58.565725371856644], + [1997, 58.59657656710402], + [1998, 58.62266138294421], + [1999, 58.64611783088632], + [2000, 58.67140622932588], + [2001, 58.71065577244432], + [2002, 58.762536824661204], + [2003, 58.820539956595965], + [2004, 58.88112858108126], + [2005, 58.94258080709306], + [2006, 59.00406425615884], + [2007, 59.0652053660954], + [2008, 59.125872778795475], + [2009, 59.18605858797359], + [2010, 59.24583648641658], + [2011, 59.30536787973602], + [2012, 59.36498198843687], + [2013, 59.425152996051466], + [2014, 59.4863324246197], + [2015, 59.54888991301135], + [2016, 59.61298575584295], + [2017, 59.67862753979371], + ]; + + toEqual(r, output); + }); +}); diff --git a/src/src/utils/regression/loess.ts b/src/src/utils/regression/loess.ts new file mode 100644 index 00000000..5257c77c --- /dev/null +++ b/src/src/utils/regression/loess.ts @@ -0,0 +1,187 @@ +// Adapted from d3-regression by Harry Stevens +// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE +// Adapted from science.js by Jason Davies +// License: https://github.com/jasondavies/science.js/blob/master/LICENSE +// Source: https://github.com/jasondavies/science.js/blob/master/src/stats/loess.js +// Adapted from vega-statistics by Jeffrey Heer +// License: https://github.com/vega/vega/blob/f058b099decad9db78301405dd0d2e9d8ba3d51a/LICENSE +// Source: https://github.com/vega/vega/blob/f21cb8792b4e0cbe2b1a3fd44b0f5db370dbaadb/packages/vega-statistics/src/regression/loess.js + +import { getValuesMedian } from 'utils/getValuesMedian'; + +const maxiters = 2; +const epsilon = 1e-12; +let x = (d: [number, number]) => d[0]; +let y = (d: [number, number]) => d[1]; + +export default function loess( + data: [number, number][], + bandwidth: number = 0.66, +) { + const [xv, yv, ux, uy] = points(data, x, y, true); + const n = xv.length; + const bw = Math.max(2, ~~(bandwidth * n)); // # nearest neighbors + const yhat = new Float64Array(n); + const residuals = new Float64Array(n); + const robustWeights = new Float64Array(n).fill(1); + + for (let iter = -1; ++iter <= maxiters; ) { + const interval: [number, number] = [0, bw - 1]; + + for (let i = 0; i < n; ++i) { + const dx = xv[i]; + const i0 = interval[0]; + const i1 = interval[1]; + const edge = dx - xv[i0] > xv[i1] - dx ? i0 : i1; + + let W = 0; + let X = 0; + let Y = 0; + let XY = 0; + let X2 = 0; + let denom = 1 / Math.abs(xv[edge] - dx || 1); // Avoid singularity + + for (let k = i0; k <= i1; ++k) { + const xk = xv[k]; + const yk = yv[k]; + const w = tricube(Math.abs(dx - xk) * denom) * robustWeights[k]; + const xkw = xk * w; + + W += w; + X += xkw; + Y += yk * w; + XY += yk * xkw; + X2 += xk * xkw; + } + + // Linear regression fit + const [a, b] = ols(X / W, Y / W, XY / W, X2 / W); + yhat[i] = a + b * dx; + residuals[i] = Math.abs(yv[i] - yhat[i]); + + updateInterval(xv, i + 1, interval); + } + + if (iter === maxiters) { + break; + } + + const medianResidual = getValuesMedian(residuals); + if (Math.abs(medianResidual) < epsilon) break; + + for (let i = 0, arg, w; i < n; ++i) { + arg = residuals[i] / (6 * medianResidual); + // Default to epsilon (rather than zero) for large deviations + // Keeping weights tiny but non-zero prevents singularites + robustWeights[i] = arg >= 1 ? epsilon : (w = 1 - arg * arg) * w; + } + } + + return output(xv, yhat, ux, uy); +} + +// Weighting kernel for local regression +function tricube(x: number) { + return (x = 1 - x * x * x) * x * x; +} + +// Advance sliding window interval of nearest neighbors +function updateInterval( + xv: Float64Array, + i: number, + interval: [number, number], +) { + let val = xv[i]; + let left = interval[0]; + let right = interval[1] + 1; + + if (right >= xv.length) return; + + // Step right if distance to new right edge is <= distance to old left edge + // Step when distance is equal to ensure movement over duplicate x values + while (i > left && xv[right] - val <= val - xv[left]) { + interval[0] = ++left; + interval[1] = right; + ++right; + } +} + +// Generate smoothed output points +// Average points with repeated x values +function output(xv: Float64Array, yhat: Float64Array, ux: number, uy: number) { + const n = xv.length; + const out = []; + let i = 0; + let cnt = 0; + let prev: number[] = []; + let v: number; + + for (; i < n; ++i) { + v = xv[i] + ux; + if (prev[0] === v) { + // Average output values + prev[1] += (yhat[i] - prev[1]) / ++cnt; + } else { + // Add new output point + cnt = 0; + prev[1] += uy; + prev = [v, yhat[i]]; + out.push(prev); + } + } + prev[1] += uy; + + return out; +} + +function points( + data: [number, number][], + x: (d: [number, number]) => number, + y: (d: [number, number]) => number, + sort: boolean, +): [Float64Array, Float64Array, number, number] { + data = data.filter((d: [number, number]) => { + let u = x(d); + let v = y(d); + return u !== null && isFinite(u) && v !== null && isFinite(v); + }); + + if (sort) { + data.sort((a: [number, number], b: [number, number]) => x(a) - x(b)); + } + + const n = data.length; + const X = new Float64Array(n); + const Y = new Float64Array(n); + + // extract values, calculate means + let ux = 0; + let uy = 0; + let xv; + let yv; + let d; + for (let i = 0; i < n; ) { + d = data[i]; + X[i] = xv = +x(d); + Y[i] = yv = +y(d); + ++i; + ux += (xv - ux) / i; + uy += (yv - uy) / i; + } + + // mean center the data + for (let i = 0; i < n; ++i) { + X[i] -= ux; + Y[i] -= uy; + } + + return [X, Y, ux, uy]; +} + +function ols(uX: number, uY: number, uXY: number, uX2: number) { + const delta = uX2 - uX * uX; + const slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta; + const intercept = uY - slope * uX; + + return [intercept, slope]; +} diff --git a/src/src/utils/removeOutliers.ts b/src/src/utils/removeOutliers.ts new file mode 100644 index 00000000..07bf64a5 --- /dev/null +++ b/src/src/utils/removeOutliers.ts @@ -0,0 +1,23 @@ +export function removeOutliers(values: number[], t = 2): number[] { + let filtered: number[] = [...values].sort((a: number, b: number) => a - b); + + while (true) { + const first = filtered[0]; + const last = filtered[filtered.length - 1]; + if (!filtered.length || first === last) { + break; + } + const q1: number = filtered[Math.floor(filtered.length / 4)]; + const q3: number = filtered[Math.ceil(filtered.length * (3 / 4))]; + const iqr = q3 - q1; // Inter-quartile range + const mean = filtered.reduce((pv, cv) => pv + cv, 0) / filtered.length; + const furthest = mean - first > last - mean ? first : last; + if (Math.abs(furthest - mean) > t * iqr) { + filtered = filtered.filter((elem: number) => elem !== furthest); + } else { + break; + } + } + + return filtered; +} diff --git a/src/src/utils/removeSyntaxErrBrackets.ts b/src/src/utils/removeSyntaxErrBrackets.ts new file mode 100644 index 00000000..16fd1418 --- /dev/null +++ b/src/src/utils/removeSyntaxErrBrackets.ts @@ -0,0 +1,25 @@ +import { ISyntaxErrorDetail } from 'types/components/NotificationContainer/NotificationContainer'; + +/** + * @function removeSyntaxErrBrackets - remove unused brackets from syntax error message + * @param detail {ISyntaxErrorDetail} - syntax error detail + * @param advancedModeOn {boolean} - advanced mode on/off + * + * @return syntaxErrDetail - processed syntax error detail + */ +function removeSyntaxErrBrackets( + detail: ISyntaxErrorDetail, + advancedModeOn: boolean, +): ISyntaxErrorDetail { + const offsetDiff = advancedModeOn ? 1 : 2; + const syntaxErrDetail: ISyntaxErrorDetail = { + ...detail, + offset: detail.offset - offsetDiff, + }; + if (detail.end_offset) { + syntaxErrDetail.end_offset = detail.end_offset - offsetDiff; + } + return syntaxErrDetail; +} + +export default removeSyntaxErrBrackets; diff --git a/src/src/utils/roundValue.ts b/src/src/utils/roundValue.ts new file mode 100644 index 00000000..8a90283f --- /dev/null +++ b/src/src/utils/roundValue.ts @@ -0,0 +1,17 @@ +/** + * [Round Value] + * + * The method used instead of toFixed (toFixed - returns string type) + * + * Usage: getRoundedValue(number, digits) + * + * @param {number} value the number which needs to be rounded, + * @param {number} digits the number of digits to appear after the decimal point, + * @returns {number} - formatted number + */ +function getRoundedValue(value: number, digits: number = 10): number { + let roundBy = 10 ** digits; + return Math.round(value * roundBy) / roundBy; +} + +export default getRoundedValue; diff --git a/src/src/utils/saveRecentSearches.ts b/src/src/utils/saveRecentSearches.ts new file mode 100644 index 00000000..a4e814c2 --- /dev/null +++ b/src/src/utils/saveRecentSearches.ts @@ -0,0 +1,35 @@ +import { getItem, setItem } from './storage'; + +/** + * Save last 3 successful searches to local storage + * @param appName - name of the explorer + * @param query - search query + * @example saveRecentSearches("metrics", "(run.active == False) and ((metric.name == "best_loss") or (metric.name == "bleu"))") + * @returns void + */ +function saveRecentSearches(appName: string, query: string): void { + if (query) { + // get recent searches from local storage + const recentSearches = JSON.parse(getItem('recentSearches') || '[]'); + + // find if search already exists + const searchIndex: number = recentSearches.findIndex( + (search: { explorer: string; query: string }) => + search.explorer === appName && search.query === query, + ); + + // skip adding search if it already exists + if (searchIndex !== -1) { + recentSearches.splice(searchIndex, 1); + } else if (recentSearches.length === 3) { + // remove last element if array length is 3 + recentSearches.pop(); + } + // push new search to the start of array + recentSearches.unshift({ explorer: appName, query }); + // save recent searches to local storage + setItem('recentSearches', JSON.stringify(recentSearches)); + } +} + +export default saveRecentSearches; diff --git a/src/src/utils/shortEnglishHumanizer.ts b/src/src/utils/shortEnglishHumanizer.ts new file mode 100644 index 00000000..51acec5f --- /dev/null +++ b/src/src/utils/shortEnglishHumanizer.ts @@ -0,0 +1,23 @@ +import humanizeDuration from 'humanize-duration'; + +const shortEnglishHumanizer = humanizeDuration.humanizer({ + language: 'shortEn', + languages: { + shortEn: { + y: () => 'year', + mo: () => 'mon', + w: () => 'week', + d: () => 'day', + h: () => 'hrs', + m: () => 'min', + s: () => 'sec', + ms: () => 'ms', + }, + }, + units: ['d', 'h', 'm', 's', 'ms'], + spacer: '', + delimiter: ' ', + largest: 2, +}); + +export default shortEnglishHumanizer; diff --git a/src/src/utils/shortenRunPropLabel.ts b/src/src/utils/shortenRunPropLabel.ts new file mode 100644 index 00000000..247920d5 --- /dev/null +++ b/src/src/utils/shortenRunPropLabel.ts @@ -0,0 +1,21 @@ +function shortenRunPropLabel( + text: string, + textWidth: number = 0, + charSize: number = 6, +) { + const maxChars = textWidth / charSize; + const splitVal = text.split('.'); + let isFits = true; + + if (splitVal.length > 2) { + isFits = maxChars >= text.length; + } + return { + shortenValue: isFits + ? text + : `${splitVal[0]}.~.${splitVal[splitVal.length - 1]}`, + isFits, + }; +} + +export default shortenRunPropLabel; diff --git a/src/src/utils/showAutocompletion.ts b/src/src/utils/showAutocompletion.ts new file mode 100644 index 00000000..6d99395f --- /dev/null +++ b/src/src/utils/showAutocompletion.ts @@ -0,0 +1,209 @@ +import _ from 'lodash-es'; + +import { Monaco } from '@monaco-editor/react'; + +import getObjectPaths, { jsValidVariableRegex } from './getObjectPaths'; +import getValue from './helper/getValue/getValue'; + +function showAutocompletion(monaco: Monaco, options: Record) { + // Register object that will return autocomplete items + return monaco?.languages.registerCompletionItemProvider( + 'python', + getSuggestions(monaco, options), + ); +} + +const specialCharactersForWordSplitting = ['(', '=']; + +function getDetailType(detail: any): { + type: string; + hasExampleType: boolean; +} { + const hasExampleType = detail?.hasOwnProperty('__example_type__'); + let type: string = ''; + if (hasExampleType) { + let sliced = detail.__example_type__.slice( + 7, + detail.__example_type__.length - 1, + ); + switch (sliced) { + case "'str'": + type = 'str'; + break; + case "'int'": + type = 'int'; + break; + case "'bool'": + type = 'bool'; + break; + case "'list'": + type = 'list'; + break; + case "'float'": + type = 'float'; + break; + case "'bytes'": + type = 'bytes'; + break; + //TODO: Add datetime type + default: + type = 'unknown'; + break; + } + } else { + switch (typeof detail) { + case 'object': + type = 'dict'; + break; + case 'string': + type = 'str'; + break; + case 'boolean': + type = 'bool'; + break; + case 'number': + type = 'int'; + break; + } + } + return { type, hasExampleType }; +} + +// Helper function to return the monaco completion item type of a thing +function getType(monaco: Monaco, maybe: any, isMember = false) { + switch ((typeof maybe).toLowerCase()) { + case 'object': + return monaco.languages.CompletionItemKind.Class; + + // Now we don't have such autocompletion scenario, + // but we may support showing possible methods with their docstrings in the future + case 'function': + return isMember + ? monaco.languages.CompletionItemKind.Method + : monaco.languages.CompletionItemKind.Function; + default: + return isMember + ? monaco.languages.CompletionItemKind.Property + : monaco.languages.CompletionItemKind.Variable; + } +} + +function getSuggestions(monaco: Monaco, options: Record) { + /* eslint-disable */ + // NOTE: this code segment was taken(modified) from the following git gist + // https://gist.github.com/mwrouse/05d8c11cd3872c19c684bd1904a2202e + return { + //TODO: Maybe support manual trigger such as [Ctrl + Space] + triggerCharacters: ['.'], + + // Function to generate autocompletion results + provideCompletionItems(model: any, position: any) { + // Split everything the user has typed on the current line up at each space, and only look at the last word + const lastChars = model.getValueInRange({ + startLineNumber: position.lineNumber, + startColumn: 1, + endLineNumber: position.lineNumber, + endColumn: position.column, + }); + const words = lastChars.replace('\t', '').split(' '); + let activeTyping: any = _.last(words); // What the user is currently typing (everything after the last space) + + specialCharactersForWordSplitting.forEach((char) => { + if (activeTyping.includes(char)) { + activeTyping = _.last(activeTyping.split(char)); + } + }); + + if (!Object.keys(options).some((key) => activeTyping.startsWith(key))) { + // Here, we are interested only in these cases where the active typing starts + // with one of the first level keys of "options" object. + // For example, the common "options" object for NodeEditor will look like this: + // { context: { user: { id: ..., name: ..., email: ... }, classes: { ... }, ... } } + // In this particular case, we are interested only in the case where activeTyping starts with the word + // "context". In all other cases, we return "null" to force the monaco to fall back to the next suggest provider + // read more about this issue here - https://github.com/microsoft/monaco-editor/issues/2646 + return null; + } + // flatten strings of array of accessible options paths without example type + const filteredOptions = getObjectPaths(options, options).map((option) => { + const indexOf = + option.indexOf('.__example_type__') !== -1 || + option[option.length - 1] === '.' + ? option.indexOf('.__example_type__') + : option.length; + return option.slice(0, indexOf); + }); + // If the last character typed is a period then we need to look at member objects of the `options` object + const isMember = activeTyping.charAt(activeTyping.length - 1) === '.'; + + let isIncluded: boolean = false; + // Array of autocompletion results + const suggestions: any = []; + + //Checking is the word included in options list + for (let option of filteredOptions) { + if ( + option.split(activeTyping)[0] === '' || + (isMember && + option.split(activeTyping.slice(0, activeTyping.length - 2))[0] === + '') + ) { + isIncluded = true; + break; + } + } + // Used for generic handling between member and non-member objects + let lastToken: any = options; + let prefix = activeTyping; + if (isMember && isIncluded) { + // Is a member, get a list of all members, and the prefix + lastToken = getValue(options, prefix.substring(0, prefix.length - 1)); + } + + const word = model.getWordUntilPosition(position); + const range = { + startLineNumber: position.lineNumber, + endLineNumber: position.lineNumber, + startColumn: word.startColumn, + endColumn: word.endColumn, + }; + + // Get all the child properties of the last token + for (const prop in lastToken) { + // Do not show properites that begin with "__" + if (lastToken.hasOwnProperty(prop) && !prop.startsWith('__')) { + // Create completion object + + const key = !jsValidVariableRegex.test(prop) ? `["${prop}"]` : prop; + + let detailType = getDetailType(getValue(options, prefix + key)); + const completionItem = { + label: key, + kind: getType( + monaco, + detailType.hasExampleType ? detailType.type : lastToken[prop], + isMember, + ), + insertText: key, + detail: detailType.type, + range, + }; + // Change insertText for functions + if ( + completionItem.kind === + monaco.languages.CompletionItemKind.Function || + completionItem.kind === monaco.languages.CompletionItemKind.Method + ) { + completionItem.insertText += '('; + } + + // Add to final suggestionss + suggestions.push(completionItem); + } + } + return { suggestions: isIncluded ? suggestions : [] }; + }, + }; +} + +export { showAutocompletion }; diff --git a/src/src/utils/smoothingData.ts b/src/src/utils/smoothingData.ts new file mode 100644 index 00000000..159a806c --- /dev/null +++ b/src/src/utils/smoothingData.ts @@ -0,0 +1,41 @@ +import _ from 'lodash-es'; + +export enum SmoothingAlgorithmEnum { + EMA = 'EXPONENTIAL_MOVING_AVERAGE', + CMA = 'CENTRED_MOVING_AVERAGE', +} + +export function calculateExponentialMovingAverage( + data: number[], + smoothFactor: number, +): number[] { + const smoothedData = data.length ? [data[0]] : []; + for (let i = 1; i < data.length; i++) { + smoothedData.push( + smoothedData[i - 1] * smoothFactor + data[i] * (1 - smoothFactor), + ); + } + return smoothedData; +} + +export function calculateCentralMovingAverage( + data: number[], + smoothFactor: number, +): number[] { + const smoothedData = []; + const len = data.length; + const windowSize = (smoothFactor - 1) / 2; + + for (let i = 0; i < len; i++) { + const start = i - windowSize; + const end = i + windowSize + 1; + const currentWindow = data.slice( + start < 0 ? 0 : start, + end > len + 1 ? len + 1 : end, + ); + const windowAverage = _.sum(currentWindow) / currentWindow.length; + smoothedData.push(windowAverage); + } + + return smoothedData; +} diff --git a/src/src/utils/stopPropagation.ts b/src/src/utils/stopPropagation.ts new file mode 100644 index 00000000..e3206264 --- /dev/null +++ b/src/src/utils/stopPropagation.ts @@ -0,0 +1,11 @@ +/** + * @property {React.ChangeEvent} event - stopping propagate event to parent + */ + +function stopPropagation(event: React.ChangeEvent) { + event.stopPropagation(); +} + +stopPropagation.displayName = 'stopPropagation'; + +export default stopPropagation; diff --git a/src/src/utils/storage.ts b/src/src/utils/storage.ts new file mode 100644 index 00000000..0d87b57f --- /dev/null +++ b/src/src/utils/storage.ts @@ -0,0 +1,25 @@ +export function setItem(key: string, value: any) { + try { + localStorage.setItem(key, value); + } catch (error) {} +} + +export function getItem(key: string) { + try { + return localStorage.getItem(key); + } catch (error) { + return null; + } +} + +export function removeItem(key: string) { + try { + localStorage.removeItem(key); + } catch (error) {} +} + +export function clear() { + try { + localStorage.clear(); + } catch (error) {} +} diff --git a/src/src/utils/store/createSlice.ts b/src/src/utils/store/createSlice.ts new file mode 100644 index 00000000..9daaef33 --- /dev/null +++ b/src/src/utils/store/createSlice.ts @@ -0,0 +1,33 @@ +export type GetState = () => T; + +export type SetState = (state: (state: T) => T) => T; + +export interface SliceMethods { + update: (newValue: Partial) => void; + reset: () => void; +} + +export type StateSelector = (store: TStore) => TState; + +/** + * Creates a zustand store slice with name + */ +function createSlice( + initialState: IState, + generateMethods: (set: SetState, get: GetState) => IMethods, +): (set: SetState, get: GetState) => IState & IMethods { + // @ts-ignore + return ( + set: SetState, + get: GetState, + ): (IState & IMethods) | Record => { + const methods = generateMethods(set, get); + + return { + ...initialState, + ...methods, + }; + }; +} + +export default createSlice; diff --git a/src/src/utils/stringToPath.ts b/src/src/utils/stringToPath.ts new file mode 100644 index 00000000..7b04cd9d --- /dev/null +++ b/src/src/utils/stringToPath.ts @@ -0,0 +1,55 @@ +const charCodeOfDot = '.'.charCodeAt(0); +const reEscapeChar = /\\(\\)?/g; +const firstCaptureGroup = '$1'; +const rePropName = RegExp( + // Match anything that isn't a dot or bracket. + '[^.[\\]]+' + + '|' + + // Or match property names within brackets. + '\\[(?:' + + // Match a non-string expression. + '([^"\'][^[]*)' + + '|' + + // Or match strings (supports escaping characters). + '(["\'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2' + + ')\\]' + + '|' + + // Or match "" as the space between consecutive dots or empty brackets. + '(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))', + 'g', +); + +/** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ +function stringToPath(string: string) { + const result = []; + if (string.charCodeAt(0) === charCodeOfDot) { + result.push(''); + } + string.replace( + rePropName, + ( + match: string, + expression: string, + quote: boolean, + subString: string, + ): string => { + let key = match; + if (quote) { + key = subString.replace(reEscapeChar, firstCaptureGroup); + } else if (expression) { + key = expression.trim(); + } + result.push(key); + return key; + }, + ); + return result; +} + +export default stringToPath; diff --git a/src/src/utils/toFormatData.ts b/src/src/utils/toFormatData.ts new file mode 100644 index 00000000..42532d21 --- /dev/null +++ b/src/src/utils/toFormatData.ts @@ -0,0 +1,21 @@ +export const toTupleData = ( + x: number[], + y: number[], + cb?: (x: number, y: number) => void, +): [number, number][] => { + let tupleData: [number, number][] = []; + for (let i = 0; i < x.length; i++) { + tupleData.push([x[i], y[i]]); + cb?.(x[i], y[i]); + } + return tupleData; +}; + +export const toQuadrupleData = ( + x0: number[], + y0: number[], + x1: number[], + y1: number[], +): [number, number, number, number][] => { + return x0.map((v: number, i: number) => [v, y0[i], x1[i], y1[i]]); +}; diff --git a/src/src/utils/valueToType/valueToType.test.ts b/src/src/utils/valueToType/valueToType.test.ts new file mode 100644 index 00000000..0e07320f --- /dev/null +++ b/src/src/utils/valueToType/valueToType.test.ts @@ -0,0 +1,27 @@ +import { toEqual } from 'tests/utils'; + +import { toType, typeToColor } from './valueToType'; + +describe('[returns value type and gets its color code]', () => { + it('correctly returns value type', () => { + toEqual(toType(5), 'int'); + toEqual(toType(1.2), 'float'); + toEqual(toType(true), 'bool'); + toEqual(toType({}), 'object'); + toEqual(toType([]), 'array'); + toEqual(toType(null), ''); + toEqual(toType(undefined), ''); + toEqual(toType('lorem'), 'string'); + }); + + it('correctly returns color code for a given type', () => { + toEqual(typeToColor(toType(5)), 'rgb(175, 85, 45)'); + toEqual(typeToColor(toType(1.2)), 'rgb(92, 129, 21)'); + toEqual(typeToColor(toType(true)), 'rgb(169, 87, 153)'); + toEqual(typeToColor(toType({})), 'rgb(73, 72, 73)'); + toEqual(typeToColor(toType([])), 'rgb(73, 72, 73)'); + toEqual(typeToColor(toType(null)), 'rgb(148, 148, 148)'); + toEqual(typeToColor(toType(undefined)), 'rgb(148, 148, 148)'); + toEqual(typeToColor(toType('lorem')), 'rgb(246, 103, 30)'); + }); +}); diff --git a/src/src/utils/valueToType/valueToType.ts b/src/src/utils/valueToType/valueToType.ts new file mode 100644 index 00000000..606bb24f --- /dev/null +++ b/src/src/utils/valueToType/valueToType.ts @@ -0,0 +1,39 @@ +// Adapted from react-json-view by Mac Gainor +// License: https://github.com/mac-s-g/react-json-view/blob/master/LICENSE + +import { COLOR_BY_VALUE_TYPE } from 'config/colors/colors'; + +// Returns a string "type" of input object +export function toType(obj: any) { + let type = getType(obj); + if (type === 'number') { + // some extra disambiguation for numbers + if (isNaN(obj)) { + type = 'nan'; + } else if ((obj | 0) !== obj) { + // bitwise OR produces integers + type = 'float'; + } else { + type = 'int'; + } + } else if (type === 'boolean') { + type = 'bool'; + } else if (type === 'undefined' || type === 'null') { + type = ''; + } + + return type; +} + +// Source: http://stackoverflow.com/questions/7390426/better-way-to-get-type-of-a-javascript-variable/7390612#7390612 +function getType(obj: any) { + return ({} as any).toString + .call(obj) + .match(/\s([a-zA-Z]+)/)[1] + .toLowerCase(); +} + +// Returns color code base on value type +export function typeToColor(item: string) { + return COLOR_BY_VALUE_TYPE[item] ?? 'rgb(20, 115, 230)'; +} diff --git a/src/tasks/bundle-analyzer.js b/src/tasks/bundle-analyzer.js new file mode 100644 index 00000000..865c9fa5 --- /dev/null +++ b/src/tasks/bundle-analyzer.js @@ -0,0 +1,27 @@ +// set env mode to production +// to check sizes for production chunked bundles +process.env.NODE_ENV = 'production'; + +// eslint-disable-next-line import/no-extraneous-dependencies +const webpack = require('webpack'); +const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); +const ProgressBarPlugin = require('progress-bar-webpack-plugin'); + +const webpackConfig = require('react-scripts/config/webpack.config')( + 'production', +); + +// optional plugins +webpackConfig.plugins.push(new BundleAnalyzerPlugin()); +webpackConfig.plugins.push( + new ProgressBarPlugin({ + format: `${'analyzing...'} ${'[:bar]'}${'[:percent]'}${'[:elapsed seconds]'} - :msg`, + }), +); + +// run webpack +webpack(webpackConfig, (err, stats) => { + if (err || stats.hasErrors()) { + console.error(err); + } +}); diff --git a/src/tasks/cli/README.md b/src/tasks/cli/README.md new file mode 100644 index 00000000..7ca7d968 --- /dev/null +++ b/src/tasks/cli/README.md @@ -0,0 +1,16 @@ +# aim-ui/cli + +### Supported commands +- create-component + + > $ node cli/index.js create-component `--name=` `--path=` `--lint` + +__NOTES__: + + _Created two scripts inside `ui` project_ + >$ npm run crc-kit -- `` + + Will create a component named `ComponentName` in `./src/components/kit` folder, and will run lint to fix formatting + > $ npm run crc -- `` + + Will create a component named `ComponentName` in `./src/components/` folder, and will run lint to fix formatting diff --git a/src/tasks/cli/commands/createComponent.js b/src/tasks/cli/commands/createComponent.js new file mode 100644 index 00000000..37700649 --- /dev/null +++ b/src/tasks/cli/commands/createComponent.js @@ -0,0 +1,100 @@ +/* eslint-disable no-console */ +// npm run create-component -- --name=ComponentName --path=/path/where/component/shouldBeCreated +// @TODO enhance cli options, to have full support of two styles i.e. --lint, -l, and use yargs config + +const fs = require('fs'); +const { execSync } = require('child_process'); + +const yargs = require('yargs/yargs'); + +const { + getTypesBaseCode, + getStylesBaseCode, + getComponentBaseCode, + getExportsBaseCode, +} = require('../src/componentData'); + +const messages = { + ERROR_NAME: "error: Component's name missing.", + ERROR_PATH: 'error: Wrong Path.', + ERROR_DUPLICATE_NAME: 'error: Component with this name already exists.', + SUCCESS: 'Component Successfully Created!', + LINT_SUCCESS: 'Code Style Successfully formatted!', +}; + +const exitWithMessage = (message) => { + console.error(message); + process.exit(1); +}; + +const getDetails = () => { + let { name, path: folderPath, lint } = yargs(process.argv.slice(2)).argv; + if (!name) { + exitWithMessage(messages.ERROR_NAME); + } + if (!folderPath) { + folderPath = process.env.INIT_CWD; + } + return [name, folderPath, lint]; +}; + +const checkPath = (path) => { + if (!fs.existsSync(path)) { + exitWithMessage(messages.ERROR_PATH); + } +}; + +const createFolder = (path, name) => { + const fullPath = path + '/' + name; + if (!fs.existsSync(fullPath)) { + fs.mkdirSync(fullPath); + } else { + exitWithMessage(messages.ERROR_DUPLICATE_NAME); + } +}; + +const createFiles = (path, name) => { + console.warn('Creating files ...'); + const fullPath = path + '/' + name; + try { + fs.writeFileSync(fullPath + `/${name}.d.ts`, getTypesBaseCode(name)); + fs.writeFileSync(fullPath + `/${name}.scss`, getStylesBaseCode(name)); + fs.writeFileSync( + fullPath + '/' + name + '.tsx', + getComponentBaseCode(name), + ); + fs.writeFileSync(fullPath + '/index.tsx', getExportsBaseCode(name)); + } catch (err) { + exitWithMessage(err); + } +}; + +const lintFix = (name, path) => { + const cmd = `npx eslint ./${name}/*.{ts,tsx} --quiet --fix`; + console.warn('Formatting code style ... '); + console.warn(`Executing $${cmd} ...`); + try { + // execSync(`eslint ${path}/*.{ts,tsx} --quiet --fix`); + execSync(cmd, { + cwd: path, + stdio: 'inherit', + }); + + console.log(messages.LINT_SUCCESS); + } catch (err) { + exitWithMessage("Error - Couldn't fix formatting"); + exitWithMessage(`Original error message - ${err.message}`); + } +}; +const [componentName, folderPath, lint] = getDetails(); + +checkPath(folderPath); +createFolder(folderPath, componentName); +createFiles(folderPath, componentName); + +console.log(messages.SUCCESS); + +// fix lint +if (lint) { + lintFix(componentName, folderPath); +} diff --git a/src/tasks/cli/index.js b/src/tasks/cli/index.js new file mode 100644 index 00000000..837356f9 --- /dev/null +++ b/src/tasks/cli/index.js @@ -0,0 +1,9 @@ +const yargs = require('yargs/yargs'); + +const commands = { + 'create-component': './commands/createComponent', +}; + +const command = yargs(process.argv.slice(2)).argv._[0]; + +require(commands[command]); diff --git a/src/tasks/cli/src/componentData.js b/src/tasks/cli/src/componentData.js new file mode 100644 index 00000000..966d717d --- /dev/null +++ b/src/tasks/cli/src/componentData.js @@ -0,0 +1,53 @@ +const getTypesBaseCode = (name) => ` + export interface I${name}Props { + title: string; + }; +`; + +const getComponentBaseCode = (name) => ` + import React from 'react'; + import { Text } from 'components/kit'; + import { I${name}Props } from './${name}.d'; + + import './${name}.scss'; + + function ${name}({ + title, + }: I${name}Props): React.FunctionComponentElement { + return ( +
+ {title} +
+ ); + } + + ${name}.displayName = '${name}'; + + export default React.memo(${name}); +`; + +const getExportsBaseCode = (name) => ` + import ${name} from './${name}'; + + export * from './${name}.d'; + + export default ${name}; +`; + +const getStylesBaseCode = (name) => { + return `@use 'src/styles/abstracts' as *; + +.${name} { + display: flex; + justify-content: center; + align-items: center; +} + `; +}; + +module.exports = { + getTypesBaseCode, + getStylesBaseCode, + getComponentBaseCode, + getExportsBaseCode, +}; diff --git a/src/tasks/index-html-template-generator.js b/src/tasks/index-html-template-generator.js new file mode 100644 index 00000000..3424e665 --- /dev/null +++ b/src/tasks/index-html-template-generator.js @@ -0,0 +1,14 @@ +const fs = require('fs').promises; + +const buildDirectoryPath = `${__dirname}/../build/`; +const staticFilesKey = '/static-files/'; +const basePathKey = `{{ base_path }}${staticFilesKey}`; + +(async () => { + const HTML = await fs.readFile(`${buildDirectoryPath}index.html`, 'utf8'); + const replacedHTML = HTML.replaceAll(staticFilesKey, basePathKey); + + await fs.writeFile(`${buildDirectoryPath}index-template.html`, replacedHTML); + + console.log('index-template.html file is generated'); +})(); diff --git a/src/tsconfig.json b/src/tsconfig.json new file mode 100644 index 00000000..589c1def --- /dev/null +++ b/src/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": "src", + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "downlevelIteration": true + }, + "include": [ + "src", + "node_modules/immer/src/types/globals.d.ts" + ] +}
+
+ } + options={monacoConfig.options} + {...editorProps} + /> + {mounted && + (focused || editorValue ? null : ( +
+ Filter runs, e.g. run.learning_rate {'>'} 0.0001 and + run.batch_size == 32 +
+ ))} +
+ {errorMessage && ( +
+ )} +

B1m^@BHsvBL%w1&bTFJ4! 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 E1!7^O%m4rY literal 0 HcmV?d00001 diff --git a/src/public/assets/inconsolata/inconsolata.css b/src/public/assets/inconsolata/inconsolata.css new file mode 100644 index 00000000..b7d98bff --- /dev/null +++ b/src/public/assets/inconsolata/inconsolata.css @@ -0,0 +1,6 @@ +@font-face { + font-family: 'Inconsolata'; + src: url('./fonts/Inconsolata.ttf') format('truetype'); + font-display: block; + font-weight: 1 999; +} diff --git a/src/public/assets/inter/fonts/Inter.ttf b/src/public/assets/inter/fonts/Inter.ttf new file mode 100644 index 0000000000000000000000000000000000000000..969a990fbd638264d52bf5c6b06eea02cf61c1a0 GIT binary patch literal 803384 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