From 44f9288daa223233ef2eb5045305944bd95ef415 Mon Sep 17 00:00:00 2001 From: Deniz Ugur Date: Fri, 4 Aug 2023 17:06:16 -0700 Subject: [PATCH] m64382 contribution --- .gitattributes | 4 + .../ISSUE_TEMPLATE/conformance-file-bug.md | 25 - .../ISSUE_TEMPLATE/conformance-file-bug.yml | 52 + .github/ISSUE_TEMPLATE/page-bug.yml | 31 + .github/dependabot.yml | 15 + .github/problem-matchers.json | 23 + .github/workflows/cfc.yml | 105 + .github/workflows/gpac.yml | 36 + .github/workflows/pr.yml | 64 + .github/workflows/publish.yml | 100 + .github/workflows/test.yml | 104 + .gitignore | 248 +- .vscode/extensions.json | 7 + .vscode/settings.json | 21 + CONTRIBUTING.md | 75 +- LICENSE | 32 + README.md | 38 +- conformance-search/.eslintrc | 101 + {html => conformance-search}/.gitignore | 26 +- conformance-search/.prettierrc | 7 + conformance-search/index.html | 12 + conformance-search/package-lock.json | 12368 ++++ conformance-search/package.json | 75 + conformance-search/postcss.config.js | 6 + .../src/components/BoxComponent.tsx | 353 + conformance-search/src/components/Chip.tsx | 42 + .../src/components/CoverageSummary.tsx | 91 + conformance-search/src/components/Drawer.tsx | 55 + .../src/components/FeatureComponent.tsx | 54 + .../src/components/FileComponent.tsx | 361 + .../src/components/Input/Dropdown.tsx | 164 + .../src/components/Input/Input.tsx | 43 + .../src/components/Input/helpers/index.ts | 5 + .../src/components/Input/index.ts | 3 + .../Input/variants/ContainerInput.tsx | 185 + .../components/Input/variants/SelectInput.tsx | 29 + .../src/components/Input/variants/index.ts | 4 + .../src/components/ListComponent.tsx | 61 + .../src/components/NavigationBar.tsx | 296 + .../SearchComponent/SearchComponent.spec.tsx | 49 + .../SearchComponent/SearchComponent.tsx | 234 + .../SearchComponent/hooks/useFilters.ts | 71 + .../src/components/SearchComponent/index.ts | 3 + conformance-search/src/components/Select.tsx | 92 + .../src/components/SpecsCovered.tsx | 44 + conformance-search/src/components/index.ts | 25 + .../src/contexts/RefinementContext.ts | 8 + conformance-search/src/index.css | 39 + .../lib/__snapshots__/database.spec.ts.snap | 129 + .../src/lib/__snapshots__/search.spec.ts.snap | 534 + conformance-search/src/lib/database.spec.ts | 125 + conformance-search/src/lib/database.ts | 585 + conformance-search/src/lib/search.spec.ts | 253 + conformance-search/src/lib/search.ts | 440 + conformance-search/src/lib/utils.ts | 108 + conformance-search/src/main.tsx | 25 + conformance-search/src/pages/AboutPage.tsx | 116 + conformance-search/src/pages/CoveragePage.tsx | 445 + conformance-search/src/pages/SearchPage.tsx | 162 + conformance-search/src/pages/pages.spec.tsx | 196 + conformance-search/src/types/index.ts | 93 + conformance-search/src/types/json.ts | 111 + conformance-search/src/vite-env.d.ts | 4 + conformance-search/tailwind.config.js | 26 + conformance-search/tests/__mocks__/boxes.json | 7931 +++ .../tests/__mocks__/coverage.json | 1952 + .../tests/__mocks__/dictionary.json | 432 + conformance-search/tests/__mocks__/files.json | 23976 +++++++ .../tests/__mocks__/hierarchy.json | 7992 +++ conformance-search/tests/setup.ts | 9 + conformance-search/tsconfig.json | 45 + conformance-search/tsconfig.node.json | 12 + conformance-search/vite.config.ts | 40 + data/file_features/.cfignore | 4 + data/file_features/README.md | 14 + .../published/3gp/female_amr67DTX_hinted.3gp | 3 + .../published/3gp/female_amr67DTX_hinted.json | 9 +- .../3gp/female_amr67DTX_hinted_gpac.json | 8 +- .../published/3gp/female_amr67_hinted.3gp | 3 + .../published/3gp/female_amr67_hinted.json | 9 +- .../3gp/female_amr67_hinted_gpac.json | 8 +- .../published/3gp/male_amr122.3gp | 3 + .../published/3gp/male_amr122.json | 9 +- .../published/3gp/male_amr122DTX.3gp | 3 + .../published/3gp/male_amr122DTX.json | 9 +- .../published/3gp/male_amr122DTX_gpac.json | 8 +- .../published/3gp/male_amr122_gpac.json | 8 +- .../published/3gp/pdin_example.3gp | 3 + .../published/3gp/pdin_example.json | 9 +- .../published/3gp/pdin_example_gpac.ext.json | 16 + .../published/3gp/pdin_example_gpac.json | 10 +- .../published/3gp/rs_example_r1.3gp | 3 + .../published/3gp/rs_example_r1.json | 9 +- .../published/3gp/rs_example_r1_gpac.ext.json | 16 + .../published/3gp/rs_example_r1_gpac.json | 14 +- .../published/green/meta_2500000bps_0.json | 9 +- .../published/green/meta_2500000bps_0.mp4m | 3 + .../green/meta_2500000bps_0_gpac.json | 10 +- .../published/green/video_2500000bps_0.json | 9 +- .../published/green/video_2500000bps_0.mp4 | 3 + .../green/video_2500000bps_0_gpac.json | 10 +- data/file_features/published/heif/C001.heic | 3 + .../file_features}/published/heif/C001.json | 15 +- .../published/heif/C001_gpac.json | 12 +- data/file_features/published/heif/C002.heic | 3 + data/file_features/published/heif/C002.json | 22 + .../published/heif/C002_gpac.json | 8 +- data/file_features/published/heif/C003.heic | 3 + data/file_features/published/heif/C003.json | 27 + .../published/heif/C003_gpac.json | 10 +- data/file_features/published/heif/C004.heic | 3 + data/file_features/published/heif/C004.json | 23 + .../published/heif/C004_gpac.json | 102 +- data/file_features/published/heif/C005.heic | 3 + .../file_features}/published/heif/C005.json | 15 +- .../published/heif/C005_gpac.json | 10 +- data/file_features/published/heif/C006.heic | 3 + data/file_features/published/heif/C006.json | 28 + .../published/heif/C006_gpac.json | 18 +- data/file_features/published/heif/C007.heic | 3 + data/file_features/published/heif/C007.json | 23 + .../published/heif/C007_gpac.json | 58 +- data/file_features/published/heif/C008.heic | 3 + data/file_features/published/heif/C008.json | 27 + .../published/heif/C008_gpac.json | 10 +- data/file_features/published/heif/C009.heic | 3 + data/file_features/published/heif/C009.json | 27 + .../published/heif/C009_gpac.json | 10 +- data/file_features/published/heif/C010.heic | 3 + data/file_features/published/heif/C010.json | 27 + .../published/heif/C010_gpac.json | 10 +- data/file_features/published/heif/C011.heic | 3 + data/file_features/published/heif/C011.json | 33 + .../published/heif/C011_gpac.json | 12 +- data/file_features/published/heif/C012.heic | 3 + data/file_features/published/heif/C012.json | 34 + .../published/heif/C012_gpac.json | 180 +- data/file_features/published/heif/C013.heic | 3 + data/file_features/published/heif/C013.json | 27 + .../published/heif/C013_gpac.json | 10 +- data/file_features/published/heif/C014.heic | 3 + .../file_features}/published/heif/C014.json | 19 +- .../published/heif/C014_gpac.json | 10 +- data/file_features/published/heif/C015.heic | 3 + .../file_features}/published/heif/C015.json | 19 +- .../published/heif/C015_gpac.json | 10 +- data/file_features/published/heif/C016.heic | 3 + .../file_features}/published/heif/C016.json | 15 +- .../published/heif/C016_gpac.json | 8 +- data/file_features/published/heif/C017.heic | 3 + data/file_features/published/heif/C017.json | 29 + .../published/heif/C017_gpac.json | 10 +- data/file_features/published/heif/C018.heic | 3 + data/file_features/published/heif/C018.json | 29 + .../published/heif/C018_gpac.json | 10 +- data/file_features/published/heif/C019.heic | 3 + data/file_features/published/heif/C019.json | 29 + .../published/heif/C019_gpac.json | 10 +- data/file_features/published/heif/C020.heic | 3 + data/file_features/published/heif/C020.json | 29 + .../published/heif/C020_gpac.json | 10 +- data/file_features/published/heif/C021.heic | 3 + .../file_features}/published/heif/C021.json | 15 +- .../published/heif/C021_gpac.json | 8 +- data/file_features/published/heif/C022.heic | 3 + data/file_features/published/heif/C022.json | 23 + .../published/heif/C022_gpac.json | 58 +- data/file_features/published/heif/C023.heic | 3 + data/file_features/published/heif/C023.json | 23 + .../published/heif/C023_gpac.json | 76 +- data/file_features/published/heif/C024.heic | 3 + data/file_features/published/heif/C024.json | 22 + .../published/heif/C024_gpac.json | 8 +- data/file_features/published/heif/C025.heic | 3 + data/file_features/published/heif/C025.json | 23 + .../published/heif/C025_gpac.json | 94 +- data/file_features/published/heif/C026.heic | 3 + data/file_features/published/heif/C026.json | 22 + .../published/heif/C026_gpac.json | 10 +- data/file_features/published/heif/C027.heic | 3 + data/file_features/published/heif/C027.json | 23 + .../published/heif/C027_gpac.json | 10 +- data/file_features/published/heif/C028.heic | 3 + data/file_features/published/heif/C028.json | 23 + .../published/heif/C028_gpac.json | 10 +- data/file_features/published/heif/C029.heic | 3 + .../file_features}/published/heif/C029.json | 15 +- .../published/heif/C029_gpac.json | 10 +- data/file_features/published/heif/C030.heic | 3 + .../file_features}/published/heif/C030.json | 15 +- .../published/heif/C030_gpac.json | 10 +- data/file_features/published/heif/C031.heic | 3 + data/file_features/published/heif/C031.json | 22 + .../published/heif/C031_gpac.json | 12 +- data/file_features/published/heif/C032.heic | 3 + data/file_features/published/heif/C032.json | 28 + .../published/heif/C032_gpac.json | 12 +- data/file_features/published/heif/C034.heic | 3 + data/file_features/published/heif/C034.json | 23 + .../published/heif/C034_gpac.json | 8 +- data/file_features/published/heif/C036.heic | 3 + .../file_features}/published/heif/C036.json | 15 +- .../published/heif/C036_gpac.json | 10 +- data/file_features/published/heif/C037.heic | 3 + .../file_features}/published/heif/C037.json | 15 +- .../published/heif/C037_gpac.json | 10 +- data/file_features/published/heif/C038.heic | 3 + .../file_features}/published/heif/C038.json | 15 +- .../published/heif/C038_gpac.json | 10 +- data/file_features/published/heif/C039.heic | 3 + .../file_features}/published/heif/C039.json | 15 +- .../published/heif/C039_gpac.json | 8 +- data/file_features/published/heif/C040.heic | 3 + data/file_features/published/heif/C040.json | 43 + .../published/heif/C040_gpac.json | 16 +- data/file_features/published/heif/C041.heic | 3 + .../file_features}/published/heif/C041.json | 15 +- .../published/heif/C041_gpac.json | 10 +- data/file_features/published/heif/C042.heic | 3 + .../file_features}/published/heif/C042.json | 15 +- .../published/heif/C042_gpac.json | 16 +- .../published/heif/iff_hevc_single_item.heic | 3 + .../published/heif/iff_hevc_single_item.json | 9 +- .../heif/iff_hevc_single_item_gpac.json | 8 +- .../heif/iff_hevc_single_item_main10.heic | 3 + .../heif/iff_hevc_single_item_main10.json | 9 +- .../iff_hevc_single_item_main10_gpac.json | 8 +- .../iff_hevc_tile_multiple_items_tbas.heic | 3 + .../iff_hevc_tile_multiple_items_tbas.json | 9 +- ...ff_hevc_tile_multiple_items_tbas_gpac.json | 8 +- .../published/heif/multilayer001.heic | 3 + .../published/heif/multilayer001.json | 23 + .../published/heif/multilayer001_gpac.json | 10 +- .../published/heif/multilayer002.heic | 3 + .../published/heif/multilayer002.json | 23 + .../published/heif/multilayer002_gpac.json | 10 +- .../published/heif/multilayer003.heic | 3 + .../published/heif/multilayer003.json | 22 + .../published/heif/multilayer003_gpac.json | 8 +- .../published/heif/multilayer004.heic | 3 + .../published/heif/multilayer004.json | 29 + .../published/heif/multilayer004_gpac.json | 10 +- .../published/heif/multilayer005.heic | 3 + .../published/heif/multilayer005.json | 23 + .../heif/multilayer005_gpac.ext.json | 16 + .../published/heif/multilayer005_gpac.json | 10 +- .../published/isobmff/01_simple.json | 9 +- .../published/isobmff/01_simple.mp4 | 3 + .../published/isobmff/01_simple_gpac.json | 8 +- .../published/isobmff/02_dref_edts_img.json | 9 +- .../published/isobmff/02_dref_edts_img.mp4 | 3 + .../isobmff/02_dref_edts_img_gpac.json | 12 +- .../published/isobmff/03_hinted.json | 9 +- .../published/isobmff/03_hinted.mp4 | 3 + .../published/isobmff/03_hinted_gpac.json | 8 +- .../published/isobmff/04_bifs_video.json | 9 +- .../published/isobmff/04_bifs_video.mp4 | 3 + .../published/isobmff/04_bifs_video_gpac.json | 8 +- .../isobmff/05_bifs_video_protected_v2.json | 9 +- .../isobmff/05_bifs_video_protected_v2.mp4 | 3 + .../05_bifs_video_protected_v2_gpac.json | 10 +- .../published/isobmff/06_bifs.json | 9 +- .../published/isobmff/06_bifs.mp4 | 3 + .../published/isobmff/06_bifs_gpac.json | 8 +- .../published/isobmff/07_bifs_sprite.json | 9 +- .../published/isobmff/07_bifs_sprite.mp4 | 3 + .../isobmff/07_bifs_sprite_gpac.json | 8 +- .../isobmff/08_bifs_carousel_v2.json | 9 +- .../published/isobmff/08_bifs_carousel_v2.mp4 | 3 + .../isobmff/08_bifs_carousel_v2_gpac.json | 8 +- .../published/isobmff/09_text.json | 9 +- .../published/isobmff/09_text.mp4 | 3 + .../published/isobmff/09_text_gpac.json | 364 + .../published/isobmff/10_fragments.json | 9 +- .../published/isobmff/10_fragments.mp4 | 3 + .../published/isobmff/10_fragments_gpac.json | 8 +- .../published/isobmff/12_metas_v2.json | 9 +- .../published/isobmff/12_metas_v2.mp4 | 3 + .../published/isobmff/12_metas_v2_gpac.json | 12 +- .../published/isobmff/13_long.json | 9 +- .../published/isobmff/13_long.mp4 | 3 + .../published/isobmff/13_long_gpac.json | 8 +- .../published/isobmff/14_large.json | 11 +- .../published/isobmff/14_large.mp4.zip | 3 + .../published/isobmff/14_large_gpac.json | 8 +- .../published/isobmff/16_vtt.json | 9 +- .../published/isobmff/16_vtt.mp4 | 3 + .../published/isobmff/16_vtt_gpac.json | 8 +- .../published/isobmff/17_negative_ctso.json | 9 +- .../published/isobmff/17_negative_ctso.mp4 | 3 + .../isobmff/17_negative_ctso_gpac.json | 10 +- .../published/isobmff/18_pssh_v2.json | 9 +- .../published/isobmff/18_pssh_v2.mp4 | 3 + .../published/isobmff/18_pssh_v2_gpac.json | 14 +- .../published/isobmff/19_ttml.json | 9 +- .../published/isobmff/19_ttml.mp4 | 3 + .../published/isobmff/19_ttml_gpac.json | 8 +- .../published/isobmff/20_stxt.json | 9 +- .../published/isobmff/20_stxt.mp4 | 3 + .../published/isobmff/20_stxt_gpac.json | 8 +- .../published/isobmff/21_segment.json | 9 +- .../published/isobmff/21_segment.mp4 | 3 + .../published/isobmff/21_segment_gpac.json | 10 +- .../published/isobmff/22_tx3g.json | 9 +- .../published/isobmff/22_tx3g.mp4 | 3 + .../published/isobmff/22_tx3g_gpac.json | 368 + .../isobmff/FX-VY-9436R.3_qhd-variant.json | 9 +- .../isobmff/FX-VY-9436R.3_qhd-variant.mp4 | 3 + .../FX-VY-9436R.3_qhd-variant_gpac.ext.json | 16 + .../FX-VY-9436R.3_qhd-variant_gpac.json | 14 +- .../published/isobmff/FX-VY-9436R.3_qhd.json | 14 + .../published/isobmff/FX-VY-9436R.3_qhd.mp4 | 3 + .../FX-VY-9436R.3_qhd.vinput.merged.xml | 3 + .../isobmff/FX-VY-9436R.3_qhd_gpac.ext.json | 16 + .../isobmff/FX-VY-9436R.3_qhd_gpac.json | 1482 +- .../published/isobmff/LargerThan4GB.json | 11 +- .../published/isobmff/LargerThan4GB.mp4.zip | 3 + .../published/isobmff/LargerThan4GB_gpac.json | 8 +- .../published/isobmff/a1-foreman-QCIF.json | 9 +- .../published/isobmff/a1-foreman-QCIF.mp4 | 3 + .../isobmff/a1-foreman-QCIF_gpac.json | 8 +- .../isobmff/a10-foreman_QCIF-raw.json | 9 +- .../isobmff/a10-foreman_QCIF-raw.mp4 | 3 + .../isobmff/a10-foreman_QCIF-raw_gpac.json | 29 +- .../isobmff/a2-foreman-QCIF-hinted.json | 9 +- .../isobmff/a2-foreman-QCIF-hinted.mp4 | 3 + .../isobmff/a2-foreman-QCIF-hinted_gpac.json | 8 +- .../published/isobmff/a3-tone-protected.json | 11 +- .../published/isobmff/a3-tone-protected.mp4 | 3 + .../isobmff/a3-tone-protected_gpac.json | 8 +- .../published/isobmff/a3b-tone-deprot.json | 9 +- .../published/isobmff/a3b-tone-deprot.mp4 | 3 + .../isobmff/a3b-tone-deprot_gpac.json | 8 +- .../published/isobmff/a3c-prot-keys.txt | 3 + .../published/isobmff/a4-tone-fragmented.json | 9 +- .../published/isobmff/a4-tone-fragmented.mp4 | 3 + .../isobmff/a4-tone-fragmented_gpac.json | 8 +- .../published/isobmff/a5-foreman-AVC.json | 9 +- .../published/isobmff/a5-foreman-AVC.mp4 | 3 + .../isobmff/a5-foreman-AVC_gpac.json | 10 +- .../published/isobmff/a6_tone_multifile.json | 11 +- .../published/isobmff/a6_tone_multifile.mp4 | 3 + .../isobmff/a6_tone_multifile_gpac.json | 8 +- .../published/isobmff/a7-tone-oddities.json | 9 +- .../published/isobmff/a7-tone-oddities.mp4 | 3 + .../isobmff/a7-tone-oddities_gpac.ext.json | 16 + .../isobmff/a7-tone-oddities_gpac.json | 8 +- .../isobmff/a8-foreman_QCIF_edit.json | 9 +- .../isobmff/a8-foreman_QCIF_edit.mp4 | 3 + .../isobmff/a8-foreman_QCIF_edit_gpac.json | 8 +- .../isobmff/a9-aac-samplegroups-edit.json | 9 +- .../isobmff/a9-aac-samplegroups-edit.mp4 | 3 + .../a9-aac-samplegroups-edit_gpac.json | 8 +- .../isobmff/compact-no-code-fec-1.iso3 | 3 + .../isobmff/compact-no-code-fec-1.json | 9 +- .../isobmff/compact-no-code-fec-1_gpac.json | 1009 + .../isobmff/compact-no-code-fec-2.iso3 | 3 + .../isobmff/compact-no-code-fec-2.json | 9 +- .../isobmff/compact-no-code-fec-2_gpac.json | 2591 + .../file_features}/published/isobmff/f1.json | 9 +- data/file_features/published/isobmff/f1.mp4 | 3 + .../published/isobmff/f1_gpac.json | 14 +- .../file_features}/published/isobmff/f2.json | 9 +- data/file_features/published/isobmff/f2.mp4 | 3 + .../published/isobmff/f2_gpac.json | 166 +- .../fragment-random-access-1+AF8-rev1.json | 9 +- .../fragment-random-access-1+AF8-rev1.mp4 | 3 + ...ragment-random-access-1+AF8-rev1_gpac.json | 8 +- .../isobmff/fragment_random_access-2.json | 9 +- .../isobmff/fragment_random_access-2.mp4 | 3 + .../fragment_random_access-2_gpac.json | 8 +- .../published/isobmff/mbms-fec.iso3 | 3 + .../published/isobmff/mbms-fec.json | 9 +- .../published/isobmff/mbms-fec_gpac.json | 56381 ++++++++++++++++ .../published/isobmff/myData.dat | 3 + .../published/isobmff/restricted.json | 9 +- .../published/isobmff/restricted.mp4 | 3 + .../published/isobmff/restricted_gpac.json | 16 +- .../rtp_rtcp_reception_hint_tracks_v2.json | 9 +- .../rtp_rtcp_reception_hint_tracks_v2.mp4 | 3 + ...tp_rtcp_reception_hint_tracks_v2_gpac.json | 10 +- .../published/isobmff/sg-tl-st.json | 9 +- .../published/isobmff/sg-tl-st.mp4 | 3 + .../published/isobmff/sg-tl-st_gpac.ext.json | 16 + .../published/isobmff/sg-tl-st_gpac.json | 108 +- .../published/isobmff/timed-metadata.json | 13 +- .../published/isobmff/timed-metadata.mp4 | 3 + .../isobmff/timed-metadata_gpac.json | 8 +- .../published/maf/paaf/01_output_a.json | 9 +- .../published/maf/paaf/01_output_a.paf | 3 + .../published/maf/paaf/01_output_a_gpac.json | 6 +- .../file_features}/published/maf/vsaf/1.json | 9 +- data/file_features/published/maf/vsaf/1.mp4 | 3 + .../published/maf/vsaf/1_gpac.ext.json | 26 + .../published/maf/vsaf/1_gpac.json | 12 +- .../mpeg-audio-conformance/ac01.json | 9 +- .../published/mpeg-audio-conformance/ac01.mp4 | 3 + .../mpeg-audio-conformance/ac01_gpac.json | 8 +- .../sls2100_aot02_048_16.json | 9 +- .../sls2100_aot02_048_16.mp4 | 3 + .../sls2100_aot02_048_16_gpac.json | 41 +- .../published/nalu/hevc/aggr_hvc1.json | 9 +- .../published/nalu/hevc/aggr_hvc1.mp4 | 3 + .../published/nalu/hevc/aggr_hvc1_gpac.json | 10 +- .../published/nalu/hevc/alst_hvc1.json | 9 +- .../published/nalu/hevc/alst_hvc1.mp4 | 3 + .../published/nalu/hevc/alst_hvc1_gpac.json | 10 +- .../published/nalu/hevc/hev1_clg1_header.json | 14 + .../published/nalu/hevc/hev1_clg1_header.mp4 | 3 + .../nalu/hevc/hev1_clg1_header_gpac.json | 10 +- .../published/nalu/hevc/hev1_clg1_segment.m4s | 3 + .../published/nalu/hevc/hev1_only.json | 9 +- .../published/nalu/hevc/hev1_only.mp4 | 3 + .../published/nalu/hevc/hev1_only_gpac.json | 10 +- .../nalu/hevc/hevc_hev1_hev2_extractors.json | 9 +- .../nalu/hevc/hevc_hev1_hev2_extractors.mp4 | 3 + .../hevc/hevc_hev1_hev2_extractors_gpac.json | 12 +- .../nalu/hevc/hevc_hev1_hev2_implicit.json | 9 +- .../nalu/hevc/hevc_hev1_hev2_implicit.mp4 | 3 + .../hevc/hevc_hev1_hev2_implicit_gpac.json | 12 +- .../nalu/hevc/hevc_hvc1_hvc2_extractors.json | 9 +- .../nalu/hevc/hevc_hvc1_hvc2_extractors.mp4 | 3 + .../hevc/hevc_hvc1_hvc2_extractors_gpac.json | 12 +- .../nalu/hevc/hevc_hvc1_hvc2_implicit.json | 9 +- .../nalu/hevc/hevc_hvc1_hvc2_implicit.mp4 | 3 + .../hevc/hevc_hvc1_hvc2_implicit_gpac.json | 12 +- .../nalu/hevc/hevc_tiles_multiple_tracks.json | 9 +- .../nalu/hevc/hevc_tiles_multiple_tracks.mp4 | 3 + ...hevc_tiles_multiple_tracks_empty_base.json | 9 +- .../hevc_tiles_multiple_tracks_empty_base.mp4 | 3 + ...tiles_multiple_tracks_empty_base_gpac.json | 10 +- .../hevc/hevc_tiles_multiple_tracks_gpac.json | 10 +- .../hevc/hevc_tiles_single_track_nalm.json | 9 +- .../hevc/hevc_tiles_single_track_nalm.mp4 | 3 + ...evc_tiles_single_track_nalm_all_intra.json | 9 +- ...hevc_tiles_single_track_nalm_all_intra.mp4 | 3 + ...iles_single_track_nalm_all_intra_gpac.json | 10 +- .../hevc_tiles_single_track_nalm_gpac.json | 10 +- .../hevc_tiles_single_track_nalm_rle.json | 9 +- .../hevc/hevc_tiles_single_track_nalm_rle.mp4 | 3 + ...hevc_tiles_single_track_nalm_rle_gpac.json | 10 +- ..._tiles_single_track_trif_full_picture.json | 9 +- ...c_tiles_single_track_trif_full_picture.mp4 | 3 + ...s_single_track_trif_full_picture_gpac.json | 10 +- .../published/nalu/hevc/hvc1_only.json | 9 +- .../published/nalu/hevc/hvc1_only.mp4 | 3 + .../published/nalu/hevc/hvc1_only_gpac.json | 10 +- .../published/nalu/hevc/hvc2_extractors.json | 9 +- .../published/nalu/hevc/hvc2_extractors.mp4 | 3 + .../nalu/hevc/hvc2_extractors_gpac.json | 12 +- .../published/nalu/hevc/subs_slice_hvc1.json | 13 +- .../published/nalu/hevc/subs_slice_hvc1.mp4 | 3 + .../nalu/hevc/subs_slice_hvc1_gpac.json | 10 +- .../published/nalu/hevc/subs_tile_hvc1.json | 13 +- .../published/nalu/hevc/subs_tile_hvc1.mp4 | 3 + .../nalu/hevc/subs_tile_hvc1_gpac.json | 10 +- .../published/nalu/hevc/trgr_hvc1.json | 14 +- .../published/nalu/hevc/trgr_hvc1.mp4 | 3 + .../published/nalu/hevc/trgr_hvc1_gpac.json | 12 +- .../nalu/l-hevc/lhevc_avc1_lhe1.json | 9 +- .../published/nalu/l-hevc/lhevc_avc1_lhe1.mp4 | 3 + .../nalu/l-hevc/lhevc_avc1_lhe1_gpac.json | 10 +- .../nalu/l-hevc/lhevc_avc1_lhv1.json | 9 +- .../published/nalu/l-hevc/lhevc_avc1_lhv1.mp4 | 3 + .../nalu/l-hevc/lhevc_avc1_lhv1_gpac.json | 10 +- .../nalu/l-hevc/lhevc_avc3_lhe1.json | 9 +- .../published/nalu/l-hevc/lhevc_avc3_lhe1.mp4 | 3 + .../nalu/l-hevc/lhevc_avc3_lhe1_gpac.json | 10 +- .../nalu/l-hevc/lhevc_avc3_lhv1.json | 9 +- .../published/nalu/l-hevc/lhevc_avc3_lhv1.mp4 | 3 + .../nalu/l-hevc/lhevc_avc3_lhv1_gpac.json | 10 +- ..._hev1_hev2_multiple_tracks_extractors.json | 9 +- ...c_hev1_hev2_multiple_tracks_extractors.mp4 | 3 + ..._hev2_multiple_tracks_extractors_gpac.json | 12 +- ...vc_hev1_lhe1_multiple_tracks_implicit.json | 9 +- ...hvc_hev1_lhe1_multiple_tracks_implicit.mp4 | 3 + ...v1_lhe1_multiple_tracks_implicit_gpac.json | 10 +- .../nalu/l-hevc/mhvc_hev1_single_track.json | 9 +- .../nalu/l-hevc/mhvc_hev1_single_track.mp4 | 3 + .../l-hevc/mhvc_hev1_single_track_gpac.json | 10 +- .../nalu/l-hevc/mhvc_hev2_single_track.json | 9 +- .../nalu/l-hevc/mhvc_hev2_single_track.mp4 | 3 + .../l-hevc/mhvc_hev2_single_track_gpac.json | 10 +- ..._hvc1_hvc2_multiple_tracks_extractors.json | 9 +- ...c_hvc1_hvc2_multiple_tracks_extractors.mp4 | 3 + ..._hvc2_multiple_tracks_extractors_gpac.json | 12 +- ...vc_hvc1_lhv1_multiple_tracks_implicit.json | 9 +- ...hvc_hvc1_lhv1_multiple_tracks_implicit.mp4 | 3 + ...c1_lhv1_multiple_tracks_implicit_gpac.json | 10 +- .../nalu/l-hevc/mhvc_hvc1_single_track.json | 9 +- .../nalu/l-hevc/mhvc_hvc1_single_track.mp4 | 3 + .../l-hevc/mhvc_hvc1_single_track_gpac.json | 10 +- .../nalu/l-hevc/mhvc_hvc2_single_track.json | 9 +- .../nalu/l-hevc/mhvc_hvc2_single_track.mp4 | 3 + .../l-hevc/mhvc_hvc2_single_track_gpac.json | 10 +- ..._hev1_hev2_multiple_tracks_extractors.json | 9 +- ...c_hev1_hev2_multiple_tracks_extractors.mp4 | 3 + ..._hev2_multiple_tracks_extractors_gpac.json | 12 +- ...vc_hev1_lhe1_multiple_tracks_implicit.json | 9 +- ...hvc_hev1_lhe1_multiple_tracks_implicit.mp4 | 3 + ...v1_lhe1_multiple_tracks_implicit_gpac.json | 10 +- .../nalu/l-hevc/shvc_hev1_single_track.json | 9 +- .../nalu/l-hevc/shvc_hev1_single_track.mp4 | 3 + .../l-hevc/shvc_hev1_single_track_gpac.json | 10 +- .../nalu/l-hevc/shvc_hev2_single_track.json | 9 +- .../nalu/l-hevc/shvc_hev2_single_track.mp4 | 3 + .../l-hevc/shvc_hev2_single_track_gpac.json | 10 +- ..._hvc1_hvc2_multiple_tracks_extractors.json | 9 +- ...c_hvc1_hvc2_multiple_tracks_extractors.mp4 | 3 + ..._hvc2_multiple_tracks_extractors_gpac.json | 12 +- ...vc_hvc1_lhv1_multiple_tracks_implicit.json | 9 +- ...hvc_hvc1_lhv1_multiple_tracks_implicit.mp4 | 3 + ...c1_lhv1_multiple_tracks_implicit_gpac.json | 10 +- .../nalu/l-hevc/shvc_hvc1_single_track.json | 9 +- .../nalu/l-hevc/shvc_hvc1_single_track.mp4 | 3 + .../l-hevc/shvc_hvc1_single_track_gpac.json | 10 +- .../nalu/l-hevc/shvc_hvc2_single_track.json | 9 +- .../nalu/l-hevc/shvc_hvc2_single_track.mp4 | 3 + .../l-hevc/shvc_hvc2_single_track_gpac.json | 10 +- .../nalu/mvc/DDF_10s_25fps-dynamic.json | 9 +- .../nalu/mvc/DDF_10s_25fps-dynamic.mp4 | 3 + .../nalu/mvc/DDF_10s_25fps-dynamic_gpac.json | 10 +- .../DDF_10s_25fps-dynamic_rep-R1_seg-0005.3gs | 3 + ...DDF_10s_25fps-dynamic_rep-R1_seg-0005.json | 9 +- ...0s_25fps-dynamic_rep-R1_seg-0005_gpac.json | 4 +- .../DDF_10s_25fps-dynamic_rep-R2_seg-0005.3gs | 3 + ...DDF_10s_25fps-dynamic_rep-R2_seg-0005.json | 9 +- ...0s_25fps-dynamic_rep-R2_seg-0005_gpac.json | 4 +- .../published/nalu/mvc/DDF_10s_25fps.json | 9 +- .../published/nalu/mvc/DDF_10s_25fps.mp4 | 3 + .../nalu/mvc/DDF_10s_25fps_gpac.json | 10 +- .../svc/mp4-live-LastTime-depRep-R1-0001.json | 9 +- .../svc/mp4-live-LastTime-depRep-R1-0001.mp4 | 3 + ...mp4-live-LastTime-depRep-R1-0001_gpac.json | 4 +- .../svc/mp4-live-LastTime-depRep-R1-0002.json | 9 +- .../svc/mp4-live-LastTime-depRep-R1-0002.mp4 | 3 + ...mp4-live-LastTime-depRep-R1-0002_gpac.json | 4 +- .../svc/mp4-live-LastTime-depRep-R1-0003.json | 9 +- .../svc/mp4-live-LastTime-depRep-R1-0003.mp4 | 3 + ...mp4-live-LastTime-depRep-R1-0003_gpac.json | 4 +- .../svc/mp4-live-LastTime-depRep-R2-0001.json | 9 +- .../svc/mp4-live-LastTime-depRep-R2-0001.mp4 | 3 + ...mp4-live-LastTime-depRep-R2-0001_gpac.json | 4 +- .../svc/mp4-live-LastTime-depRep-R2-0002.json | 9 +- .../svc/mp4-live-LastTime-depRep-R2-0002.mp4 | 3 + ...mp4-live-LastTime-depRep-R2-0002_gpac.json | 4 +- .../svc/mp4-live-LastTime-depRep-R2-0003.json | 9 +- .../svc/mp4-live-LastTime-depRep-R2-0003.mp4 | 3 + ...mp4-live-LastTime-depRep-R2-0003_gpac.json | 4 +- .../svc/mp4-live-LastTime-depRep-R3-0001.json | 9 +- .../svc/mp4-live-LastTime-depRep-R3-0001.mp4 | 3 + ...mp4-live-LastTime-depRep-R3-0001_gpac.json | 4 +- .../svc/mp4-live-LastTime-depRep-R3-0002.json | 9 +- .../svc/mp4-live-LastTime-depRep-R3-0002.mp4 | 3 + ...mp4-live-LastTime-depRep-R3-0002_gpac.json | 4 +- .../svc/mp4-live-LastTime-depRep-R3-0003.json | 9 +- .../svc/mp4-live-LastTime-depRep-R3-0003.mp4 | 3 + ...mp4-live-LastTime-depRep-R3-0003_gpac.json | 4 +- .../nalu/svc/mp4-live-LastTime-depRep.json | 9 +- .../nalu/svc/mp4-live-LastTime-depRep.mp4 | 3 + .../svc/mp4-live-LastTime-depRep_gpac.json | 14 +- .../uvvu/Solekai002_1280_23_1x1_v7clear.json | 9 +- .../uvvu/Solekai002_1280_23_1x1_v7clear.uvvu | 3 + .../Solekai002_1280_23_1x1_v7clear_gpac.json | 10 +- .../uvvu/Solekai007_1920_29_1x1_v7clear.json | 9 +- .../uvvu/Solekai007_1920_29_1x1_v7clear.uvu | 3 + .../Solekai007_1920_29_1x1_v7clear_gpac.json | 10 +- data/rules/hierarchy.json | 8 + data/schemas/file-metadata.schema.json | 117 + data/schemas/gpac-extension.schema.json | 73 + data/schemas/spec-info.schema.json | 42 + data/schemas/standard.schema.json | 107 + data/schemas/user-defined.schema.json | 11 + .../standard_features}/14496-12/boxes.json | 1332 +- .../14496-12/entity_groups.json | 9 +- .../14496-12/item_properties.json | 7 +- .../14496-12/item_references.json | 11 +- .../14496-12/sample_groups.json | 41 +- .../standard_features/14496-12/spec_info.json | 6 + .../14496-12/track_groups.json | 19 +- .../14496-12/track_references.json | 47 +- .../14496-12/user_defined.json | 2 +- .../standard_features/14496-14/spec_info.json | 6 + .../14496-14/user_defined.json | 2 +- .../standard_features}/14496-15/boxes.json | 292 +- data/standard_features/14496-15/codecs.json | 251 + .../14496-15/entity_groups.json | 33 +- .../14496-15/sample_groups.json | 123 +- .../standard_features/14496-15/spec_info.json | 6 + .../14496-15/track_groups.json | 15 +- .../14496-15/track_references.json | 67 +- .../14496-15/user_defined.json | 5 +- data/standard_features/14496-30/boxes.json | 35 + .../standard_features/14496-30/spec_info.json | 6 + .../standard_features}/23008-12/boxes.json | 21 +- .../23008-12/entity_groups.json | 81 +- .../23008-12/item_properties.json | 173 +- .../23008-12/item_references.json | 39 +- .../23008-12/sample_groups.json | 35 +- .../standard_features/23008-12/spec_info.json | 6 + data/standard_features/README.md | 11 + file_features/README.md | 34 - file_features/published/heif/C002.json | 17 - file_features/published/heif/C003.json | 20 - file_features/published/heif/C004.json | 17 - file_features/published/heif/C006.json | 20 - file_features/published/heif/C007.json | 17 - file_features/published/heif/C008.json | 20 - file_features/published/heif/C009.json | 20 - file_features/published/heif/C010.json | 20 - file_features/published/heif/C011.json | 23 - file_features/published/heif/C012.json | 23 - file_features/published/heif/C013.json | 20 - file_features/published/heif/C017.json | 20 - file_features/published/heif/C018.json | 20 - file_features/published/heif/C019.json | 20 - file_features/published/heif/C020.json | 20 - file_features/published/heif/C022.json | 17 - file_features/published/heif/C023.json | 17 - file_features/published/heif/C024.json | 17 - file_features/published/heif/C025.json | 17 - file_features/published/heif/C026.json | 17 - file_features/published/heif/C027.json | 17 - file_features/published/heif/C028.json | 17 - file_features/published/heif/C031.json | 17 - file_features/published/heif/C032.json | 20 - file_features/published/heif/C033.json | 11 - file_features/published/heif/C033_gpac.json | 641 - file_features/published/heif/C034.json | 17 - file_features/published/heif/C040.json | 29 - .../published/heif/multilayer001.json | 17 - .../published/heif/multilayer002.json | 17 - .../published/heif/multilayer003.json | 17 - .../published/heif/multilayer004.json | 20 - .../published/heif/multilayer005.json | 17 - .../published/isobmff/FX-VY-9436R.3_qhd.json | 11 - .../published/nalu/hevc/hev1_clg1_header.json | 11 - .../VVC/vvc_basic_track.json | 11 - .../VVC/vvc_basic_track_gpac.json | 684 - .../VVC/vvc_mixed_nal_subpicture_tracks.json | 11 - .../vvc_mixed_nal_subpicture_tracks_gpac.json | 1650 - .../VVC/vvc_subpicture_tracks.json | 11 - .../VVC/vvc_subpicture_tracks_gpac.json | 2623 - .../vvc_subpicture_tracks_spor_ordered.json | 11 - ...c_subpicture_tracks_spor_ordered_gpac.json | 1347 - ...itute_subpictures_single_sample_track.json | 11 - ..._subpictures_single_sample_track_gpac.json | 2471 - .../VVC/vvc_substitute_subpictures_track.json | 11 - ...vvc_substitute_subpictures_track_gpac.json | 2623 - .../under_consideration/cenc/audio_cbcs.json | 11 - .../cenc/audio_cbcs_const_iv.json | 11 - .../cenc/audio_cbcs_const_iv_gpac.json | 606 - .../cenc/audio_cbcs_gpac.json | 1075 - .../cenc/audio_cenc_128iv.json | 11 - .../cenc/audio_cenc_128iv_gpac.json | 1073 - .../under_consideration/cenc/image_cbc1.json | 11 - .../under_consideration/cenc/image_cbcs.json | 11 - .../cenc/image_cbcs_const_iv.json | 11 - .../cenc/image_cbcs_const_iv_roll.json | 11 - .../cenc/image_cbcs_mkey_const_iv_subs.json | 11 - .../cenc/image_cenc_128iv.json | 11 - .../cenc/image_cenc_64iv.json | 11 - .../cenc/image_cenc_mkey_base.json | 11 - .../cenc/image_cenc_mkey_roll.json | 11 - .../cenc/image_cenc_mkey_subs.json | 11 - .../cenc/image_cenc_roll.json | 11 - .../cenc/image_cens_128iv.json | 11 - .../cenc/image_cens_64iv.json | 11 - .../under_consideration/cenc/video_cbc1.json | 11 - .../cenc/video_cbc1_gpac.json | 2968 - .../under_consideration/cenc/video_cbcs.json | 11 - .../cenc/video_cbcs_const_iv.json | 11 - .../cenc/video_cbcs_const_iv_gpac.json | 2921 - .../cenc/video_cbcs_const_iv_roll.json | 11 - .../cenc/video_cbcs_const_iv_roll_frag1s.json | 11 - .../video_cbcs_const_iv_roll_frag1s_gpac.json | 3160 - .../cenc/video_cbcs_const_iv_roll_gpac.json | 2962 - .../cenc/video_cbcs_gpac.json | 2970 - .../cenc/video_cbcs_mkey_const_iv_subs.json | 11 - .../cenc/video_cenc_128iv.json | 11 - .../cenc/video_cenc_128iv_gpac.json | 2968 - .../cenc/video_cenc_64iv.json | 11 - .../cenc/video_cenc_64iv_gpac.json | 2968 - .../cenc/video_cenc_mkey_base.json | 11 - .../cenc/video_cenc_mkey_roll.json | 11 - .../cenc/video_cenc_mkey_subs.json | 11 - .../cenc/video_cenc_roll.json | 11 - .../cenc/video_cenc_roll_frag1s.json | 11 - .../cenc/video_cenc_roll_frag1s_gpac.json | 3250 - .../cenc/video_cenc_roll_gpac.json | 3031 - .../cenc/video_cens_128iv.json | 11 - .../cenc/video_cens_128iv_gpac.json | 2970 - .../cenc/video_cens_64iv.json | 11 - .../cenc/video_cens_64iv_gpac.json | 2970 - .../comp/comp_all_otyp.json | 11 - .../comp/comp_all_otyp_gpac.json | 689 - .../comp/comp_moof_nobrand.json | 11 - .../comp/comp_moof_nobrand_gpac.json | 648 - .../comp/comp_moof_otyp.json | 11 - .../comp/comp_moof_otyp_gpac.json | 650 - .../comp/comp_moof_sidx_otyp.json | 11 - .../comp/comp_moof_sidx_otyp_gpac.json | 651 - .../comp/comp_moof_sidx_ssix_otyp.json | 11 - .../comp/comp_moof_sidx_ssix_otyp_gpac.json | 688 - .../comp/comp_moov_isoc.json | 11 - .../comp/comp_moov_isoc_gpac.json | 498 - .../comp/comp_moov_otyp.json | 11 - .../comp/comp_moov_otyp_gpac.json | 511 - .../samplegroups_defrag_compact.json | 11 - .../samplegroups_defrag_compact_gpac.json | 577 - .../samplegroups_defrag_normal.json | 11 - .../samplegroups_defrag_normal_gpac.json | 619 - .../samplegroups_fragmented.json | 11 - .../samplegroups_fragmented_gpac.json | 918 - html/.browserslistrc | 3 - html/.editorconfig | 7 - html/.eslintrc.js | 17 - html/README.md | 42 - html/babel.config.js | 5 - html/package-lock.json | 28501 -------- html/package.json | 29 - html/public/favicon.ico | Bin 4286 -> 0 bytes html/public/index.html | 17 - html/src/App.vue | 30 - html/src/assets/logo.png | Bin 6849 -> 0 bytes html/src/components/HelloWorld.vue | 60 - html/src/main.js | 6 - html/src/router/index.js | 25 - html/src/store/index.js | 12 - html/src/views/About.vue | 5 - html/src/views/Home.vue | 18 - src/.gitignore | 1 + src/README.md | 3 - src/common/__init__.py | 42 + src/construct/boxes.py | 289 + src/construct/construct_all.py | 21 + src/construct/coverage.py | 301 + src/construct/dictionary.py | 39 + src/construct/files.py | 266 + src/construct/hierarchy.py | 357 + src/feature-extractor/README.rst | 0 .../feature_extractor/__init__.py | 1 - .../feature_extractor/file_features.py | 271 - .../feature_extractor/spec_features.py | 418 - src/feature-extractor/poetry.lock | 359 - src/feature-extractor/pyproject.toml | 33 - src/feature-extractor/tests/__init__.py | 0 .../tests/test_feature_extractor.py | 5 - src/feature_extractor/file_features.py | 716 + src/feature_extractor/get_sections.py | 142 + src/feature_extractor/spec_features.py | 450 + .../feature_extractor/utils.py | 29 +- src/poetry.lock | 725 + src/pyproject.toml | 59 + src/tests/__mocks__/test_boxes.json | 54 + src/tests/test_files.py | 322 + src/tests/test_hiearchy.py | 50 + src/tests/test_validate.py | 59 + .../14496-15/item_properties.json | 4 - .../14496-15/item_references.json | 4 - standard_features/14496-30/boxes.json | 67 - standard_features/14496-30/entity_groups.json | 4 - .../14496-30/item_properties.json | 4 - .../14496-30/item_references.json | 4 - standard_features/14496-30/sample_groups.json | 4 - standard_features/14496-30/track_groups.json | 4 - .../14496-30/track_references.json | 4 - standard_features/23008-12/track_groups.json | 4 - .../23008-12/track_references.json | 4 - standard_features/README.md | 7 - 770 files changed, 132250 insertions(+), 89092 deletions(-) create mode 100644 .gitattributes delete mode 100644 .github/ISSUE_TEMPLATE/conformance-file-bug.md create mode 100644 .github/ISSUE_TEMPLATE/conformance-file-bug.yml create mode 100644 .github/ISSUE_TEMPLATE/page-bug.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/problem-matchers.json create mode 100644 .github/workflows/cfc.yml create mode 100644 .github/workflows/gpac.yml create mode 100644 .github/workflows/pr.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/test.yml create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 LICENSE create mode 100644 conformance-search/.eslintrc rename {html => conformance-search}/.gitignore (60%) create mode 100644 conformance-search/.prettierrc create mode 100644 conformance-search/index.html create mode 100644 conformance-search/package-lock.json create mode 100644 conformance-search/package.json create mode 100644 conformance-search/postcss.config.js create mode 100644 conformance-search/src/components/BoxComponent.tsx create mode 100644 conformance-search/src/components/Chip.tsx create mode 100644 conformance-search/src/components/CoverageSummary.tsx create mode 100644 conformance-search/src/components/Drawer.tsx create mode 100644 conformance-search/src/components/FeatureComponent.tsx create mode 100644 conformance-search/src/components/FileComponent.tsx create mode 100644 conformance-search/src/components/Input/Dropdown.tsx create mode 100644 conformance-search/src/components/Input/Input.tsx create mode 100644 conformance-search/src/components/Input/helpers/index.ts create mode 100644 conformance-search/src/components/Input/index.ts create mode 100644 conformance-search/src/components/Input/variants/ContainerInput.tsx create mode 100644 conformance-search/src/components/Input/variants/SelectInput.tsx create mode 100644 conformance-search/src/components/Input/variants/index.ts create mode 100644 conformance-search/src/components/ListComponent.tsx create mode 100644 conformance-search/src/components/NavigationBar.tsx create mode 100644 conformance-search/src/components/SearchComponent/SearchComponent.spec.tsx create mode 100644 conformance-search/src/components/SearchComponent/SearchComponent.tsx create mode 100644 conformance-search/src/components/SearchComponent/hooks/useFilters.ts create mode 100644 conformance-search/src/components/SearchComponent/index.ts create mode 100644 conformance-search/src/components/Select.tsx create mode 100644 conformance-search/src/components/SpecsCovered.tsx create mode 100644 conformance-search/src/components/index.ts create mode 100644 conformance-search/src/contexts/RefinementContext.ts create mode 100644 conformance-search/src/index.css create mode 100644 conformance-search/src/lib/__snapshots__/database.spec.ts.snap create mode 100644 conformance-search/src/lib/__snapshots__/search.spec.ts.snap create mode 100644 conformance-search/src/lib/database.spec.ts create mode 100644 conformance-search/src/lib/database.ts create mode 100644 conformance-search/src/lib/search.spec.ts create mode 100644 conformance-search/src/lib/search.ts create mode 100644 conformance-search/src/lib/utils.ts create mode 100644 conformance-search/src/main.tsx create mode 100644 conformance-search/src/pages/AboutPage.tsx create mode 100644 conformance-search/src/pages/CoveragePage.tsx create mode 100644 conformance-search/src/pages/SearchPage.tsx create mode 100644 conformance-search/src/pages/pages.spec.tsx create mode 100644 conformance-search/src/types/index.ts create mode 100644 conformance-search/src/types/json.ts create mode 100644 conformance-search/src/vite-env.d.ts create mode 100644 conformance-search/tailwind.config.js create mode 100644 conformance-search/tests/__mocks__/boxes.json create mode 100644 conformance-search/tests/__mocks__/coverage.json create mode 100644 conformance-search/tests/__mocks__/dictionary.json create mode 100644 conformance-search/tests/__mocks__/files.json create mode 100644 conformance-search/tests/__mocks__/hierarchy.json create mode 100644 conformance-search/tests/setup.ts create mode 100644 conformance-search/tsconfig.json create mode 100644 conformance-search/tsconfig.node.json create mode 100644 conformance-search/vite.config.ts create mode 100644 data/file_features/.cfignore create mode 100644 data/file_features/README.md create mode 100644 data/file_features/published/3gp/female_amr67DTX_hinted.3gp rename {file_features => data/file_features}/published/3gp/female_amr67DTX_hinted.json (73%) rename {file_features => data/file_features}/published/3gp/female_amr67DTX_hinted_gpac.json (99%) create mode 100644 data/file_features/published/3gp/female_amr67_hinted.3gp rename {file_features => data/file_features}/published/3gp/female_amr67_hinted.json (74%) rename {file_features => data/file_features}/published/3gp/female_amr67_hinted_gpac.json (99%) create mode 100644 data/file_features/published/3gp/male_amr122.3gp rename {file_features => data/file_features}/published/3gp/male_amr122.json (73%) create mode 100644 data/file_features/published/3gp/male_amr122DTX.3gp rename {file_features => data/file_features}/published/3gp/male_amr122DTX.json (73%) rename {file_features => data/file_features}/published/3gp/male_amr122DTX_gpac.json (99%) rename {file_features => data/file_features}/published/3gp/male_amr122_gpac.json (98%) create mode 100644 data/file_features/published/3gp/pdin_example.3gp rename {file_features => data/file_features}/published/3gp/pdin_example.json (77%) create mode 100644 data/file_features/published/3gp/pdin_example_gpac.ext.json rename {file_features => data/file_features}/published/3gp/pdin_example_gpac.json (99%) create mode 100644 data/file_features/published/3gp/rs_example_r1.3gp rename {file_features => data/file_features}/published/3gp/rs_example_r1.json (81%) create mode 100644 data/file_features/published/3gp/rs_example_r1_gpac.ext.json rename {file_features => data/file_features}/published/3gp/rs_example_r1_gpac.json (99%) rename {file_features => data/file_features}/published/green/meta_2500000bps_0.json (58%) create mode 100644 data/file_features/published/green/meta_2500000bps_0.mp4m rename {file_features => data/file_features}/published/green/meta_2500000bps_0_gpac.json (99%) rename {file_features => data/file_features}/published/green/video_2500000bps_0.json (58%) create mode 100644 data/file_features/published/green/video_2500000bps_0.mp4 rename {file_features => data/file_features}/published/green/video_2500000bps_0_gpac.json (99%) create mode 100644 data/file_features/published/heif/C001.heic rename {file_features => data/file_features}/published/heif/C001.json (51%) rename {file_features => data/file_features}/published/heif/C001_gpac.json (98%) create mode 100644 data/file_features/published/heif/C002.heic create mode 100644 data/file_features/published/heif/C002.json rename {file_features => data/file_features}/published/heif/C002_gpac.json (98%) create mode 100644 data/file_features/published/heif/C003.heic create mode 100644 data/file_features/published/heif/C003.json rename {file_features => data/file_features}/published/heif/C003_gpac.json (98%) create mode 100644 data/file_features/published/heif/C004.heic create mode 100644 data/file_features/published/heif/C004.json rename {file_features => data/file_features}/published/heif/C004_gpac.json (88%) create mode 100644 data/file_features/published/heif/C005.heic rename {file_features => data/file_features}/published/heif/C005.json (50%) rename {file_features => data/file_features}/published/heif/C005_gpac.json (98%) create mode 100644 data/file_features/published/heif/C006.heic create mode 100644 data/file_features/published/heif/C006.json rename {file_features => data/file_features}/published/heif/C006_gpac.json (97%) create mode 100644 data/file_features/published/heif/C007.heic create mode 100644 data/file_features/published/heif/C007.json rename {file_features => data/file_features}/published/heif/C007_gpac.json (91%) create mode 100644 data/file_features/published/heif/C008.heic create mode 100644 data/file_features/published/heif/C008.json rename {file_features => data/file_features}/published/heif/C008_gpac.json (98%) create mode 100644 data/file_features/published/heif/C009.heic create mode 100644 data/file_features/published/heif/C009.json rename {file_features => data/file_features}/published/heif/C009_gpac.json (98%) create mode 100644 data/file_features/published/heif/C010.heic create mode 100644 data/file_features/published/heif/C010.json rename {file_features => data/file_features}/published/heif/C010_gpac.json (98%) create mode 100644 data/file_features/published/heif/C011.heic create mode 100644 data/file_features/published/heif/C011.json rename {file_features => data/file_features}/published/heif/C011_gpac.json (98%) create mode 100644 data/file_features/published/heif/C012.heic create mode 100644 data/file_features/published/heif/C012.json rename {file_features => data/file_features}/published/heif/C012_gpac.json (90%) create mode 100644 data/file_features/published/heif/C013.heic create mode 100644 data/file_features/published/heif/C013.json rename {file_features => data/file_features}/published/heif/C013_gpac.json (98%) create mode 100644 data/file_features/published/heif/C014.heic rename {file_features => data/file_features}/published/heif/C014.json (52%) rename {file_features => data/file_features}/published/heif/C014_gpac.json (98%) create mode 100644 data/file_features/published/heif/C015.heic rename {file_features => data/file_features}/published/heif/C015.json (54%) rename {file_features => data/file_features}/published/heif/C015_gpac.json (98%) create mode 100644 data/file_features/published/heif/C016.heic rename {file_features => data/file_features}/published/heif/C016.json (59%) rename {file_features => data/file_features}/published/heif/C016_gpac.json (98%) create mode 100644 data/file_features/published/heif/C017.heic create mode 100644 data/file_features/published/heif/C017.json rename {file_features => data/file_features}/published/heif/C017_gpac.json (98%) create mode 100644 data/file_features/published/heif/C018.heic create mode 100644 data/file_features/published/heif/C018.json rename {file_features => data/file_features}/published/heif/C018_gpac.json (98%) create mode 100644 data/file_features/published/heif/C019.heic create mode 100644 data/file_features/published/heif/C019.json rename {file_features => data/file_features}/published/heif/C019_gpac.json (98%) create mode 100644 data/file_features/published/heif/C020.heic create mode 100644 data/file_features/published/heif/C020.json rename {file_features => data/file_features}/published/heif/C020_gpac.json (98%) create mode 100644 data/file_features/published/heif/C021.heic rename {file_features => data/file_features}/published/heif/C021.json (60%) rename {file_features => data/file_features}/published/heif/C021_gpac.json (98%) create mode 100644 data/file_features/published/heif/C022.heic create mode 100644 data/file_features/published/heif/C022.json rename {file_features => data/file_features}/published/heif/C022_gpac.json (91%) create mode 100644 data/file_features/published/heif/C023.heic create mode 100644 data/file_features/published/heif/C023.json rename {file_features => data/file_features}/published/heif/C023_gpac.json (91%) create mode 100644 data/file_features/published/heif/C024.heic create mode 100644 data/file_features/published/heif/C024.json rename {file_features => data/file_features}/published/heif/C024_gpac.json (98%) create mode 100644 data/file_features/published/heif/C025.heic create mode 100644 data/file_features/published/heif/C025.json rename {file_features => data/file_features}/published/heif/C025_gpac.json (90%) create mode 100644 data/file_features/published/heif/C026.heic create mode 100644 data/file_features/published/heif/C026.json rename {file_features => data/file_features}/published/heif/C026_gpac.json (98%) create mode 100644 data/file_features/published/heif/C027.heic create mode 100644 data/file_features/published/heif/C027.json rename {file_features => data/file_features}/published/heif/C027_gpac.json (98%) create mode 100644 data/file_features/published/heif/C028.heic create mode 100644 data/file_features/published/heif/C028.json rename {file_features => data/file_features}/published/heif/C028_gpac.json (98%) create mode 100644 data/file_features/published/heif/C029.heic rename {file_features => data/file_features}/published/heif/C029.json (50%) rename {file_features => data/file_features}/published/heif/C029_gpac.json (98%) create mode 100644 data/file_features/published/heif/C030.heic rename {file_features => data/file_features}/published/heif/C030.json (50%) rename {file_features => data/file_features}/published/heif/C030_gpac.json (98%) create mode 100644 data/file_features/published/heif/C031.heic create mode 100644 data/file_features/published/heif/C031.json rename {file_features => data/file_features}/published/heif/C031_gpac.json (99%) create mode 100644 data/file_features/published/heif/C032.heic create mode 100644 data/file_features/published/heif/C032.json rename {file_features => data/file_features}/published/heif/C032_gpac.json (99%) create mode 100644 data/file_features/published/heif/C034.heic create mode 100644 data/file_features/published/heif/C034.json rename {file_features => data/file_features}/published/heif/C034_gpac.json (98%) create mode 100644 data/file_features/published/heif/C036.heic rename {file_features => data/file_features}/published/heif/C036.json (53%) rename {file_features => data/file_features}/published/heif/C036_gpac.json (98%) create mode 100644 data/file_features/published/heif/C037.heic rename {file_features => data/file_features}/published/heif/C037.json (53%) rename {file_features => data/file_features}/published/heif/C037_gpac.json (98%) create mode 100644 data/file_features/published/heif/C038.heic rename {file_features => data/file_features}/published/heif/C038.json (52%) rename {file_features => data/file_features}/published/heif/C038_gpac.json (98%) create mode 100644 data/file_features/published/heif/C039.heic rename {file_features => data/file_features}/published/heif/C039.json (60%) rename {file_features => data/file_features}/published/heif/C039_gpac.json (98%) create mode 100644 data/file_features/published/heif/C040.heic create mode 100644 data/file_features/published/heif/C040.json rename {file_features => data/file_features}/published/heif/C040_gpac.json (99%) create mode 100644 data/file_features/published/heif/C041.heic rename {file_features => data/file_features}/published/heif/C041.json (52%) rename {file_features => data/file_features}/published/heif/C041_gpac.json (98%) create mode 100644 data/file_features/published/heif/C042.heic rename {file_features => data/file_features}/published/heif/C042.json (51%) rename {file_features => data/file_features}/published/heif/C042_gpac.json (96%) create mode 100644 data/file_features/published/heif/iff_hevc_single_item.heic rename {file_features => data/file_features}/published/heif/iff_hevc_single_item.json (57%) rename {file_features => data/file_features}/published/heif/iff_hevc_single_item_gpac.json (98%) create mode 100644 data/file_features/published/heif/iff_hevc_single_item_main10.heic rename {file_features => data/file_features}/published/heif/iff_hevc_single_item_main10.json (56%) rename {file_features => data/file_features}/published/heif/iff_hevc_single_item_main10_gpac.json (98%) create mode 100644 data/file_features/published/heif/iff_hevc_tile_multiple_items_tbas.heic rename {file_features => data/file_features}/published/heif/iff_hevc_tile_multiple_items_tbas.json (55%) rename {file_features => data/file_features}/published/heif/iff_hevc_tile_multiple_items_tbas_gpac.json (99%) create mode 100644 data/file_features/published/heif/multilayer001.heic create mode 100644 data/file_features/published/heif/multilayer001.json rename {file_features => data/file_features}/published/heif/multilayer001_gpac.json (98%) create mode 100644 data/file_features/published/heif/multilayer002.heic create mode 100644 data/file_features/published/heif/multilayer002.json rename {file_features => data/file_features}/published/heif/multilayer002_gpac.json (99%) create mode 100644 data/file_features/published/heif/multilayer003.heic create mode 100644 data/file_features/published/heif/multilayer003.json rename {file_features => data/file_features}/published/heif/multilayer003_gpac.json (98%) create mode 100644 data/file_features/published/heif/multilayer004.heic create mode 100644 data/file_features/published/heif/multilayer004.json rename {file_features => data/file_features}/published/heif/multilayer004_gpac.json (98%) create mode 100644 data/file_features/published/heif/multilayer005.heic create mode 100644 data/file_features/published/heif/multilayer005.json create mode 100644 data/file_features/published/heif/multilayer005_gpac.ext.json rename {file_features => data/file_features}/published/heif/multilayer005_gpac.json (98%) rename {file_features => data/file_features}/published/isobmff/01_simple.json (85%) create mode 100644 data/file_features/published/isobmff/01_simple.mp4 rename {file_features => data/file_features}/published/isobmff/01_simple_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/02_dref_edts_img.json (84%) create mode 100644 data/file_features/published/isobmff/02_dref_edts_img.mp4 rename {file_features => data/file_features}/published/isobmff/02_dref_edts_img_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/03_hinted.json (86%) create mode 100644 data/file_features/published/isobmff/03_hinted.mp4 rename {file_features => data/file_features}/published/isobmff/03_hinted_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/04_bifs_video.json (84%) create mode 100644 data/file_features/published/isobmff/04_bifs_video.mp4 rename {file_features => data/file_features}/published/isobmff/04_bifs_video_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/05_bifs_video_protected_v2.json (83%) create mode 100644 data/file_features/published/isobmff/05_bifs_video_protected_v2.mp4 rename {file_features => data/file_features}/published/isobmff/05_bifs_video_protected_v2_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/06_bifs.json (80%) create mode 100644 data/file_features/published/isobmff/06_bifs.mp4 rename {file_features => data/file_features}/published/isobmff/06_bifs_gpac.json (98%) rename {file_features => data/file_features}/published/isobmff/07_bifs_sprite.json (82%) create mode 100644 data/file_features/published/isobmff/07_bifs_sprite.mp4 rename {file_features => data/file_features}/published/isobmff/07_bifs_sprite_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/08_bifs_carousel_v2.json (79%) create mode 100644 data/file_features/published/isobmff/08_bifs_carousel_v2.mp4 rename {file_features => data/file_features}/published/isobmff/08_bifs_carousel_v2_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/09_text.json (79%) create mode 100644 data/file_features/published/isobmff/09_text.mp4 create mode 100644 data/file_features/published/isobmff/09_text_gpac.json rename {file_features => data/file_features}/published/isobmff/10_fragments.json (80%) create mode 100644 data/file_features/published/isobmff/10_fragments.mp4 rename {file_features => data/file_features}/published/isobmff/10_fragments_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/12_metas_v2.json (79%) create mode 100644 data/file_features/published/isobmff/12_metas_v2.mp4 rename {file_features => data/file_features}/published/isobmff/12_metas_v2_gpac.json (98%) rename {file_features => data/file_features}/published/isobmff/13_long.json (77%) create mode 100644 data/file_features/published/isobmff/13_long.mp4 rename {file_features => data/file_features}/published/isobmff/13_long_gpac.json (98%) rename {file_features => data/file_features}/published/isobmff/14_large.json (75%) create mode 100644 data/file_features/published/isobmff/14_large.mp4.zip rename {file_features => data/file_features}/published/isobmff/14_large_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/16_vtt.json (60%) create mode 100644 data/file_features/published/isobmff/16_vtt.mp4 rename {file_features => data/file_features}/published/isobmff/16_vtt_gpac.json (98%) rename {file_features => data/file_features}/published/isobmff/17_negative_ctso.json (58%) create mode 100644 data/file_features/published/isobmff/17_negative_ctso.mp4 rename {file_features => data/file_features}/published/isobmff/17_negative_ctso_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/18_pssh_v2.json (60%) create mode 100644 data/file_features/published/isobmff/18_pssh_v2.mp4 rename {file_features => data/file_features}/published/isobmff/18_pssh_v2_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/19_ttml.json (60%) create mode 100644 data/file_features/published/isobmff/19_ttml.mp4 rename {file_features => data/file_features}/published/isobmff/19_ttml_gpac.json (98%) rename {file_features => data/file_features}/published/isobmff/20_stxt.json (60%) create mode 100644 data/file_features/published/isobmff/20_stxt.mp4 rename {file_features => data/file_features}/published/isobmff/20_stxt_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/21_segment.json (60%) create mode 100644 data/file_features/published/isobmff/21_segment.mp4 rename {file_features => data/file_features}/published/isobmff/21_segment_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/22_tx3g.json (60%) create mode 100644 data/file_features/published/isobmff/22_tx3g.mp4 create mode 100644 data/file_features/published/isobmff/22_tx3g_gpac.json rename {file_features => data/file_features}/published/isobmff/FX-VY-9436R.3_qhd-variant.json (57%) create mode 100644 data/file_features/published/isobmff/FX-VY-9436R.3_qhd-variant.mp4 create mode 100644 data/file_features/published/isobmff/FX-VY-9436R.3_qhd-variant_gpac.ext.json rename {file_features => data/file_features}/published/isobmff/FX-VY-9436R.3_qhd-variant_gpac.json (99%) create mode 100644 data/file_features/published/isobmff/FX-VY-9436R.3_qhd.json create mode 100644 data/file_features/published/isobmff/FX-VY-9436R.3_qhd.mp4 create mode 100644 data/file_features/published/isobmff/FX-VY-9436R.3_qhd.vinput.merged.xml create mode 100644 data/file_features/published/isobmff/FX-VY-9436R.3_qhd_gpac.ext.json rename {file_features => data/file_features}/published/isobmff/FX-VY-9436R.3_qhd_gpac.json (92%) rename {file_features => data/file_features}/published/isobmff/LargerThan4GB.json (53%) create mode 100644 data/file_features/published/isobmff/LargerThan4GB.mp4.zip rename {file_features => data/file_features}/published/isobmff/LargerThan4GB_gpac.json (98%) rename {file_features => data/file_features}/published/isobmff/a1-foreman-QCIF.json (77%) create mode 100644 data/file_features/published/isobmff/a1-foreman-QCIF.mp4 rename {file_features => data/file_features}/published/isobmff/a1-foreman-QCIF_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/a10-foreman_QCIF-raw.json (72%) create mode 100644 data/file_features/published/isobmff/a10-foreman_QCIF-raw.mp4 rename {file_features => data/file_features}/published/isobmff/a10-foreman_QCIF-raw_gpac.json (98%) rename {file_features => data/file_features}/published/isobmff/a2-foreman-QCIF-hinted.json (81%) create mode 100644 data/file_features/published/isobmff/a2-foreman-QCIF-hinted.mp4 rename {file_features => data/file_features}/published/isobmff/a2-foreman-QCIF-hinted_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/a3-tone-protected.json (65%) create mode 100644 data/file_features/published/isobmff/a3-tone-protected.mp4 rename {file_features => data/file_features}/published/isobmff/a3-tone-protected_gpac.json (98%) rename {file_features => data/file_features}/published/isobmff/a3b-tone-deprot.json (74%) create mode 100644 data/file_features/published/isobmff/a3b-tone-deprot.mp4 rename {file_features => data/file_features}/published/isobmff/a3b-tone-deprot_gpac.json (98%) create mode 100644 data/file_features/published/isobmff/a3c-prot-keys.txt rename {file_features => data/file_features}/published/isobmff/a4-tone-fragmented.json (73%) create mode 100644 data/file_features/published/isobmff/a4-tone-fragmented.mp4 rename {file_features => data/file_features}/published/isobmff/a4-tone-fragmented_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/a5-foreman-AVC.json (75%) create mode 100644 data/file_features/published/isobmff/a5-foreman-AVC.mp4 rename {file_features => data/file_features}/published/isobmff/a5-foreman-AVC_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/a6_tone_multifile.json (65%) create mode 100644 data/file_features/published/isobmff/a6_tone_multifile.mp4 rename {file_features => data/file_features}/published/isobmff/a6_tone_multifile_gpac.json (98%) rename {file_features => data/file_features}/published/isobmff/a7-tone-oddities.json (77%) create mode 100644 data/file_features/published/isobmff/a7-tone-oddities.mp4 create mode 100644 data/file_features/published/isobmff/a7-tone-oddities_gpac.ext.json rename {file_features => data/file_features}/published/isobmff/a7-tone-oddities_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/a8-foreman_QCIF_edit.json (70%) create mode 100644 data/file_features/published/isobmff/a8-foreman_QCIF_edit.mp4 rename {file_features => data/file_features}/published/isobmff/a8-foreman_QCIF_edit_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/a9-aac-samplegroups-edit.json (73%) create mode 100644 data/file_features/published/isobmff/a9-aac-samplegroups-edit.mp4 rename {file_features => data/file_features}/published/isobmff/a9-aac-samplegroups-edit_gpac.json (98%) create mode 100644 data/file_features/published/isobmff/compact-no-code-fec-1.iso3 rename {file_features => data/file_features}/published/isobmff/compact-no-code-fec-1.json (72%) create mode 100644 data/file_features/published/isobmff/compact-no-code-fec-1_gpac.json create mode 100644 data/file_features/published/isobmff/compact-no-code-fec-2.iso3 rename {file_features => data/file_features}/published/isobmff/compact-no-code-fec-2.json (74%) create mode 100644 data/file_features/published/isobmff/compact-no-code-fec-2_gpac.json rename {file_features => data/file_features}/published/isobmff/f1.json (79%) create mode 100644 data/file_features/published/isobmff/f1.mp4 rename {file_features => data/file_features}/published/isobmff/f1_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/f2.json (80%) create mode 100644 data/file_features/published/isobmff/f2.mp4 rename {file_features => data/file_features}/published/isobmff/f2_gpac.json (92%) rename {file_features => data/file_features}/published/isobmff/fragment-random-access-1+AF8-rev1.json (77%) create mode 100644 data/file_features/published/isobmff/fragment-random-access-1+AF8-rev1.mp4 rename {file_features => data/file_features}/published/isobmff/fragment-random-access-1+AF8-rev1_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/fragment_random_access-2.json (77%) create mode 100644 data/file_features/published/isobmff/fragment_random_access-2.mp4 rename {file_features => data/file_features}/published/isobmff/fragment_random_access-2_gpac.json (99%) create mode 100644 data/file_features/published/isobmff/mbms-fec.iso3 rename {file_features => data/file_features}/published/isobmff/mbms-fec.json (77%) create mode 100644 data/file_features/published/isobmff/mbms-fec_gpac.json create mode 100644 data/file_features/published/isobmff/myData.dat rename {file_features => data/file_features}/published/isobmff/restricted.json (79%) create mode 100644 data/file_features/published/isobmff/restricted.mp4 rename {file_features => data/file_features}/published/isobmff/restricted_gpac.json (98%) rename {file_features => data/file_features}/published/isobmff/rtp_rtcp_reception_hint_tracks_v2.json (75%) create mode 100644 data/file_features/published/isobmff/rtp_rtcp_reception_hint_tracks_v2.mp4 rename {file_features => data/file_features}/published/isobmff/rtp_rtcp_reception_hint_tracks_v2_gpac.json (99%) rename {file_features => data/file_features}/published/isobmff/sg-tl-st.json (84%) create mode 100644 data/file_features/published/isobmff/sg-tl-st.mp4 create mode 100644 data/file_features/published/isobmff/sg-tl-st_gpac.ext.json rename {file_features => data/file_features}/published/isobmff/sg-tl-st_gpac.json (98%) rename {file_features => data/file_features}/published/isobmff/timed-metadata.json (55%) create mode 100644 data/file_features/published/isobmff/timed-metadata.mp4 rename {file_features => data/file_features}/published/isobmff/timed-metadata_gpac.json (99%) rename {file_features => data/file_features}/published/maf/paaf/01_output_a.json (59%) create mode 100644 data/file_features/published/maf/paaf/01_output_a.paf rename {file_features => data/file_features}/published/maf/paaf/01_output_a_gpac.json (99%) rename {file_features => data/file_features}/published/maf/vsaf/1.json (62%) create mode 100644 data/file_features/published/maf/vsaf/1.mp4 create mode 100644 data/file_features/published/maf/vsaf/1_gpac.ext.json rename {file_features => data/file_features}/published/maf/vsaf/1_gpac.json (99%) rename {file_features => data/file_features}/published/mpeg-audio-conformance/ac01.json (61%) create mode 100644 data/file_features/published/mpeg-audio-conformance/ac01.mp4 rename {file_features => data/file_features}/published/mpeg-audio-conformance/ac01_gpac.json (99%) rename {file_features => data/file_features}/published/mpeg-audio-conformance/sls2100_aot02_048_16.json (58%) create mode 100644 data/file_features/published/mpeg-audio-conformance/sls2100_aot02_048_16.mp4 rename {file_features => data/file_features}/published/mpeg-audio-conformance/sls2100_aot02_048_16_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/aggr_hvc1.json (60%) create mode 100644 data/file_features/published/nalu/hevc/aggr_hvc1.mp4 rename {file_features => data/file_features}/published/nalu/hevc/aggr_hvc1_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/alst_hvc1.json (76%) create mode 100644 data/file_features/published/nalu/hevc/alst_hvc1.mp4 rename {file_features => data/file_features}/published/nalu/hevc/alst_hvc1_gpac.json (99%) create mode 100644 data/file_features/published/nalu/hevc/hev1_clg1_header.json create mode 100644 data/file_features/published/nalu/hevc/hev1_clg1_header.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hev1_clg1_header_gpac.json (98%) create mode 100644 data/file_features/published/nalu/hevc/hev1_clg1_segment.m4s rename {file_features => data/file_features}/published/nalu/hevc/hev1_only.json (60%) create mode 100644 data/file_features/published/nalu/hevc/hev1_only.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hev1_only_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/hevc_hev1_hev2_extractors.json (57%) create mode 100644 data/file_features/published/nalu/hevc/hevc_hev1_hev2_extractors.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hevc_hev1_hev2_extractors_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/hevc_hev1_hev2_implicit.json (57%) create mode 100644 data/file_features/published/nalu/hevc/hevc_hev1_hev2_implicit.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hevc_hev1_hev2_implicit_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/hevc_hvc1_hvc2_extractors.json (57%) create mode 100644 data/file_features/published/nalu/hevc/hevc_hvc1_hvc2_extractors.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hevc_hvc1_hvc2_extractors_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/hevc_hvc1_hvc2_implicit.json (57%) create mode 100644 data/file_features/published/nalu/hevc/hevc_hvc1_hvc2_implicit.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hevc_hvc1_hvc2_implicit_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/hevc_tiles_multiple_tracks.json (81%) create mode 100644 data/file_features/published/nalu/hevc/hevc_tiles_multiple_tracks.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hevc_tiles_multiple_tracks_empty_base.json (79%) create mode 100644 data/file_features/published/nalu/hevc/hevc_tiles_multiple_tracks_empty_base.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hevc_tiles_multiple_tracks_empty_base_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/hevc_tiles_multiple_tracks_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/hevc_tiles_single_track_nalm.json (81%) create mode 100644 data/file_features/published/nalu/hevc/hevc_tiles_single_track_nalm.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hevc_tiles_single_track_nalm_all_intra.json (79%) create mode 100644 data/file_features/published/nalu/hevc/hevc_tiles_single_track_nalm_all_intra.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hevc_tiles_single_track_nalm_all_intra_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/hevc_tiles_single_track_nalm_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/hevc_tiles_single_track_nalm_rle.json (80%) create mode 100644 data/file_features/published/nalu/hevc/hevc_tiles_single_track_nalm_rle.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hevc_tiles_single_track_nalm_rle_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/hevc_tiles_single_track_trif_full_picture.json (79%) create mode 100644 data/file_features/published/nalu/hevc/hevc_tiles_single_track_trif_full_picture.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hevc_tiles_single_track_trif_full_picture_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/hvc1_only.json (60%) create mode 100644 data/file_features/published/nalu/hevc/hvc1_only.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hvc1_only_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/hvc2_extractors.json (71%) create mode 100644 data/file_features/published/nalu/hevc/hvc2_extractors.mp4 rename {file_features => data/file_features}/published/nalu/hevc/hvc2_extractors_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/subs_slice_hvc1.json (55%) create mode 100644 data/file_features/published/nalu/hevc/subs_slice_hvc1.mp4 rename {file_features => data/file_features}/published/nalu/hevc/subs_slice_hvc1_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/subs_tile_hvc1.json (55%) create mode 100644 data/file_features/published/nalu/hevc/subs_tile_hvc1.mp4 rename {file_features => data/file_features}/published/nalu/hevc/subs_tile_hvc1_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/hevc/trgr_hvc1.json (53%) create mode 100644 data/file_features/published/nalu/hevc/trgr_hvc1.mp4 rename {file_features => data/file_features}/published/nalu/hevc/trgr_hvc1_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/lhevc_avc1_lhe1.json (59%) create mode 100644 data/file_features/published/nalu/l-hevc/lhevc_avc1_lhe1.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/lhevc_avc1_lhe1_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/lhevc_avc1_lhv1.json (59%) create mode 100644 data/file_features/published/nalu/l-hevc/lhevc_avc1_lhv1.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/lhevc_avc1_lhv1_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/lhevc_avc3_lhe1.json (59%) create mode 100644 data/file_features/published/nalu/l-hevc/lhevc_avc3_lhe1.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/lhevc_avc3_lhe1_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/lhevc_avc3_lhv1.json (59%) create mode 100644 data/file_features/published/nalu/l-hevc/lhevc_avc3_lhv1.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/lhevc_avc3_lhv1_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hev1_hev2_multiple_tracks_extractors.json (84%) create mode 100644 data/file_features/published/nalu/l-hevc/mhvc_hev1_hev2_multiple_tracks_extractors.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hev1_hev2_multiple_tracks_extractors_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hev1_lhe1_multiple_tracks_implicit.json (84%) create mode 100644 data/file_features/published/nalu/l-hevc/mhvc_hev1_lhe1_multiple_tracks_implicit.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hev1_lhe1_multiple_tracks_implicit_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hev1_single_track.json (86%) create mode 100644 data/file_features/published/nalu/l-hevc/mhvc_hev1_single_track.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hev1_single_track_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hev2_single_track.json (86%) create mode 100644 data/file_features/published/nalu/l-hevc/mhvc_hev2_single_track.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hev2_single_track_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hvc1_hvc2_multiple_tracks_extractors.json (84%) create mode 100644 data/file_features/published/nalu/l-hevc/mhvc_hvc1_hvc2_multiple_tracks_extractors.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hvc1_hvc2_multiple_tracks_extractors_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hvc1_lhv1_multiple_tracks_implicit.json (84%) create mode 100644 data/file_features/published/nalu/l-hevc/mhvc_hvc1_lhv1_multiple_tracks_implicit.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hvc1_lhv1_multiple_tracks_implicit_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hvc1_single_track.json (86%) create mode 100644 data/file_features/published/nalu/l-hevc/mhvc_hvc1_single_track.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hvc1_single_track_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hvc2_single_track.json (86%) create mode 100644 data/file_features/published/nalu/l-hevc/mhvc_hvc2_single_track.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/mhvc_hvc2_single_track_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hev1_hev2_multiple_tracks_extractors.json (84%) create mode 100644 data/file_features/published/nalu/l-hevc/shvc_hev1_hev2_multiple_tracks_extractors.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hev1_hev2_multiple_tracks_extractors_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hev1_lhe1_multiple_tracks_implicit.json (84%) create mode 100644 data/file_features/published/nalu/l-hevc/shvc_hev1_lhe1_multiple_tracks_implicit.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hev1_lhe1_multiple_tracks_implicit_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hev1_single_track.json (86%) create mode 100644 data/file_features/published/nalu/l-hevc/shvc_hev1_single_track.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hev1_single_track_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hev2_single_track.json (86%) create mode 100644 data/file_features/published/nalu/l-hevc/shvc_hev2_single_track.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hev2_single_track_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hvc1_hvc2_multiple_tracks_extractors.json (84%) create mode 100644 data/file_features/published/nalu/l-hevc/shvc_hvc1_hvc2_multiple_tracks_extractors.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hvc1_hvc2_multiple_tracks_extractors_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hvc1_lhv1_multiple_tracks_implicit.json (84%) create mode 100644 data/file_features/published/nalu/l-hevc/shvc_hvc1_lhv1_multiple_tracks_implicit.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hvc1_lhv1_multiple_tracks_implicit_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hvc1_single_track.json (86%) create mode 100644 data/file_features/published/nalu/l-hevc/shvc_hvc1_single_track.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hvc1_single_track_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hvc2_single_track.json (86%) create mode 100644 data/file_features/published/nalu/l-hevc/shvc_hvc2_single_track.mp4 rename {file_features => data/file_features}/published/nalu/l-hevc/shvc_hvc2_single_track_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/mvc/DDF_10s_25fps-dynamic.json (57%) create mode 100644 data/file_features/published/nalu/mvc/DDF_10s_25fps-dynamic.mp4 rename {file_features => data/file_features}/published/nalu/mvc/DDF_10s_25fps-dynamic_gpac.json (98%) create mode 100644 data/file_features/published/nalu/mvc/DDF_10s_25fps-dynamic_rep-R1_seg-0005.3gs rename {file_features => data/file_features}/published/nalu/mvc/DDF_10s_25fps-dynamic_rep-R1_seg-0005.json (54%) rename {file_features => data/file_features}/published/nalu/mvc/DDF_10s_25fps-dynamic_rep-R1_seg-0005_gpac.json (99%) create mode 100644 data/file_features/published/nalu/mvc/DDF_10s_25fps-dynamic_rep-R2_seg-0005.3gs rename {file_features => data/file_features}/published/nalu/mvc/DDF_10s_25fps-dynamic_rep-R2_seg-0005.json (54%) rename {file_features => data/file_features}/published/nalu/mvc/DDF_10s_25fps-dynamic_rep-R2_seg-0005_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/mvc/DDF_10s_25fps.json (59%) create mode 100644 data/file_features/published/nalu/mvc/DDF_10s_25fps.mp4 rename {file_features => data/file_features}/published/nalu/mvc/DDF_10s_25fps_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R1-0001.json (55%) create mode 100644 data/file_features/published/nalu/svc/mp4-live-LastTime-depRep-R1-0001.mp4 rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R1-0001_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R1-0002.json (55%) create mode 100644 data/file_features/published/nalu/svc/mp4-live-LastTime-depRep-R1-0002.mp4 rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R1-0002_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R1-0003.json (55%) create mode 100644 data/file_features/published/nalu/svc/mp4-live-LastTime-depRep-R1-0003.mp4 rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R1-0003_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R2-0001.json (55%) create mode 100644 data/file_features/published/nalu/svc/mp4-live-LastTime-depRep-R2-0001.mp4 rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R2-0001_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R2-0002.json (55%) create mode 100644 data/file_features/published/nalu/svc/mp4-live-LastTime-depRep-R2-0002.mp4 rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R2-0002_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R2-0003.json (55%) create mode 100644 data/file_features/published/nalu/svc/mp4-live-LastTime-depRep-R2-0003.mp4 rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R2-0003_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R3-0001.json (55%) create mode 100644 data/file_features/published/nalu/svc/mp4-live-LastTime-depRep-R3-0001.mp4 rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R3-0001_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R3-0002.json (55%) create mode 100644 data/file_features/published/nalu/svc/mp4-live-LastTime-depRep-R3-0002.mp4 rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R3-0002_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R3-0003.json (55%) create mode 100644 data/file_features/published/nalu/svc/mp4-live-LastTime-depRep-R3-0003.mp4 rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep-R3-0003_gpac.json (99%) rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep.json (57%) create mode 100644 data/file_features/published/nalu/svc/mp4-live-LastTime-depRep.mp4 rename {file_features => data/file_features}/published/nalu/svc/mp4-live-LastTime-depRep_gpac.json (99%) rename {file_features => data/file_features}/published/uvvu/Solekai002_1280_23_1x1_v7clear.json (55%) create mode 100644 data/file_features/published/uvvu/Solekai002_1280_23_1x1_v7clear.uvvu rename {file_features => data/file_features}/published/uvvu/Solekai002_1280_23_1x1_v7clear_gpac.json (99%) rename {file_features => data/file_features}/published/uvvu/Solekai007_1920_29_1x1_v7clear.json (56%) create mode 100644 data/file_features/published/uvvu/Solekai007_1920_29_1x1_v7clear.uvu rename {file_features => data/file_features}/published/uvvu/Solekai007_1920_29_1x1_v7clear_gpac.json (99%) create mode 100644 data/rules/hierarchy.json create mode 100644 data/schemas/file-metadata.schema.json create mode 100644 data/schemas/gpac-extension.schema.json create mode 100644 data/schemas/spec-info.schema.json create mode 100644 data/schemas/standard.schema.json create mode 100644 data/schemas/user-defined.schema.json rename {standard_features => data/standard_features}/14496-12/boxes.json (80%) rename {standard_features => data/standard_features}/14496-12/entity_groups.json (83%) rename {standard_features => data/standard_features}/14496-12/item_properties.json (82%) rename {standard_features => data/standard_features}/14496-12/item_references.json (93%) rename {standard_features => data/standard_features}/14496-12/sample_groups.json (87%) create mode 100644 data/standard_features/14496-12/spec_info.json rename {standard_features => data/standard_features}/14496-12/track_groups.json (81%) rename {standard_features => data/standard_features}/14496-12/track_references.json (86%) rename {standard_features => data/standard_features}/14496-12/user_defined.json (99%) create mode 100644 data/standard_features/14496-14/spec_info.json rename {standard_features => data/standard_features}/14496-14/user_defined.json (99%) rename {standard_features => data/standard_features}/14496-15/boxes.json (77%) create mode 100644 data/standard_features/14496-15/codecs.json rename {standard_features => data/standard_features}/14496-15/entity_groups.json (91%) rename {standard_features => data/standard_features}/14496-15/sample_groups.json (90%) create mode 100644 data/standard_features/14496-15/spec_info.json rename {standard_features => data/standard_features}/14496-15/track_groups.json (89%) rename {standard_features => data/standard_features}/14496-15/track_references.json (86%) rename {standard_features => data/standard_features}/14496-15/user_defined.json (89%) create mode 100644 data/standard_features/14496-30/boxes.json create mode 100644 data/standard_features/14496-30/spec_info.json rename {standard_features => data/standard_features}/23008-12/boxes.json (85%) rename {standard_features => data/standard_features}/23008-12/entity_groups.json (86%) rename {standard_features => data/standard_features}/23008-12/item_properties.json (86%) rename {standard_features => data/standard_features}/23008-12/item_references.json (93%) rename {standard_features => data/standard_features}/23008-12/sample_groups.json (87%) create mode 100644 data/standard_features/23008-12/spec_info.json create mode 100644 data/standard_features/README.md delete mode 100644 file_features/README.md delete mode 100644 file_features/published/heif/C002.json delete mode 100644 file_features/published/heif/C003.json delete mode 100644 file_features/published/heif/C004.json delete mode 100644 file_features/published/heif/C006.json delete mode 100644 file_features/published/heif/C007.json delete mode 100644 file_features/published/heif/C008.json delete mode 100644 file_features/published/heif/C009.json delete mode 100644 file_features/published/heif/C010.json delete mode 100644 file_features/published/heif/C011.json delete mode 100644 file_features/published/heif/C012.json delete mode 100644 file_features/published/heif/C013.json delete mode 100644 file_features/published/heif/C017.json delete mode 100644 file_features/published/heif/C018.json delete mode 100644 file_features/published/heif/C019.json delete mode 100644 file_features/published/heif/C020.json delete mode 100644 file_features/published/heif/C022.json delete mode 100644 file_features/published/heif/C023.json delete mode 100644 file_features/published/heif/C024.json delete mode 100644 file_features/published/heif/C025.json delete mode 100644 file_features/published/heif/C026.json delete mode 100644 file_features/published/heif/C027.json delete mode 100644 file_features/published/heif/C028.json delete mode 100644 file_features/published/heif/C031.json delete mode 100644 file_features/published/heif/C032.json delete mode 100644 file_features/published/heif/C033.json delete mode 100644 file_features/published/heif/C033_gpac.json delete mode 100644 file_features/published/heif/C034.json delete mode 100644 file_features/published/heif/C040.json delete mode 100644 file_features/published/heif/multilayer001.json delete mode 100644 file_features/published/heif/multilayer002.json delete mode 100644 file_features/published/heif/multilayer003.json delete mode 100644 file_features/published/heif/multilayer004.json delete mode 100644 file_features/published/heif/multilayer005.json delete mode 100644 file_features/published/isobmff/FX-VY-9436R.3_qhd.json delete mode 100644 file_features/published/nalu/hevc/hev1_clg1_header.json delete mode 100644 file_features/under_consideration/VVC/vvc_basic_track.json delete mode 100644 file_features/under_consideration/VVC/vvc_basic_track_gpac.json delete mode 100644 file_features/under_consideration/VVC/vvc_mixed_nal_subpicture_tracks.json delete mode 100644 file_features/under_consideration/VVC/vvc_mixed_nal_subpicture_tracks_gpac.json delete mode 100644 file_features/under_consideration/VVC/vvc_subpicture_tracks.json delete mode 100644 file_features/under_consideration/VVC/vvc_subpicture_tracks_gpac.json delete mode 100644 file_features/under_consideration/VVC/vvc_subpicture_tracks_spor_ordered.json delete mode 100644 file_features/under_consideration/VVC/vvc_subpicture_tracks_spor_ordered_gpac.json delete mode 100644 file_features/under_consideration/VVC/vvc_substitute_subpictures_single_sample_track.json delete mode 100644 file_features/under_consideration/VVC/vvc_substitute_subpictures_single_sample_track_gpac.json delete mode 100644 file_features/under_consideration/VVC/vvc_substitute_subpictures_track.json delete mode 100644 file_features/under_consideration/VVC/vvc_substitute_subpictures_track_gpac.json delete mode 100644 file_features/under_consideration/cenc/audio_cbcs.json delete mode 100644 file_features/under_consideration/cenc/audio_cbcs_const_iv.json delete mode 100644 file_features/under_consideration/cenc/audio_cbcs_const_iv_gpac.json delete mode 100644 file_features/under_consideration/cenc/audio_cbcs_gpac.json delete mode 100644 file_features/under_consideration/cenc/audio_cenc_128iv.json delete mode 100644 file_features/under_consideration/cenc/audio_cenc_128iv_gpac.json delete mode 100644 file_features/under_consideration/cenc/image_cbc1.json delete mode 100644 file_features/under_consideration/cenc/image_cbcs.json delete mode 100644 file_features/under_consideration/cenc/image_cbcs_const_iv.json delete mode 100644 file_features/under_consideration/cenc/image_cbcs_const_iv_roll.json delete mode 100644 file_features/under_consideration/cenc/image_cbcs_mkey_const_iv_subs.json delete mode 100644 file_features/under_consideration/cenc/image_cenc_128iv.json delete mode 100644 file_features/under_consideration/cenc/image_cenc_64iv.json delete mode 100644 file_features/under_consideration/cenc/image_cenc_mkey_base.json delete mode 100644 file_features/under_consideration/cenc/image_cenc_mkey_roll.json delete mode 100644 file_features/under_consideration/cenc/image_cenc_mkey_subs.json delete mode 100644 file_features/under_consideration/cenc/image_cenc_roll.json delete mode 100644 file_features/under_consideration/cenc/image_cens_128iv.json delete mode 100644 file_features/under_consideration/cenc/image_cens_64iv.json delete mode 100644 file_features/under_consideration/cenc/video_cbc1.json delete mode 100644 file_features/under_consideration/cenc/video_cbc1_gpac.json delete mode 100644 file_features/under_consideration/cenc/video_cbcs.json delete mode 100644 file_features/under_consideration/cenc/video_cbcs_const_iv.json delete mode 100644 file_features/under_consideration/cenc/video_cbcs_const_iv_gpac.json delete mode 100644 file_features/under_consideration/cenc/video_cbcs_const_iv_roll.json delete mode 100644 file_features/under_consideration/cenc/video_cbcs_const_iv_roll_frag1s.json delete mode 100644 file_features/under_consideration/cenc/video_cbcs_const_iv_roll_frag1s_gpac.json delete mode 100644 file_features/under_consideration/cenc/video_cbcs_const_iv_roll_gpac.json delete mode 100644 file_features/under_consideration/cenc/video_cbcs_gpac.json delete mode 100644 file_features/under_consideration/cenc/video_cbcs_mkey_const_iv_subs.json delete mode 100644 file_features/under_consideration/cenc/video_cenc_128iv.json delete mode 100644 file_features/under_consideration/cenc/video_cenc_128iv_gpac.json delete mode 100644 file_features/under_consideration/cenc/video_cenc_64iv.json delete mode 100644 file_features/under_consideration/cenc/video_cenc_64iv_gpac.json delete mode 100644 file_features/under_consideration/cenc/video_cenc_mkey_base.json delete mode 100644 file_features/under_consideration/cenc/video_cenc_mkey_roll.json delete mode 100644 file_features/under_consideration/cenc/video_cenc_mkey_subs.json delete mode 100644 file_features/under_consideration/cenc/video_cenc_roll.json delete mode 100644 file_features/under_consideration/cenc/video_cenc_roll_frag1s.json delete mode 100644 file_features/under_consideration/cenc/video_cenc_roll_frag1s_gpac.json delete mode 100644 file_features/under_consideration/cenc/video_cenc_roll_gpac.json delete mode 100644 file_features/under_consideration/cenc/video_cens_128iv.json delete mode 100644 file_features/under_consideration/cenc/video_cens_128iv_gpac.json delete mode 100644 file_features/under_consideration/cenc/video_cens_64iv.json delete mode 100644 file_features/under_consideration/cenc/video_cens_64iv_gpac.json delete mode 100644 file_features/under_consideration/comp/comp_all_otyp.json delete mode 100644 file_features/under_consideration/comp/comp_all_otyp_gpac.json delete mode 100644 file_features/under_consideration/comp/comp_moof_nobrand.json delete mode 100644 file_features/under_consideration/comp/comp_moof_nobrand_gpac.json delete mode 100644 file_features/under_consideration/comp/comp_moof_otyp.json delete mode 100644 file_features/under_consideration/comp/comp_moof_otyp_gpac.json delete mode 100644 file_features/under_consideration/comp/comp_moof_sidx_otyp.json delete mode 100644 file_features/under_consideration/comp/comp_moof_sidx_otyp_gpac.json delete mode 100644 file_features/under_consideration/comp/comp_moof_sidx_ssix_otyp.json delete mode 100644 file_features/under_consideration/comp/comp_moof_sidx_ssix_otyp_gpac.json delete mode 100644 file_features/under_consideration/comp/comp_moov_isoc.json delete mode 100644 file_features/under_consideration/comp/comp_moov_isoc_gpac.json delete mode 100644 file_features/under_consideration/comp/comp_moov_otyp.json delete mode 100644 file_features/under_consideration/comp/comp_moov_otyp_gpac.json delete mode 100644 file_features/under_consideration/compact_sample_groups/samplegroups_defrag_compact.json delete mode 100644 file_features/under_consideration/compact_sample_groups/samplegroups_defrag_compact_gpac.json delete mode 100644 file_features/under_consideration/compact_sample_groups/samplegroups_defrag_normal.json delete mode 100644 file_features/under_consideration/compact_sample_groups/samplegroups_defrag_normal_gpac.json delete mode 100644 file_features/under_consideration/compact_sample_groups/samplegroups_fragmented.json delete mode 100644 file_features/under_consideration/compact_sample_groups/samplegroups_fragmented_gpac.json delete mode 100644 html/.browserslistrc delete mode 100644 html/.editorconfig delete mode 100644 html/.eslintrc.js delete mode 100644 html/README.md delete mode 100644 html/babel.config.js delete mode 100644 html/package-lock.json delete mode 100644 html/package.json delete mode 100644 html/public/favicon.ico delete mode 100644 html/public/index.html delete mode 100644 html/src/App.vue delete mode 100644 html/src/assets/logo.png delete mode 100644 html/src/components/HelloWorld.vue delete mode 100644 html/src/main.js delete mode 100644 html/src/router/index.js delete mode 100644 html/src/store/index.js delete mode 100644 html/src/views/About.vue delete mode 100644 html/src/views/Home.vue create mode 100644 src/.gitignore delete mode 100644 src/README.md create mode 100644 src/common/__init__.py create mode 100644 src/construct/boxes.py create mode 100644 src/construct/construct_all.py create mode 100644 src/construct/coverage.py create mode 100644 src/construct/dictionary.py create mode 100644 src/construct/files.py create mode 100644 src/construct/hierarchy.py delete mode 100644 src/feature-extractor/README.rst delete mode 100644 src/feature-extractor/feature_extractor/__init__.py delete mode 100644 src/feature-extractor/feature_extractor/file_features.py delete mode 100644 src/feature-extractor/feature_extractor/spec_features.py delete mode 100644 src/feature-extractor/poetry.lock delete mode 100644 src/feature-extractor/pyproject.toml delete mode 100644 src/feature-extractor/tests/__init__.py delete mode 100644 src/feature-extractor/tests/test_feature_extractor.py create mode 100644 src/feature_extractor/file_features.py create mode 100644 src/feature_extractor/get_sections.py create mode 100644 src/feature_extractor/spec_features.py rename src/{feature-extractor => }/feature_extractor/utils.py (55%) create mode 100644 src/poetry.lock create mode 100644 src/pyproject.toml create mode 100644 src/tests/__mocks__/test_boxes.json create mode 100644 src/tests/test_files.py create mode 100644 src/tests/test_hiearchy.py create mode 100644 src/tests/test_validate.py delete mode 100644 standard_features/14496-15/item_properties.json delete mode 100644 standard_features/14496-15/item_references.json delete mode 100644 standard_features/14496-30/boxes.json delete mode 100644 standard_features/14496-30/entity_groups.json delete mode 100644 standard_features/14496-30/item_properties.json delete mode 100644 standard_features/14496-30/item_references.json delete mode 100644 standard_features/14496-30/sample_groups.json delete mode 100644 standard_features/14496-30/track_groups.json delete mode 100644 standard_features/14496-30/track_references.json delete mode 100644 standard_features/23008-12/track_groups.json delete mode 100644 standard_features/23008-12/track_references.json delete mode 100644 standard_features/README.md diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..cff09b7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +data/file_features/**/* filter=lfs diff=lfs merge=lfs -text +data/file_features/**/*.json !filter !diff !merge text +data/file_features/**/*.md !filter !diff !merge text +data/file_features/.cfignore !filter !diff !merge text diff --git a/.github/ISSUE_TEMPLATE/conformance-file-bug.md b/.github/ISSUE_TEMPLATE/conformance-file-bug.md deleted file mode 100644 index 2c2cc63..0000000 --- a/.github/ISSUE_TEMPLATE/conformance-file-bug.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -name: Conformance file bug -about: Use this template if something is wrong with conformance files -title: '' -labels: conformance issue -assignees: '' - ---- - -## Summary - -Provide a description of the problem. What is wrong in the files? - -## Steps to reproduce - -1. What steps do we need to follow to see the problem with our own eyes? -2. ... - -## Affected specifications - -- provide a list of specs which are relevant for this issue. - -## Affected files - -- Provide the [files](https://conformance.mpeg.expert/ISOBMFF/) like this. diff --git a/.github/ISSUE_TEMPLATE/conformance-file-bug.yml b/.github/ISSUE_TEMPLATE/conformance-file-bug.yml new file mode 100644 index 0000000..228f6f9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/conformance-file-bug.yml @@ -0,0 +1,52 @@ +name: 🔥 Conformance File Bug +description: Use this template if something is wrong with conformance files +title: "[Conformance] " +labels: ["conformance-file"] +body: + - type: markdown + attributes: + value: | + Thank you for reporting a bug in the conformance files. + Please fill out the following template to help us reproduce the issue. + + - type: textarea + id: summary + attributes: + label: Summary + description: Provide a description of the problem. What is wrong in the files? + placeholder: "File `foo.mp4` has a wrong value for `bar`" + validations: + required: true + + - type: textarea + id: steps-to-reproduce + attributes: + label: Steps to reproduce + description: What steps do we need to follow to see the problem with our own eyes? + placeholder: | + 1. Download file `foo.mp4` + 2. ... + validations: + required: true + + - type: textarea + id: affected-specifications + attributes: + label: Affected specifications + description: Provide a list of specs which are relevant for this issue. + placeholder: | + - ISO/IEC 14496-12 + - ISO/IEC 14496-15 + validations: + required: true + + - type: textarea + id: affected-files + attributes: + label: Affected files + description: Provide the files like this. + placeholder: | + - [file1.mp4](./data/file_features/published/isobmff/file1.mp4) + - [file2.mp4](./data/file_features/published/isobmff/file2.mp4) + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/page-bug.yml b/.github/ISSUE_TEMPLATE/page-bug.yml new file mode 100644 index 0000000..627bfb0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/page-bug.yml @@ -0,0 +1,31 @@ +name: 🌎 Website Bug +description: Use this template if something is wrong with the website. This may include visual bugs, typos, broken links, etc. +title: "[Website] " +labels: ["website"] +body: + - type: markdown + attributes: + value: | + Thank you for reporting a bug in the website. + Please fill out the following template to help us reproduce the issue. + If you can attach a video or screenshot, that would be great! + + - type: textarea + id: summary + attributes: + label: Summary + description: Provide a description of the problem. What is wrong on the website? + placeholder: "The search bar is not working" + validations: + required: true + + - type: textarea + id: steps-to-reproduce + attributes: + label: Steps to reproduce + description: What steps do we need to follow to see the problem with our own eyes? + placeholder: | + 1. Open the website + 2. Click on the link to the specification + validations: + required: true diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..f90b3df --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "npm" + directory: "/conformance-search" + schedule: + interval: "weekly" + - package-ecosystem: "pip" + directory: "/src" + schedule: + interval: "weekly" diff --git a/.github/problem-matchers.json b/.github/problem-matchers.json new file mode 100644 index 0000000..2bdd41d --- /dev/null +++ b/.github/problem-matchers.json @@ -0,0 +1,23 @@ +{ + "problemMatcher": [ + { + "owner": "pytest", + "pattern": [ + { + "regexp": "^(FAILURE):\\s(.+)$", + "message": 2 + } + ] + }, + { + "owner": "loguru", + "pattern": [ + { + "regexp": "(ERROR|WARNING).*\\|.+(?:\\[3[13]m.\\[1m)(?:(.*).\\[0m)$", + "severity": 1, + "message": 2 + } + ] + } + ] +} diff --git a/.github/workflows/cfc.yml b/.github/workflows/cfc.yml new file mode 100644 index 0000000..8c4f167 --- /dev/null +++ b/.github/workflows/cfc.yml @@ -0,0 +1,105 @@ +name: Conformance File Contribution + +on: + workflow_call: + +jobs: + create-ff: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.ref }} + + - name: Setup Node + uses: actions/setup-node@v3 + + - name: Install poetry + run: pipx install poetry + + - uses: actions/setup-python@v4 + with: + python-version: "3.11" + cache: "poetry" + + - name: Install dependencies + working-directory: ./src + run: | + poetry env use "3.11" + poetry install --no-interaction + + - name: Restore GPAC Cache + uses: actions/cache/restore@v3 + with: + path: /tmp/gpac + key: ${{ runner.os }}-gpac- + restore-keys: ${{ runner.os }}-gpac- + + - name: Setup MP4Box + run: | + mkdir -p $HOME/.gpac + mkdir -p $HOME/.local/bin + touch $HOME/.gpac/creds.key + cp -r /tmp/gpac/ $HOME/.local/bin + echo "$HOME/.local/bin" >> $GITHUB_PATH + + - name: Configure GitHub handle + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + + - name: Create LFS file list + id: lfs-id + run: | + echo "lfs-id=$(git lfs ls-files --long | cut -d ' ' -f1 | sort \ + | sha256sum | cut -d ' ' -f1)" >> $GITHUB_OUTPUT + + - name: LFS Cache + uses: actions/cache@v3 + with: + path: .git/lfs/objects + key: ${{ runner.os }}-lfs-${{ steps.lfs-id.outputs.lfs-id }} + restore-keys: ${{ runner.os }}-lfs- + + - name: Git LFS Pull + run: git lfs pull + + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v37 + + - name: List all changed files + run: | + for file in ${{ steps.changed-files.outputs.all_changed_files }}; do + echo "$file was changed" + done + + - name: Install Prettier + run: npm install -g prettier + + - name: Create File Features + working-directory: ./src + run: | + for file in ${{ steps.changed-files.outputs.all_changed_files }}; do + if [[ $file == *.json ]]; then + continue + fi + if [[ $file == *"data/file_features/under_consideration/"* ]]; then + echo "Creating file features for $file" + poetry run extract-file-features -m -i ../$file + dir=$(realpath $(dirname ../$file)) + prettier --parser json $dir/*.json --write + fi + done + + - name: Commit File Features + run: | + git add data/file_features/under_consideration + if ! git diff-index --quiet HEAD --; then + git commit -m "Add file features for ${{ github.event.pull_request.head.ref }}" + fi + + - name: Push changes + run: git push origin HEAD:${{ github.event.pull_request.head.ref }} diff --git a/.github/workflows/gpac.yml b/.github/workflows/gpac.yml new file mode 100644 index 0000000..76aa546 --- /dev/null +++ b/.github/workflows/gpac.yml @@ -0,0 +1,36 @@ +name: Build MP4Box + +on: + workflow_dispatch: + schedule: + - cron: "0 0 * * *" + +jobs: + gpac: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + repository: gpac/gpac + + - name: Get latest commit + id: get-latest-commit + run: | + echo "latest-commit=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT + + - name: GPAC Cache + id: gpac-cache + uses: actions/cache@v3 + with: + path: /tmp/gpac + key: ${{ runner.os }}-gpac-${{ steps.get-latest-commit.outputs.latest-commit }} + + - name: GPAC Build + if: steps.gpac-cache.outputs.cache-hit != 'true' + run: | + sudo apt-get install -y build-essential pkg-config git zlib1g-dev + ./configure --static-bin + make -j$(nproc) + mkdir -p /tmp/gpac + cp -r bin/gcc/ /tmp/gpac diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 0000000..6b1191f --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,64 @@ +name: Pull Request Checks + +on: + pull_request: + types: + - opened + - synchronize + - reopened + - labeled + - unlabeled + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + changes: + runs-on: ubuntu-latest + outputs: + is-cfc: ${{ steps.check-cfc.outputs.is_cfc }} + is-page: ${{ steps.check-page.outputs.is_page }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v37 + + - name: Check for new under consideration files + id: check-cfc + run: | + for file in ${{ steps.changed-files.outputs.all_changed_files }}; do + if [[ $file == *"data/file_features/under_consideration/"* ]]; then + echo "is_cfc=true" >> $GITHUB_OUTPUT + break + fi + done + + - name: Check for changes to the page + id: check-page + run: | + for file in ${{ steps.changed-files.outputs.all_changed_files }}; do + if [[ $file == *"conformance-search/"* ]]; then + echo "is_page=true" >> $GITHUB_OUTPUT + break + fi + done + + cfc: + needs: changes + if: | + contains(github.event.pull_request.labels.*.name, 'conformance-file') && + needs.changes.outputs.is-cfc == 'true' + uses: ./.github/workflows/cfc.yml + + test: + needs: [changes, cfc] + if: | + always() && + (needs.cfc.result == 'success' || needs.cfc.result == 'skipped') + uses: ./.github/workflows/test.yml + with: + test-page: ${{ needs.changes.outputs.is-page == 'true' }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..f7921e1 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,100 @@ +name: Build and Publish + +on: + push: + branches: [main] + paths: + - ".github/workflows/**" + - "conformance-search/**" + - "src/**" + - "data/**" + - "!data/**/*.md" + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + test: + uses: ./.github/workflows/test.yml + with: + upload: true + + publish: + needs: test + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Download output + uses: actions/download-artifact@v3 + with: + name: output + path: ./src/output + + - name: Setup Pages + uses: actions/configure-pages@v2 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 19 + + - name: Install dependencies + working-directory: conformance-search + run: npm ci + + - name: Create LFS file list + id: lfs-id + run: | + echo "lfs-id=$(git lfs ls-files --long | cut -d ' ' -f1 | sort \ + | sha256sum | cut -d ' ' -f1)" >> $GITHUB_OUTPUT + + - name: LFS Cache + uses: actions/cache@v3 + with: + path: .git/lfs/objects + key: ${{ runner.os }}-lfs-${{ steps.lfs-id.outputs.lfs-id }} + restore-keys: ${{ runner.os }}-lfs- + + - name: Git LFS Pull + run: git lfs pull + + - name: Copy LFS files to public folder + run: | + files=$(git lfs ls-files --long | cut -d ' ' -f3) + for file in $files; do + dir=$(dirname ${file#*/*/}) + mkdir -p ./conformance-search/public/files/$dir + cp $file ./conformance-search/public/files/${file#*/*/} + done + + - name: Check data size + run: | + dsize=$(du -sm ./conformance-search/public | cut -f1) + if [ $dsize -gt 1000 ]; then + echo "FAILURE: Data size is $dsize MB, which is larger than the 1 GB limit." + exit 1 + fi + + - name: Build + working-directory: conformance-search + run: | + npm run copy:data + npm run build + + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + path: ./conformance-search/dist + + - name: Deploy to GitHub Pages + uses: actions/deploy-pages@v1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..efad8a1 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,104 @@ +name: Test + +on: + workflow_call: + inputs: + upload: + default: false + required: false + type: boolean + test-page: + default: true + required: false + type: boolean + +permissions: + contents: read + id-token: write + +concurrency: + group: ${{ github.ref }} + +jobs: + format: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node + uses: actions/setup-node@v3 + + - name: Check format of JSON files + run: npx -y prettier --check --parser json "data/**/*.json" + + page: + runs-on: ubuntu-latest + if: inputs.test-page + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 19 + + - name: Install dependencies + working-directory: conformance-search + run: npm ci + + - name: Test page + working-directory: conformance-search + run: | + npm run test:ci + npm run prebuild + + data: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install poetry + run: pipx install poetry + + - uses: actions/setup-python@v4 + with: + python-version: "3.11" + cache: "poetry" + + - name: Install dependencies + working-directory: ./src + run: | + poetry env use "3.11" + poetry install --no-interaction + + - name: Add pattern matcher + run: echo "::add-matcher::${{ github.workspace }}/.github/problem-matchers.json" + + - name: Run construct + working-directory: ./src + run: poetry run construct-all + + - name: Run coverage + working-directory: ./src + run: poetry run coverage + + - name: Check output + run: | + if [ -s /tmp/construct.log ]; then + exit 1 + fi + + - name: Validate output + working-directory: ./src + run: poetry run pytest -- --check-max-tb=0 + + - name: Upload output + if: inputs.upload + uses: actions/upload-artifact@v3 + with: + name: output + path: ./src/output + retention-days: 1 diff --git a/.gitignore b/.gitignore index c15f5ca..132b814 100644 --- a/.gitignore +++ b/.gitignore @@ -1,30 +1,7 @@ -#################################################################################################### -# Generic -#################################################################################################### -*.html -*.mp4 -*.mp4m -*.m4s -*.iso3 -*.paf -*.heic -*.3gp -*.3gs -*.uvvu -*.uvu -*.xlsx -*.csv -*.docx -*.doc -*.xml -mp4ra/ -temp/ -Part32-FF_Conformance/ -test_input/ - -#################################################################################################### -# macOS -#################################################################################################### +# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,python,node,macos +# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,python,node,macos + +### macOS ### # General .DS_Store .AppleDouble @@ -33,6 +10,7 @@ test_input/ # Icon must end with two \r Icon + # Thumbnails ._* @@ -52,23 +30,151 @@ Network Trash Folder Temporary Items .apdisk -#################################################################################################### -# Visual Studio Code -#################################################################################################### -.vscode/* -*.code-workspace +### macOS Patch ### +# iCloud generated files +*.icloud -# Local History for Visual Studio Code -.history/ +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache -#################################################################################################### -# IntelliJ -#################################################################################################### -.idea/* +# Next.js build output +.next +out -#################################################################################################### -# PYTHON -#################################################################################################### +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### Python ### # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -85,8 +191,6 @@ dist/ downloads/ eggs/ .eggs/ -lib/ -lib64/ parts/ sdist/ var/ @@ -113,7 +217,6 @@ htmlcov/ .nox/ .coverage .coverage.* -.cache nosetests.xml coverage.xml *.cover @@ -127,7 +230,6 @@ cover/ *.pot # Django stuff: -*.log local_settings.py db.sqlite3 db.sqlite3-journal @@ -165,7 +267,22 @@ ipython_config.py # install all needed dependencies. #Pipfile.lock -# PEP 582; used by e.g. github.com/David-OConnor/pyflow +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm __pypackages__/ # Celery stuff @@ -176,7 +293,6 @@ celerybeat.pid *.sage.py # Environments -.env .venv env/ venv/ @@ -207,3 +323,41 @@ dmypy.json # Cython debug symbols cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,python,node,macos \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..3de8d2e --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "ms-python.black-formatter", + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint" + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5d380a1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,21 @@ +{ + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter" + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "eslint.workingDirectories": [ + { + "directory": "./conformance-search", + "changeProcessCWD": true + } + ], + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "eslint.validate": [ + "javascript" + ], +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9ba929d..3d304b5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,15 +1,56 @@ -# How to contribute new files to conformance suite +# How to contribute to this resository -## 1. Install required tools +## 1. How to contribute new conformance files (for file contributors) + +In order to contribute new conformance files to the framework the contributor needs to follow these steps: + +- Make sure files are **small in size**. Only file format features are of interest. Follow the best practices to reduce the file size, e.g. for video use small resolution etc. +- Don't use spaces in folders or filenames. +- Bring an input contribution to MPEG which describes the files you are contributing. + - For each file there **shall** be the following information: + - Short description of the file. + - Copyright information + - For each file there _should_ be the following information + - List of user defined features taken from specifications. E.g. ISOBMFF [user_defined.json](./data/standard_features/14496-12/user_defined.json) + - Associated files (if applicable). These are files which are required for processing of the conformance file. +- Upload files (either in a zip together with the contribution or by providing a URL which can be used to obtain the files). + +During the MPEG meeting the File Format group will collect and review the files and open a pull request to the conformance repository using the above information. After opening the PR, automation scripts will run GPAC's MP4Box and export the metadata from each file into a JSON with a suffix `_gpac.json`. + +Because the MP4Box will not be able to parse new features which are currently being standardized, the contributor of the files will need to provide additional information about features / boxes the files are containing. This step comes after the PR has been opened for the conformance files to be contributed. The contributor has to follow these steps to appropriately fix the possible issues with the MP4Box’s output: + +- Checkout the branch associated with the contributor’s PR +- For each contribution’s MP4Box extension file (suffix with `_gpac.ext.json`) + - If the file does not exist, then there wasn't any unknown boxes found in the file. If you are modifying a known box then crete the file manually and add the box to the extension file. + - Go through all the unknown boxes and provide the structure of that box and its descedants. + - If a node is not related to your contribution, you can just skip it. + - Add the relevant boxes to the standard features as well. Without that this contribution wouldn't be shown in the conformance search tool. +- If necessary for each conformance metadata file `.json` add or edit other fields. In particular check `associated_files`, `features`, `license` or add additional information to `notes`. +- Commit and push your modifications to that branch. +- CI scripts will validate the structure of the file and run tests to see if it’s okay to use it. + +The PR will be accepted after all edits are done to completely describe conformance files in the associated PR. When the File Format group decides the file should be published, the published flag will be changed to true and the file will move from [under_consideration](./data/file_features/under_consideration/) directory to a [published](./data/file_features/published/) directory. + +## 2. How to open a new PR for new conformance files + +This is most likely a task of a conformance coordinator or a File Format Group Chair. + +### 2.1 Install required tools (first time use) - install [python-poetry](https://python-poetry.org/docs/) - install [GPAC](https://gpac.wp.imt.fr/downloads/gpac-nightly-builds/) Make sure both are added to your `PATH` environment variable, so you can call `poetry` and `MP4Box` from any directory using terminal. -## 2. Prepare your files +### 2.2 Prepare new branch + +- Create a new branch: + The best practice is to name the branch including the MPEG document number which was used to provide an input contribution to MPEG e.g. `m12345_isobmff_samplegroups`. +- Checkout this new branch. -Put all the files you want to contribute into a single directory (sub-directories are also allowed). E.g.: +### 2.3 Initialize file features json files + +Let's say you have gathered files from an input contribution `m12345` in a folder like (sub-directories are also allowed): ```shell compact_sample_groups @@ -18,28 +59,26 @@ compact_sample_groups └── samplegroups_fragmeted.mp4 ``` -Also upload this folder to MPEG **conformance** file server under `/MPEG-04/Part32-FF_Conformance/under_consideration`. - -## 3. Initialize file features json files +and now you want to add them to a new branch `m12345__` which you already checked out. -Go to feature extractor folder and run the `contribute-files` command: +Go to the `src` folder and run the `contribute-files` command: ```shell -cd src/feature-extractor +cd src poetry install #(if you are using for the first time) -poetry run contribute-files -i +poetry run contribute-files -i ``` -The script will ask you several questions. e.g.: who is the contributor (your company name), ask for a short description of each file and will create (or update) the json files inside `file_features` directory. +The script will ask you several questions. e.g.: who is the contributor (company name), ask for a short description of each file and will create (or update) the json files inside `file_features` directory. -## 4. Add more information (whenever possible) +### 2.4 Create a pull request -You can manually add additional information to generated json files. For example you can edit the following entries: +Create a pull request with the new (or modified) files. -- `associated_files`: provide a list of files related to this file (created from, needed for processing, etc.) -- `features`: list of user-defined features (This should be automatically extracted in the future) -- `notes`: Any other notes which would allow people to understand the conformance files better. +## 3. How to update specifications -## 5. Create a pull request +TBD -Create a pull request with the new (or modified) files. +## 4. How to add new specifications + +TBD diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..147820e --- /dev/null +++ b/LICENSE @@ -0,0 +1,32 @@ +The Clear BSD License + +Copyright (c) 2023, Apple Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted (subject to the limitations in the disclaimer below) provided that +the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or other +materials provided with the distribution. + +Neither the name of the Apple Inc. nor the names of its contributors +may be used to endorse or promote products derived from this software without +specific prior written permission. + +NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS +LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/README.md b/README.md index ac9af03..700b37d 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,37 @@ -# FileFormatConformance +# File Format Conformance Framework -Repository for MPEG File Format Conformance reports +[![Test](https://github.com/MPEGGroup/FileFormatConformance/actions/workflows/test.yml/badge.svg)](https://github.com/MPEGGroup/FileFormatConformance/actions/workflows/test.yml) -TODO: describe repository structure. webpage for public access to conf. files, tools to extract features / file structure, set of features from separate specifications... +## Overview -## Modifying conformance suite +Welcome to the File Format Conformance Framework, a repository dedicated to supporting the conformance resources for specifications developed by the MPEG Systems File Format group. This framework is based on ISO/IEC 14496-32 and contains conformance files for various specifications, such as: -If you want to contribute new files to the conformancee suite, or change existing files, please follow the guidelines in [CONTRIBUTING.md](./CONTRIBUTING.md) \ No newline at end of file +- ISOBMFF: 14496-12 +- MP4: 14496-14 +- NALUFF: 14496-15 +- Text: 14496-30 +- HEIF: 23008-12 + +The main goals for the File Format Conformance Framework are: + +- to provide a way to contribute new files to the conformance suite. +- to manage exising files and gather additional metadata associated with the files. +- to create a dump of the contents of the files by utiilzing automation tools with the ability to add additional information which could not be automatically determined. +- to export all features (e.g. boxes, sample groups, etc.) from our specifications to a json format which we can later use to map conformance files to them which claim to be conformant to these features. +- to utilize automation tools to check for validity of contributed files by checking the metadata extracted from specifications (this metadata includes checking box types, version, flags, location of the boxes, user defined features from specifications which files claim to be conformant to, etc.). + > NOTE: This framework **DOES NOT** validate the conformance of each feature, but rather provides a mapping from contributed files to features that are defined in our specifications. We check for correct box definitions and locations as well as defined versions and flags. +- to automate validation of the registered boxes from [MP4RA](https://mp4ra.org/). +- to provide visualization of exising files and its mapping to specifications, as well as providing a search tool to quickly find files with desired features. +- to visualize the coverage page, which shows how many features can be found in files contributed to the framework. This information is used to understand the current status of the files that we have currently in our suite and how many files we still need to gather to provide example files to every feature defined our specifications. + +Conformance files themselves are stored on [this GitHub repository](https://github.com/MPEGGroup/FileFormatConformance) using the Git Large File Storage (LFS). + +The design of the framework allows for easy extensions to support new specifications and file formats. The addition of new specifications or amendments to the framework is as simple as providing the necessary metadata. + +## Contributing + +We encourage your contributions! If you identify any issues with the metadata or the functionality of this framework or if you can contribute conformance files, feel free to [open an issue](https://github.com/MPEGGroup/FileFormatConformance/issues) or contribute directly to [the project on GitHub](https://github.com/MPEGGroup/FileFormatConformance). Please refer to our [CONTRIBUTING.md](CONTRIBUTING.md) for information on the process for submitting new conformance files to this repository (MPEG Members only). + +## License + +This project operates under the Clear BSD License. For more details, please see our [LICENSE](LICENSE) file. diff --git a/conformance-search/.eslintrc b/conformance-search/.eslintrc new file mode 100644 index 0000000..ff27c47 --- /dev/null +++ b/conformance-search/.eslintrc @@ -0,0 +1,101 @@ +{ + "env": { + "browser": true, + "es2021": true, + "jest/globals": true + }, + "plugins": [ + "vitest", + "react", + "@typescript-eslint", + "prettier", + "tailwindcss", + "jest" + ], + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:@typescript-eslint/recommended", + "plugin:import/typescript", + "airbnb", + "plugin:prettier/recommended", + "plugin:tailwindcss/recommended", + "prettier" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 12, + "sourceType": "module" + }, + "globals": { + "BUILD_TIMESTAMP": true, + "MP4BOX_BASE": true + }, + "rules": { + // Prettier + "prettier/prettier": "error", + // Typescript + "no-bitwise": [ + "error", + { + "allow": [ + "|", + "&" + ] + } + ], + "no-console": [ + "error", + { + "allow": [ + "warn", + "error" + ] + } + ], + "no-use-before-define": "off", + "@typescript-eslint/no-unused-vars": "warn", + // react + "react/react-in-jsx-scope": "off", // React 17 does not require this anymore + "react/jsx-sort-props": "error", + "react/sort-default-props": "error", + "react/jsx-filename-extension": [ + "error", + { + "extensions": [ + ".tsx" + ] + } + ], + // Import + "import/extensions": "off", + "import/no-cycle": [ + "error", + { + "maxDepth": 1 + } + ], + "no-restricted-imports": [ + "error", + { + "patterns": [ + "@/components/*/*" + ] + } + ], + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": true + } + ] + }, + "settings": { + "import/resolver": { + "typescript": {} + } + } +} \ No newline at end of file diff --git a/html/.gitignore b/conformance-search/.gitignore similarity index 60% rename from html/.gitignore rename to conformance-search/.gitignore index 403adbc..1030121 100644 --- a/html/.gitignore +++ b/conformance-search/.gitignore @@ -1,23 +1,27 @@ -.DS_Store -node_modules -/dist - - -# local env files -.env.local -.env.*.local - -# Log files +# Logs +logs +*.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local # Editor directories and files +.vscode/* +!.vscode/extensions.json .idea -.vscode +.DS_Store *.suo *.ntvs* *.njsproj *.sln *.sw? + +# Other +data diff --git a/conformance-search/.prettierrc b/conformance-search/.prettierrc new file mode 100644 index 0000000..eeafde3 --- /dev/null +++ b/conformance-search/.prettierrc @@ -0,0 +1,7 @@ +{ + "semi": true, + "tabWidth": 4, + "printWidth": 100, + "singleQuote": false, + "trailingComma": "none" +} diff --git a/conformance-search/index.html b/conformance-search/index.html new file mode 100644 index 0000000..5fadf3a --- /dev/null +++ b/conformance-search/index.html @@ -0,0 +1,12 @@ + + + + + + Conformance Search Tool + + +
+ + + diff --git a/conformance-search/package-lock.json b/conformance-search/package-lock.json new file mode 100644 index 0000000..64f8954 --- /dev/null +++ b/conformance-search/package-lock.json @@ -0,0 +1,12368 @@ +{ + "name": "conformance-search", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "conformance-search", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mui/material": "^5.14.3", + "clsx": "^2.0.0", + "fuse.js": "^6.6.2", + "github-markdown-css": "^5.2.0", + "hamburger-react": "^2.5.0", + "object-hash": "^3.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^4.10.1", + "react-router-dom": "^6.14.2", + "react-syntax-highlighter": "^15.5.0", + "react-use": "^17.4.0", + "url-join": "^5.0.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^14.0.0", + "@types/lodash": "^4.14.196", + "@types/object-hash": "^3.0.2", + "@types/react": "^18.2.18", + "@types/react-dom": "^18.2.7", + "@types/react-syntax-highlighter": "^15.5.7", + "@typescript-eslint/eslint-plugin": "^6.2.1", + "@typescript-eslint/parser": "^6.2.1", + "@vitejs/plugin-react": "^4.0.4", + "@vitest/coverage-v8": "^0.34.1", + "@vitest/ui": "^0.34.1", + "autoprefixer": "^10.4.14", + "copyfiles": "^2.4.1", + "eslint": "^8.46.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-prettier": "^8.10.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "^2.28.0", + "eslint-plugin-jest": "^27.2.3", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-react": "^7.33.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-tailwindcss": "^3.13.0", + "eslint-plugin-vitest": "^0.2.8", + "jest": "^29.6.2", + "jsdom": "^22.1.0", + "lodash": "^4.17.21", + "postcss": "^8.4.27", + "prettier": "^3.0.1", + "tailwindcss": "^3.3.3", + "typescript": "^5.1.6", + "vite": "^4.4.8", + "vitest": "^0.34.1" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", + "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==", + "dev": true + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.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==", + "dev": true, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "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.2.0" + } + }, + "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/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.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz", + "integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz", + "integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz", + "integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz", + "integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz", + "integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz", + "integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz", + "integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz", + "integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz", + "integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz", + "integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz", + "integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz", + "integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz", + "integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz", + "integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz", + "integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz", + "integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz", + "integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz", + "integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz", + "integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz", + "integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz", + "integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz", + "integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", + "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", + "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/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==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", + "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", + "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.2", + "@jest/reporters": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.2", + "jest-resolve-dependencies": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "jest-watcher": "^29.6.2", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.2", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/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/@jest/core/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", + "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", + "dev": true, + "dependencies": { + "expect": "^29.6.2", + "jest-snapshot": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", + "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", + "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", + "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", + "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", + "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", + "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.2", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", + "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.2", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "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/@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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/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==", + "dev": true + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.9", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.9.tgz", + "integrity": "sha512-gm6gnPnc/lS5Z3neH0iuOrK7IbS02+oh6KsMtXYLhI6bJpHs+PNWFsBmISx7x4FSPVJZvZkb8Bw6pEXpIMFt7Q==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@emotion/is-prop-valid": "^1.2.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.3", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.14.3", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.3.tgz", + "integrity": "sha512-QxvrcDqphZoXRjsAmCaQylmWjC/8/qKWwIde1MJMna5YIst3R9O0qhKRPu36/OE2d8AeTbCVjRcRvNqhhW8jyg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/material": { + "version": "5.14.3", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.3.tgz", + "integrity": "sha512-dlu4SOcCp9Cy+wkcfZ/ns9ZkP40nr/WPgqxX0HmrE0o+dkE1ropY9BbHsLrTlYJCko8yzcC8bLghrD4xqZG1og==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@mui/base": "5.0.0-beta.9", + "@mui/core-downloads-tracker": "^5.14.3", + "@mui/system": "^5.14.3", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.3", + "@types/react-transition-group": "^4.4.6", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/private-theming": { + "version": "5.13.7", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.7.tgz", + "integrity": "sha512-qbSr+udcij5F9dKhGX7fEdx2drXchq7htLNr2Qg2Ma+WJ6q0ERlEqGSBiPiVDJkptcjeVL4DGmcf1wl5+vD4EA==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@mui/utils": "^5.13.7", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", + "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.14.3", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.3.tgz", + "integrity": "sha512-b+C+j9+75+/iIYSa+1S4eCMc9MDNrj9hzWfExJqS2GffuNocRagjBZFyjtMqsLWLxMxQIX8Cg6j0hAioiw+WfQ==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@mui/private-theming": "^5.13.7", + "@mui/styled-engine": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.3", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.14.3", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.3.tgz", + "integrity": "sha512-gZ6Etw+ppO43GYc1HFZSLjwd4DoZoa+RrYTD25wQLfzcSoPjVoC/zZqA2Lkq0zjgwGBQOSxKZI6jfp9uXR+kgw==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pkgr/utils/node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remix-run/router": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz", + "integrity": "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.0.tgz", + "integrity": "sha512-Dffe68pGwI6WlLRYR2I0piIkyole9cSBH5jGQKCGMRpHW5RHCqAUaqc2Kv0tUyd4dU4DLPKhJIjyKOnjv4tuUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/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/@testing-library/dom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@testing-library/dom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/dom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^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/jest-dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@testing-library/jest-dom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.0.0.tgz", + "integrity": "sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "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/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", + "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/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/@types/jest/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@types/js-cookie": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", + "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.196", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.196.tgz", + "integrity": "sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.2.tgz", + "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==", + "dev": true + }, + "node_modules/@types/object-hash": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-3.0.2.tgz", + "integrity": "sha512-tfyXl1JPCf2hzIDK29gO7qGqJjThKBzg/Cn3bA68R9NmWdOx+f7k5mm4to/n43BHspCwcoUC6FU4NpUoK/h9bQ==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/react": { + "version": "18.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.18.tgz", + "integrity": "sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-is": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", + "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-syntax-highlighter": { + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.7.tgz", + "integrity": "sha512-bo5fEO5toQeyCp0zVHBeggclqf5SQ/Z5blfFmjwO5dkMVGPgmiwZsJh9nu/Bo5L7IHTuGWrja6LxJVE2uB5ZrQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.6.tgz", + "integrity": "sha512-FkHXCb+ikSoUP4Y4rOslzTdX5sqYwMxfefKh1GmZ8ce1GOkEHntSp6b5cGadmNfp5e4BMEWOMx+WSKd5/MqlDA==", + "dev": true, + "dependencies": { + "@types/jest": "*" + } + }, + "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/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.1.tgz", + "integrity": "sha512-iZVM/ALid9kO0+I81pnp1xmYiFyqibAHzrqX4q5YvvVEyJqY+e6rfTXSCsc2jUxGNqJqTfFSSij/NFkZBiBzLw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.2.1", + "@typescript-eslint/type-utils": "6.2.1", + "@typescript-eslint/utils": "6.2.1", + "@typescript-eslint/visitor-keys": "6.2.1", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.2.1.tgz", + "integrity": "sha512-Ld+uL1kYFU8e6btqBFpsHkwQ35rw30IWpdQxgOqOh4NfxSDH6uCkah1ks8R/RgQqI5hHPXMaLy9fbFseIe+dIg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.2.1", + "@typescript-eslint/types": "6.2.1", + "@typescript-eslint/typescript-estree": "6.2.1", + "@typescript-eslint/visitor-keys": "6.2.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.2.1.tgz", + "integrity": "sha512-UCqBF9WFqv64xNsIEPfBtenbfodPXsJ3nPAr55mGPkQIkiQvgoWNo+astj9ZUfJfVKiYgAZDMnM6dIpsxUMp3Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.2.1", + "@typescript-eslint/visitor-keys": "6.2.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.2.1.tgz", + "integrity": "sha512-fTfCgomBMIgu2Dh2Or3gMYgoNAnQm3RLtRp+jP7A8fY+LJ2+9PNpi5p6QB5C4RSP+U3cjI0vDlI3mspAkpPVbQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.2.1", + "@typescript-eslint/utils": "6.2.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.1.tgz", + "integrity": "sha512-528bGcoelrpw+sETlyM91k51Arl2ajbNT9L4JwoXE2dvRe1yd8Q64E4OL7vHYw31mlnVsf+BeeLyAZUEQtqahQ==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.1.tgz", + "integrity": "sha512-G+UJeQx9AKBHRQBpmvr8T/3K5bJa485eu+4tQBxFq0KoT22+jJyzo1B50JDT9QdC1DEmWQfdKsa8ybiNWYsi0Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.2.1", + "@typescript-eslint/visitor-keys": "6.2.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.2.1.tgz", + "integrity": "sha512-eBIXQeupYmxVB6S7x+B9SdBeB6qIdXKjgQBge2J+Ouv8h9Cxm5dHf/gfAZA6dkMaag+03HdbVInuXMmqFB/lKQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.2.1", + "@typescript-eslint/types": "6.2.1", + "@typescript-eslint/typescript-estree": "6.2.1", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.1.tgz", + "integrity": "sha512-iTN6w3k2JEZ7cyVdZJTVJx2Lv7t6zFA8DCrJEHD2mwfc16AEvvBWVhbFh34XyG2NORCd0viIgQY1+u7kPI0WpA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.2.1", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", + "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.34.1.tgz", + "integrity": "sha512-lRgUwjTMr8idXEbUPSNH4jjRZJXJCVY3BqUa+LDXyJVe3pldxYMn/r0HMqatKUGTp0Kyf1j5LfFoY6kRqRp7jw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.1.5", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.32.0 <1" + } + }, + "node_modules/@vitest/expect": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.1.tgz", + "integrity": "sha512-q2CD8+XIsQ+tHwypnoCk8Mnv5e6afLFvinVGCq3/BOT4kQdVQmY6rRfyKkwcg635lbliLPqbunXZr+L1ssUWiQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.34.1", + "@vitest/utils": "0.34.1", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.1.tgz", + "integrity": "sha512-YfQMpYzDsYB7yqgmlxZ06NI4LurHWfrH7Wy3Pvf/z/vwUSgq1zLAb1lWcItCzQG+NVox+VvzlKQrYEXb47645g==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.34.1", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.1.tgz", + "integrity": "sha512-0O9LfLU0114OqdF8lENlrLsnn024Tb1CsS9UwG0YMWY2oGTQfPtkW+B/7ieyv0X9R2Oijhi3caB1xgGgEgclSQ==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/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/@vitest/snapshot/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/snapshot/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@vitest/spy": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.1.tgz", + "integrity": "sha512-UT4WcI3EAPUNO8n6y9QoEqynGGEPmmRxC+cLzneFFXpmacivjHZsNbiKD88KUScv5DCHVDgdBsLD7O7s1enFcQ==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-0.34.1.tgz", + "integrity": "sha512-bwmkgMjDcMr3pg0UXLwfwZ/WI1fq2N+5DUisqHkY9bvnNRnpT6QiewtSS/VhmN61ixgNpSKbEGVboml2GLuxfA==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.34.1", + "fast-glob": "^3.3.0", + "fflate": "^0.8.0", + "flatted": "^3.2.7", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.30.1 <1" + } + }, + "node_modules/@vitest/utils": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.1.tgz", + "integrity": "sha512-/ql9dsFi4iuEbiNcjNHQWXBum7aL8pyhxvfnD9gNtbjR9fUKAjxhj4AA3yfLXg6gJpMGGecvtF8Au2G9y3q47Q==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/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/@vitest/utils/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@xobotyi/scrollbar-width": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", + "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "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/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==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.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==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "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==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "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==", + "dev": true + }, + "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/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "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/axe-core": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", + "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-jest": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", + "integrity": "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.6.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/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==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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/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==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001515", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", + "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/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-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/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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/chokidar/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "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-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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/cosmiconfig/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/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "dependencies": { + "hyphenate-style-name": "^1.0.3" + } + }, + "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/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "dev": true, + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/dedent": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.3.0.tgz", + "integrity": "sha512-7glNLfvdsMzZm3FpRY1CHuI2lbYDR+71YmrhmTZjYFD5pfT0ACgnGRdrrC9Mk2uICnzkcdelCx5at787UDGOvg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", + "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.0", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/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/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "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/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "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/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.457", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz", + "integrity": "sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "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==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz", + "integrity": "sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "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-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "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==", + "dev": true + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz", + "integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.11", + "@esbuild/android-arm64": "0.18.11", + "@esbuild/android-x64": "0.18.11", + "@esbuild/darwin-arm64": "0.18.11", + "@esbuild/darwin-x64": "0.18.11", + "@esbuild/freebsd-arm64": "0.18.11", + "@esbuild/freebsd-x64": "0.18.11", + "@esbuild/linux-arm": "0.18.11", + "@esbuild/linux-arm64": "0.18.11", + "@esbuild/linux-ia32": "0.18.11", + "@esbuild/linux-loong64": "0.18.11", + "@esbuild/linux-mips64el": "0.18.11", + "@esbuild/linux-ppc64": "0.18.11", + "@esbuild/linux-riscv64": "0.18.11", + "@esbuild/linux-s390x": "0.18.11", + "@esbuild/linux-x64": "0.18.11", + "@esbuild/netbsd-x64": "0.18.11", + "@esbuild/openbsd-x64": "0.18.11", + "@esbuild/sunos-x64": "0.18.11", + "@esbuild/win32-arm64": "0.18.11", + "@esbuild/win32-ia32": "0.18.11", + "@esbuild/win32-x64": "0.18.11" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", + "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "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==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "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==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz", + "integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", + "has": "^1.0.3", + "is-core-module": "^2.12.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "resolve": "^1.22.3", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz", + "integrity": "sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "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==", + "dev": true + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.1.tgz", + "integrity": "sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.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==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "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/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-tailwindcss": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.13.0.tgz", + "integrity": "sha512-Fcep4KDRLWaK3KmkQbdyKHG0P4GdXFmXdDaweTIPcgOP60OOuWFbh1++dufRT28Q4zpKTKaHwTsXPJ4O/EjU2Q==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.5", + "postcss": "^8.4.4" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "tailwindcss": "^3.3.2" + } + }, + "node_modules/eslint-plugin-vitest": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-vitest/-/eslint-plugin-vitest-0.2.8.tgz", + "integrity": "sha512-q8s4tStyKtn3gXf+8nf1ZYTHhoCXKdnozZzp6u8b4ni5v68Y4vxhNh4Z8njUfNjEY8HoPBB77MazHMR23IPb+g==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^6.2.0" + }, + "engines": { + "node": "14.x || >= 16" + }, + "peerDependencies": { + "eslint": ">=8.0.0", + "vitest": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", + "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/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/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/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/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "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": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.6.2", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-loops": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz", + "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==" + }, + "node_modules/fast-shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", + "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" + }, + "node_modules/fastest-stable-stringify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", + "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fflate": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.0.tgz", + "integrity": "sha512-FAdS4qMuFjsJj6XHbBaZeXOgaypXp8iw/Tpyuq/w3XA41jjLHT8NPA+n7czH/DDhdncq0nAyDZmPeWXh2qmdIg==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.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==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "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/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "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==", + "dev": true, + "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/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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuse.js": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", + "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "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==", + "dev": true, + "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-tsconfig": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.2.tgz", + "integrity": "sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-markdown-css": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/github-markdown-css/-/github-markdown-css-5.2.0.tgz", + "integrity": "sha512-hq5RaCInSUZ48bImOZpkppW2/MT44StRgsbsZ8YA4vJFwLKB/Vo3k7R2t+pUGqO+ThG0QDMi96TewV/B3vyItg==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/hamburger-react": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hamburger-react/-/hamburger-react-2.5.0.tgz", + "integrity": "sha512-5GSXe+ucxTPJ0SkhIsPQ/PRDweZPIKya1lfahAuExx31SdheeUA4uOPfQIAirbKona8hvo79VDr5LJQzPXsdpw==", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18" + } + }, + "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-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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "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/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "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-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inline-style-prefixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz", + "integrity": "sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==", + "dependencies": { + "css-in-js-utils": "^3.1.0", + "fast-loops": "^1.1.3" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "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-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "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": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "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==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "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-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "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-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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-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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/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==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz", + "integrity": "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.6.2", + "@jest/types": "^29.6.1", + "import-local": "^3.0.2", + "jest-cli": "^29.6.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz", + "integrity": "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.6.2", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "p-limit": "^3.1.0", + "pretty-format": "^29.6.2", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/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/jest-circus/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz", + "integrity": "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==", + "dev": true, + "dependencies": { + "@jest/core": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-config": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz", + "integrity": "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.6.2", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.2", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.6.2", + "jest-environment-node": "^29.6.2", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.6.2", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/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/jest-config/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", + "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/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/jest-diff/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz", + "integrity": "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.6.2", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/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/jest-each/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz", + "integrity": "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/fake-timers": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", + "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz", + "integrity": "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/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/jest-leak-detector/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-matcher-utils": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz", + "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.6.2", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/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/jest-matcher-utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz", + "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/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/jest-message-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz", + "integrity": "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-util": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz", + "integrity": "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz", + "integrity": "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz", + "integrity": "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.2", + "@jest/environment": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-leak-detector": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-resolve": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-util": "^29.6.2", + "jest-watcher": "^29.6.2", + "jest-worker": "^29.6.2", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz", + "integrity": "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/fake-timers": "^29.6.2", + "@jest/globals": "^29.6.2", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz", + "integrity": "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.6.2", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.6.2", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^29.6.2", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/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/jest-snapshot/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", + "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", + "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/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/jest-validate/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz", + "integrity": "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", + "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.6.2", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", + "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-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-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz", + "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "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==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "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/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "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/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nano-css": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.5.tgz", + "integrity": "sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==", + "dependencies": { + "css-tree": "^1.1.2", + "csstype": "^3.0.6", + "fastest-stable-stringify": "^2.0.2", + "inline-style-prefixer": "^6.0.0", + "rtl-css-js": "^1.14.0", + "sourcemap-codec": "^1.4.8", + "stacktrace-js": "^2.0.2", + "stylis": "^4.0.6" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", + "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "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/object.groupby": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", + "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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/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-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/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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-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/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "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/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", + "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", + "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "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-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/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/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.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-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/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-icons": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", + "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz", + "integrity": "sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ==", + "dependencies": { + "@remix-run/router": "1.7.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz", + "integrity": "sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==", + "dependencies": { + "@remix-run/router": "1.7.2", + "react-router": "6.14.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-syntax-highlighter": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", + "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "lowlight": "^1.17.0", + "prismjs": "^1.27.0", + "refractor": "^3.6.0" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "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-universal-interface": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", + "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", + "peerDependencies": { + "react": "*", + "tslib": "*" + } + }, + "node_modules/react-use": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.4.0.tgz", + "integrity": "sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==", + "dependencies": { + "@types/js-cookie": "^2.2.6", + "@xobotyi/scrollbar-width": "^1.9.5", + "copy-to-clipboard": "^3.3.1", + "fast-deep-equal": "^3.1.3", + "fast-shallow-equal": "^1.0.0", + "js-cookie": "^2.2.1", + "nano-css": "^5.3.1", + "react-universal-interface": "^0.6.2", + "resize-observer-polyfill": "^1.5.1", + "screenfull": "^5.1.0", + "set-harmonic-interval": "^1.0.1", + "throttle-debounce": "^3.0.1", + "ts-easing": "^0.2.0", + "tslib": "^2.1.0" + }, + "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-use/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.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/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "engines": { + "node": ">=6" + } + }, + "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/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "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.22.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", + "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", + "dependencies": { + "is-core-module": "^2.12.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/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-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==", + "dev": true, + "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-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.26.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", + "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/screenfull": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", + "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/set-harmonic-interval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", + "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", + "engines": { + "node": ">=6.9" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "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/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sirv": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", + "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "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==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "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/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-gps/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, + "node_modules/std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "dev": true + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/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/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/synckit/node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttle-debounce": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", + "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dev": true, + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-easing": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", + "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "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/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz", + "integrity": "sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==", + "dev": true + }, + "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==", + "dev": true, + "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/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "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/vite": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.8.tgz", + "integrity": "sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.26", + "rollup": "^3.25.2" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.1.tgz", + "integrity": "sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.1.tgz", + "integrity": "sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.1", + "@vitest/runner": "0.34.1", + "@vitest/snapshot": "0.34.1", + "@vitest/spy": "0.34.1", + "@vitest/utils": "0.34.1", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.7.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.34.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "dev": true, + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "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-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", + "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/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "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/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "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/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/conformance-search/package.json b/conformance-search/package.json new file mode 100644 index 0000000..e9051ff --- /dev/null +++ b/conformance-search/package.json @@ -0,0 +1,75 @@ +{ + "name": "conformance-search", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "prebuild": "npm run format:check && npm run lint && tsc", + "build": "vite build", + "preview": "vite preview", + "lint": "eslint --ext .ts,tsx --ignore-path .gitignore .", + "format": "prettier --write src/**/*.{ts,tsx,css}", + "format:check": "prettier --check src/**/*.{ts,tsx,css}", + "test": "vitest run", + "test:dev": "vitest", + "test:ci": "npm run copy:data:mock && npm run test", + "copy:data:mock": "rm -rf data && copyfiles -u 2 tests/__mocks__/* data", + "copy:data": "rm -rf data && copyfiles -u 3 ../src/output/* data", + "update:mock": "copyfiles -u 3 ../src/output/* tests/__mocks__" + }, + "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mui/material": "^5.14.3", + "clsx": "^2.0.0", + "fuse.js": "^6.6.2", + "github-markdown-css": "^5.2.0", + "hamburger-react": "^2.5.0", + "object-hash": "^3.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^4.10.1", + "react-router-dom": "^6.14.2", + "react-syntax-highlighter": "^15.5.0", + "react-use": "^17.4.0", + "url-join": "^5.0.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^14.0.0", + "@types/lodash": "^4.14.196", + "@types/object-hash": "^3.0.2", + "@types/react": "^18.2.18", + "@types/react-dom": "^18.2.7", + "@types/react-syntax-highlighter": "^15.5.7", + "@typescript-eslint/eslint-plugin": "^6.2.1", + "@typescript-eslint/parser": "^6.2.1", + "@vitejs/plugin-react": "^4.0.4", + "@vitest/coverage-v8": "^0.34.1", + "@vitest/ui": "^0.34.1", + "autoprefixer": "^10.4.14", + "copyfiles": "^2.4.1", + "eslint": "^8.46.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-prettier": "^8.10.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "^2.28.0", + "eslint-plugin-jest": "^27.2.3", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-react": "^7.33.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-tailwindcss": "^3.13.0", + "eslint-plugin-vitest": "^0.2.8", + "jest": "^29.6.2", + "jsdom": "^22.1.0", + "lodash": "^4.17.21", + "postcss": "^8.4.27", + "prettier": "^3.0.1", + "tailwindcss": "^3.3.3", + "typescript": "^5.1.6", + "vite": "^4.4.8", + "vitest": "^0.34.1" + } +} diff --git a/conformance-search/postcss.config.js b/conformance-search/postcss.config.js new file mode 100644 index 0000000..badd100 --- /dev/null +++ b/conformance-search/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/conformance-search/src/components/BoxComponent.tsx b/conformance-search/src/components/BoxComponent.tsx new file mode 100644 index 0000000..bfa49b3 --- /dev/null +++ b/conformance-search/src/components/BoxComponent.tsx @@ -0,0 +1,353 @@ +import clsx from "clsx"; +import { useContext, useEffect, useState } from "react"; +import { ImCheckboxChecked, ImCheckboxUnchecked } from "react-icons/im"; + +import { Light as SyntaxHighlighter } from "react-syntax-highlighter"; +import js from "react-syntax-highlighter/dist/esm/languages/hljs/javascript"; +import codeStyle from "react-syntax-highlighter/dist/esm/styles/hljs/github"; +import { useMedia } from "react-use"; +import { Box, SearchResultRefined } from "@/types"; +import RefinementContext from "@/contexts/RefinementContext"; +import Chip from "./Chip"; +import Drawer from "./Drawer"; + +SyntaxHighlighter.registerLanguage("javascript", js); + +/** + * Constructs a description for the box. + * @param box + */ +function getMetadata(box: SearchResultRefined) { + let containerType: "any" | "mixed" | "normal" | "type" = "any"; + const counts = { + type: 0, + normal: 0 + }; + + box.item.containers.every((container) => { + if ( + container.type === "*" && + container.fourcc === "*" && + box.item.containers.length === 1 + ) { + // free, skip, uuid + containerType = "any"; + return false; + } + + if (container.fourcc === "*" && container.type !== "*") { + containerType = containerType === "any" ? "type" : "mixed"; + counts.type += 1; + } else if (container.fourcc !== "*" && container.type !== "*") { + containerType = containerType === "any" ? "normal" : "mixed"; + counts.normal += 1; + } + return true; + }); + + let description = ""; + if (containerType === "any") { + if (box.item.fourcc === "file") description = "This box is the root of the file."; + else description = "This box can be found anywhere."; + } else if (containerType === "type" && counts.type === 1) { + description = `This box can only be found in ${box.item.containers[0].type} types.`; + } else if (containerType === "type" && counts.type > 1) { + description = `This box can be found under ${counts.type} types of boxes.`; + } else if (containerType === "normal" && counts.normal === 1) { + description = `This box can only be found under ${box.item.containers[0].fourcc} box.`; + } else if (containerType === "normal" && counts.normal > 1) { + description = `This box can be found under ${counts.normal} boxes.`; + } else if (containerType === "mixed") { + description = "This box can be found under "; + if (counts.type > 0) { + if (counts.type > 1) { + description += `${counts.type} types of boxes`; + } else { + description += `${box.item.containers[0].type} type of boxes`; + } + } + if (counts.normal > 0 && counts.type > 0) { + description += " and "; + } + if (counts.normal > 0) { + if (counts.normal > 1) { + description += `${counts.normal} boxes`; + } else { + description += `${box.item.containers[0].fourcc} boxes`; + } + } + description += "."; + } + + return { counts, description }; +} + +export default function BoxComponent({ box }: { box: SearchResultRefined }) { + const mobile = useMedia("(max-width: 320px)"); + const [checked, setChecked] = useState(!box.exclude && box.count > 0); + useEffect(() => setChecked(!box.exclude && box.count > 0), [box]); + const refineHandler = useContext(RefinementContext); + const { counts, description } = getMetadata(box); + + return ( +
0 && "border-l-4 border-yellow-400", + box.count === 0 && "border-l-4 !border-red-400 opacity-40" + )} + > +
+
+

+ {box.item.type || "N/A"} • {box.item.spec} +

+

+ {box.item.fourcc} +

+

+ {box.item.description} +

+
+ +
+
+

+

+ {box.item.containers.map((container) => ( + + <> + {container.fourcc === "*" ? container.type : container.fourcc}{" "} + {container.type !== "*" && container.fourcc !== "*" && ( + {`(${container.type})`} + )} + + + ))} +
+ + + + + + {box.item.syntax} + + +
+
+ ); +} diff --git a/conformance-search/src/components/Chip.tsx b/conformance-search/src/components/Chip.tsx new file mode 100644 index 0000000..ad33119 --- /dev/null +++ b/conformance-search/src/components/Chip.tsx @@ -0,0 +1,42 @@ +import clsx from "clsx"; +import React from "react"; + +export default function Chip({ + children, + type, + className, + active, + score, + onClick +}: { + children: React.JSX.Element | string; + type: string; + className?: string; + active?: boolean; + score?: number; + onClick?: () => void; +}) { + return ( + + ); +} + +Chip.defaultProps = { + active: false, + className: "", + onClick: () => {}, + score: 0 +}; diff --git a/conformance-search/src/components/CoverageSummary.tsx b/conformance-search/src/components/CoverageSummary.tsx new file mode 100644 index 0000000..e2b2036 --- /dev/null +++ b/conformance-search/src/components/CoverageSummary.tsx @@ -0,0 +1,91 @@ +import clsx from "clsx"; +import { useEffect, useState } from "react"; +import { AiOutlineLoading } from "react-icons/ai"; +import { useMedia } from "react-use"; +import { Coverage } from "@/types/json"; +import SpecsCovered from "./SpecsCovered"; + +function Number({ value, percentage }: { value: number; percentage?: boolean }) { + return ( + 0.25 && "text-orange-600", + percentage && value > 0.75 && "text-green-600" + )} + > + {(value * (percentage ? 100 : 1)).toFixed(percentage ? 2 : 0)} {percentage && "%"} + + ); +} + +Number.defaultProps = { + percentage: false +}; + +export default function CoverageSummary({ className }: { className?: string }) { + const mobile = useMedia("(max-width: 768px)"); + const [coverageStats, setCoverageStats] = useState(); + + useEffect(() => { + const init = async () => { + setCoverageStats( + (await import("../../data/coverage.json").then( + (module) => module.default + )) as Coverage + ); + }; + + init().catch(console.error); + }, []); + + if (!coverageStats) + return ( +
+ +
+ ); + + return ( +
+

+ File Format Conformance Framework +

+

+ Coverage Statistics +

+
+
+ + + Files Submitted + +
+
+ + + Files Under Consideration + +
+
+ + + Boxes + +
+
+ + + Features + +
+ +
+
+ ); +} + +CoverageSummary.defaultProps = { + className: "" +}; diff --git a/conformance-search/src/components/Drawer.tsx b/conformance-search/src/components/Drawer.tsx new file mode 100644 index 0000000..909bb59 --- /dev/null +++ b/conformance-search/src/components/Drawer.tsx @@ -0,0 +1,55 @@ +import clsx from "clsx"; +import React, { useRef, useState } from "react"; +import { IoChevronDown } from "react-icons/io5"; +import { useClickAway } from "react-use"; + +export default function Drawer({ + title, + hidden, + children +}: { + title: string; + hidden?: boolean; + children?: React.JSX.Element | React.JSX.Element[]; +}) { + const [open, setOpen] = useState(false); + const ref = useRef(null); + useClickAway( + ref, + (e: MouseEvent) => { + // Get target test id + const target = e.target as HTMLElement; + const testId = target.getAttribute("data-testid"); + // If the target is the drawer button, ignore + if (testId === "drawer-button") setOpen(false); + }, + ["mouseup"] + ); + + if (hidden) return null; + return ( +
+
+ +
+ {open && children} +
+ ); +} + +Drawer.defaultProps = { + children: null, + hidden: false +}; diff --git a/conformance-search/src/components/FeatureComponent.tsx b/conformance-search/src/components/FeatureComponent.tsx new file mode 100644 index 0000000..032946f --- /dev/null +++ b/conformance-search/src/components/FeatureComponent.tsx @@ -0,0 +1,54 @@ +import clsx from "clsx"; +import { useContext, useEffect, useState } from "react"; +import { ImCheckboxChecked, ImCheckboxUnchecked } from "react-icons/im"; +import { Feature, SearchResultRefined } from "@/types"; +import RefinementContext from "@/contexts/RefinementContext"; + +export default function FeatureComponent({ feature }: { feature: SearchResultRefined }) { + const [checked, setChecked] = useState(!feature.exclude && feature.count > 0); + useEffect(() => setChecked(!feature.exclude && feature.count > 0), [feature]); + const refineHandler = useContext(RefinementContext); + + return ( +
0 && "border-l-4 border-yellow-400", + feature.count === 0 && "border-l-4 border-red-400 opacity-40" + )} + > +
+
+

Feature

+

+ {feature.item.name} +

+
+ +
+

+ {feature.item.description || "N/A"} +

+
+ ); +} diff --git a/conformance-search/src/components/FileComponent.tsx b/conformance-search/src/components/FileComponent.tsx new file mode 100644 index 0000000..806de9e --- /dev/null +++ b/conformance-search/src/components/FileComponent.tsx @@ -0,0 +1,361 @@ +import { Tooltip } from "@mui/material"; +import clsx from "clsx"; +import React, { useEffect, useState } from "react"; +import { AiOutlineInfoCircle } from "react-icons/ai"; +import { FiDownload } from "react-icons/fi"; +import { MdClose } from "react-icons/md"; +import { RiNodeTree } from "react-icons/ri"; +import { Light as SyntaxHighlighter } from "react-syntax-highlighter"; +import json from "react-syntax-highlighter/dist/esm/languages/hljs/json"; +import codeStyle from "react-syntax-highlighter/dist/esm/styles/hljs/github"; +import urlJoin from "url-join"; +import { FileMetadata } from "@/types/json"; +import { FileSearchResult } from "@/types"; +import Drawer from "./Drawer"; +import { spec_info as specs } from "../../data/coverage.json"; + +SyntaxHighlighter.registerLanguage("json", json); + +function getDownloadURL(file: FileMetadata, relativeFile?: string) { + const BASE_URL = new URL(window.location.origin + window.location.pathname); + const DOWNLOAD_URL = new URL(urlJoin(BASE_URL.href, `/files/${file.abs_filepath}`)); + if (relativeFile) return new URL(relativeFile, DOWNLOAD_URL).href; + return DOWNLOAD_URL.href; +} + +function DetailItem({ + label, + children, + className +}: { + label: string; + children: string | React.ReactNode; + className?: string; +}) { + return ( +
+ {label} + + {children === "" ? ( + + Not available + + ) : ( + {children} + )} + +
+ ); +} + +DetailItem.defaultProps = { + className: "" +}; + +function DetailsModal({ file }: { file: FileMetadata }) { + const [open, setOpen] = useState(false); + + useEffect(() => { + window.scrollTo(0, 0); + document.body.style.overflow = open ? "hidden" : "auto"; + return () => {}; + }, [open]); + + return ( + <> + + + + {open && ( +
+
+
+ + File Details + + +
+
+ +

+ {file.rel_filepath.split("/").pop()} +

+
+ + + +
+
+
+ {file.contributor} + {file.mdms_number} + + {file.published ? "Yes" : "No"} + + {file.version.toFixed(0)} + + {file.md5} + + + {file.description} + +
+
+ + + + + +
+
+
+
setOpen(false)} + onKeyDown={(e: React.KeyboardEvent) => { + if (e.key === "Escape") setOpen(false); + }} + role="button" + tabIndex={0} + /> +
+ )} + + ); +} + +export default function FileComponent({ file }: { file: FileSearchResult }) { + let inspectEnabled = true; + if (typeof file.item.notes === "object") { + if ("compressed" in file.item.notes) { + inspectEnabled = file.item.notes.compressed === false; + } + } + + return ( +
+
+
+
+ + {file.item.published ? "Published" : "Under Consideration"} + + {file.matches.slice(0, 8).map((match) => { + return ( + + {match.value} + + ); + })} + {file.matches.length > 8 && ( + + +{file.matches.length - 6} more + + )} +
+ +

+ {file.item.rel_filepath.split("/").pop()} +

+
+
+
+ +
+
+
+
+

+ {file.item.contributor === "" ? ( + No contributor provided. + ) : ( + <> + Contributor: + {file.item.contributor} + + )} +

+

+ {file.item.description === "" ? ( + No description available. + ) : ( + <> + Description: + {file.item.description} + + )} +

+

+ Version: + {file.item.version} +

+
+
+ + Download + + {inspectEnabled && ( + + Inspect + + )} +
+
+
+ ); +} diff --git a/conformance-search/src/components/Input/Dropdown.tsx b/conformance-search/src/components/Input/Dropdown.tsx new file mode 100644 index 0000000..3330a9b --- /dev/null +++ b/conformance-search/src/components/Input/Dropdown.tsx @@ -0,0 +1,164 @@ +import clsx from "clsx"; +import Fuse from "fuse.js"; +import { useEffect, useRef, useState } from "react"; +import { useEvent, useIntersection } from "react-use"; +import { normalizeResultScores } from "@/lib/utils"; +import { Chip } from "@/components"; +import { FuseSearchWithScore } from "@/types"; + +export default function Dropdown({ + query, + fuse, + parseValue, + hidden +}: { + query: string; + fuse: { + fourccs: Fuse; + types: Fuse; + }; + parseValue: (value: string) => Promise; + hidden: boolean; +}) { + const [activeIndex, setActiveIndex] = useState(-1); + const [results, setResults] = useState<{ + fourccs: FuseSearchWithScore[]; + types: FuseSearchWithScore[]; + }>({ + fourccs: [], + types: [] + }); + + // Check if the dropdown is visible + const ref = useRef(null); + const intersection = useIntersection(ref, { + root: null, + rootMargin: "0px", + threshold: 0.1 + }); + const isVisible = !!intersection?.isIntersecting; + + // Submit the value + const submit = async (item: string, type: string) => { + if (type === "fourcc") await parseValue(`$${item}`); + else await parseValue(`#${item}`); + }; + + // Capture keydown events + const onKeyDown = async (e: KeyboardEvent) => { + if (!isVisible && process.env.NODE_ENV === "production") return; + + if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) e.preventDefault(); + else return; + + // Flatten results + const flattenedResults = [ + ...results.fourccs.map((result) => ({ + type: "fourcc", + value: result.item + })), + ...results.types.map((result) => ({ + type: "type", + value: result.item + })) + ]; + + let newActiveIndex = activeIndex; + if (e.key === "ArrowDown") { + newActiveIndex = Math.min(flattenedResults.length - 1, newActiveIndex + 1); + } else if (e.key === "ArrowUp") { + newActiveIndex = Math.max(-1, newActiveIndex - 1); + } else if (e.key === "Enter") { + const result = flattenedResults[newActiveIndex]; + if (!result) return; + + await submit(result.value, result.type); + } + setActiveIndex(newActiveIndex); + }; + useEvent("keydown", onKeyDown); + + // Update results when the query changes + useEffect(() => { + if (!fuse || !fuse.fourccs || !fuse.types) return; + + setResults({ + fourccs: normalizeResultScores( + fuse.fourccs.search(query, { + limit: 5 + }) as FuseSearchWithScore[] + ), + types: normalizeResultScores( + fuse.types.search(query, { + limit: 5 + }) as FuseSearchWithScore[] + ) + }); + }, [query, fuse]); + + // Reset active index when the dropdown is hidden + useEffect(() => { + if (!isVisible) setActiveIndex(-1); + }, [isVisible]); + + // Function to render a dropdown section + const dropdownSection = ({ + type, + _results, + previousLength = 0 + }: { + type: string; + _results: FuseSearchWithScore[]; + previousLength?: number; + }) => { + if (_results.length === 0) return undefined; + + // Check how many results were there + let localActiveIndex = activeIndex; + if (activeIndex >= previousLength) localActiveIndex = activeIndex - previousLength; + else localActiveIndex = -1; + + return ( +
+

{type}

+
    + {_results.map((result, index) => ( +
  • + submit(result.item, type.slice(0, -1))} + score={result.score} + type={type.slice(0, -1)} + > + {result.item} + +
  • + ))} +
+
+ ); + }; + + return ( + + ); +} diff --git a/conformance-search/src/components/Input/Input.tsx b/conformance-search/src/components/Input/Input.tsx new file mode 100644 index 0000000..15d222c --- /dev/null +++ b/conformance-search/src/components/Input/Input.tsx @@ -0,0 +1,43 @@ +import React from "react"; +import { Filter } from "@/types"; +import { ContainerInput, SelectInput } from "./variants"; + +export default function Input({ + filter, + index, + placeholder, + updateFilter +}: { + filter: Filter; + index: number; + placeholder: string; + updateFilter: (i: number, value?: string, type?: string) => Promise; +}) { + // If the filter is a registered_type or spec, render as a select + if (filter.type === "registered_type" || filter.type === "spec") { + return ; + } + + // If not a container, render as a normal input + if (filter.type !== "container") + return ( + ) => + updateFilter(index, (e.target as HTMLInputElement).value) + } + placeholder={placeholder} + type="text" + value={filter.value} + /> + ); + + return ( + + ); +} diff --git a/conformance-search/src/components/Input/helpers/index.ts b/conformance-search/src/components/Input/helpers/index.ts new file mode 100644 index 0000000..5e8e667 --- /dev/null +++ b/conformance-search/src/components/Input/helpers/index.ts @@ -0,0 +1,5 @@ +function stripSpecialChars(value: string) { + return value.replace(/[="]/g, ""); +} + +export default stripSpecialChars; diff --git a/conformance-search/src/components/Input/index.ts b/conformance-search/src/components/Input/index.ts new file mode 100644 index 0000000..523987d --- /dev/null +++ b/conformance-search/src/components/Input/index.ts @@ -0,0 +1,3 @@ +import Input from "./Input"; + +export default Input; diff --git a/conformance-search/src/components/Input/variants/ContainerInput.tsx b/conformance-search/src/components/Input/variants/ContainerInput.tsx new file mode 100644 index 0000000..7de21c4 --- /dev/null +++ b/conformance-search/src/components/Input/variants/ContainerInput.tsx @@ -0,0 +1,185 @@ +import clsx from "clsx"; +import Fuse from "fuse.js"; +import React, { useEffect, useRef, useState } from "react"; +import { useClickAway } from "react-use"; +import Search from "@/lib/search"; +import { Chip } from "@/components"; +import { Filter } from "@/types"; +import Dropdown from "../Dropdown"; +import stripSpecialChars from "../helpers"; + +export default function ContainerInput({ + filter, + index, + placeholder, + updateFilter +}: { + filter: Filter; + index: number; + placeholder: string; + updateFilter: (i: number, value?: string, type?: string) => Promise; +}) { + // Parsed value + const [search, setSearch] = useState(); + const [query, setQuery] = useState(""); + const [parsed, setParsed] = useState([]); + const [fuse, setFuse] = useState<{ + fourccs: Fuse; + types: Fuse; + }>(); + + // Exact match + const [exactMatch, setExactMatch] = useState( + filter.value.length > 0 && filter.value[0] === "=" + ); + + const updateFuse = (updatedSearch: Search) => { + setFuse({ + fourccs: new Fuse(updatedSearch.dictionary.fourccs, { + includeScore: true, + threshold: 0.3 + }), + types: new Fuse(updatedSearch.dictionary.types, { + includeScore: true, + threshold: 0.3 + }) + }); + }; + + // Update the filter if exact match option changes + useEffect(() => { + if (!search) return; + + const init = async () => { + await updateFilter( + index, + `${exactMatch && parsed.length > 0 ? "=" : ""}${parsed.join(".")}` + ); + updateFuse(search); + }; + + init().catch(console.error); + }, [exactMatch]); + + const parseValue = async (value: string, replace = false) => { + // split the value into an array of strings + const valueSplit = value.split(".").filter((v) => v !== ""); + const newParsed = [...(!replace ? parsed : []), ...valueSplit]; + + setQuery(""); + await updateFilter( + index, + `${exactMatch && newParsed.length > 0 ? "=" : ""}${newParsed.join(".")}` + ); + setParsed(newParsed); + }; + + // Scroll to end of chips when parsed changes + const chipsRef = useRef(null); + useEffect(() => { + if (!chipsRef.current) return; + chipsRef.current.scrollLeft = chipsRef.current.scrollWidth; + }, [parsed]); + + useEffect(() => { + const init = async () => { + await parseValue(stripSpecialChars(filter.value)); + setSearch(await Search.getInstance()); + }; + + init().catch(console.error); + }, []); + + useEffect(() => { + if (!search) return; + updateFuse(search); + }, [parsed, search]); + + // Dropdown menu + const dropdownRef = useRef(null); + const [open, setOpen] = useState(false); + + const handleClickOutside = () => { + setOpen(false); + }; + + // Capture delete key + const onKeyDown = async (e: React.KeyboardEvent) => { + if (e.key === "Backspace") { + if (query !== "") return; + e.preventDefault(); + + // Remove the last element + const valueSplit = stripSpecialChars(filter.value).split("."); + + if (valueSplit.length === 0) return; + + valueSplit.pop(); + await parseValue(valueSplit.join("."), true); + } + }; + + useClickAway(dropdownRef, handleClickOutside); + + return ( +
+
+ +
+
0 && "mr-2" + )} + > + {parsed.map((value, i) => ( + 1 && "rounded-r-none", + i === parsed.length - 1 && "rounded-r-sm", + i > 0 && + parsed.length > 1 && + "rounded-none border-l-1 border-neutral-500" + )} + type={value[0] === "$" ? "fourcc" : "type"} + > + {value.substring(1)} + + ))} +
+
+ ) => + setQuery((e.target as HTMLInputElement).value) + } + onClick={() => setOpen(true)} + onKeyDown={onKeyDown} + placeholder={placeholder} + type="text" + value={query} + /> + {fuse && ( +
+
+ ); +} diff --git a/conformance-search/src/components/Input/variants/SelectInput.tsx b/conformance-search/src/components/Input/variants/SelectInput.tsx new file mode 100644 index 0000000..45e2c3c --- /dev/null +++ b/conformance-search/src/components/Input/variants/SelectInput.tsx @@ -0,0 +1,29 @@ +import { Select } from "@/components"; +import Database from "@/lib/database"; +import { Filter } from "@/types"; +import stripSpecialChars from "../helpers"; + +export default function SelectInput({ + filter, + index, + updateFilter +}: { + filter: Filter; + index: number; + updateFilter: (i: number, value?: string, type?: string) => Promise; +}) { + const items = () => { + const database = Database.getInstanceSync(); + const stype = filter.type === "registered_type" ? "registered_types" : "specs"; + const ditems = database.dictionary[stype]; + return Object.fromEntries(ditems.map((item) => [item, { name: item }])); + }; + + return ( + ) => + setQuery((e.target as HTMLInputElement).value) + } + placeholder={!ready ? "Loading..." : "Start by typing a search term..."} + spellCheck="false" + type="text" + value={query} + /> + + {!ready && ( +
+ +
+ )} +
+
+
+ {open && + filters.map((filter: Filter, index: number) => ( +
+ + +
+ ))} + {!open ? ( +
+ +
+ ) : ( + filters.length < 6 && ( +
+ +
+ ) + )} +
+ + Note: You can use unix-style + search operators. For example, type =moof{" "} + to search exactly for moof box. + +
+ + + {open && ( +
setOpen(false)} + onKeyDown={(e: React.KeyboardEvent) => { + if (e.key === "Escape") setOpen(false); + }} + role="button" + tabIndex={0} + /> + )} + + ); +} + +SearchComponent.defaultProps = { + className: "" +}; diff --git a/conformance-search/src/components/SearchComponent/hooks/useFilters.ts b/conformance-search/src/components/SearchComponent/hooks/useFilters.ts new file mode 100644 index 0000000..1b13e88 --- /dev/null +++ b/conformance-search/src/components/SearchComponent/hooks/useFilters.ts @@ -0,0 +1,71 @@ +import { useState } from "react"; +import { useAsync } from "react-use"; +import Search from "@/lib/search"; +import { Filter } from "@/types"; + +const useFilters = (): [ + Filter[], + { + addFilter: () => void; + removeFilter: (index: number) => Promise; + updateFilter: (index: number, value?: string, type?: string) => Promise; + resetFilters: (filters?: Filter[]) => void; + } +] => { + const [filters, setFilters] = useState([]); + const { value: search } = useAsync(async () => { + return Search.getInstance(); + }, []); + + const addFilter = () => { + setFilters((prevFilters: Filter[]) => [ + ...prevFilters, + { + type: prevFilters.find((f) => f.type === "container") ? "type" : "container", + value: "" + } + ]); + }; + + const removeFilter = async (index: number) => { + if (!search) return; + + const newFilters = [...filters]; + newFilters.splice(index, 1); + setFilters(newFilters); + + // Flush the new filters + await search.flushFilters(newFilters); + }; + + const updateFilter = async (index: number, value?: string, type?: string) => { + if (!search) return; + + const newFilters = [...filters]; + newFilters[index] = { + type: type !== undefined ? type : newFilters[index].type, + // eslint-disable-next-line no-nested-ternary + value: type !== undefined ? "" : value !== undefined ? value : "" + }; + + // Flush the new filters + setFilters(newFilters); + await search.flushFilters(newFilters); + }; + + const resetFilters = (newFilters?: Filter[]) => { + setFilters(newFilters || []); + }; + + return [ + filters, + { + addFilter, + removeFilter, + updateFilter, + resetFilters + } + ]; +}; + +export default useFilters; diff --git a/conformance-search/src/components/SearchComponent/index.ts b/conformance-search/src/components/SearchComponent/index.ts new file mode 100644 index 0000000..36d8779 --- /dev/null +++ b/conformance-search/src/components/SearchComponent/index.ts @@ -0,0 +1,3 @@ +import SearchComponent from "./SearchComponent"; + +export default SearchComponent; diff --git a/conformance-search/src/components/Select.tsx b/conformance-search/src/components/Select.tsx new file mode 100644 index 0000000..75968ae --- /dev/null +++ b/conformance-search/src/components/Select.tsx @@ -0,0 +1,92 @@ +import clsx from "clsx"; +import { useRef, useState } from "react"; +import { IoChevronDown } from "react-icons/io5"; +import { useClickAway } from "react-use"; + +export default function Select({ + className, + items, + value, + onChange +}: { + className?: string; + items: { + [key: string]: { name: string }; + }; + value: string; + onChange: (newValue: string) => void; +}) { + const ref = useRef(null); + const [open, setOpen] = useState(false); + + const handleClickOutside = () => { + setOpen(false); + }; + + useClickAway(ref, handleClickOutside); + + // Get the longest option + const longestOption = Math.max( + 16, + Object.values(items) + .map((item) => item.name) + .reduce((a, b) => (a.length > b.length ? a : b)).length + ); + + return ( +
+
setOpen(!open)} + onKeyDown={(e) => { + if (e.key === "Enter") { + setOpen(!open); + } + }} + role="menu" + tabIndex={0} + > + {value === "" ? "Select one..." : items[value].name} + +
+ {open && ( +
+
    + {value === "" && ( +
  • + Select one... +
  • + )} + {Object.entries(items).map(([key, item], i) => ( +
  • { + onChange(key); + setOpen(false); + }} + onKeyDown={(e) => { + if (e.key === "Enter") { + onChange(key); + setOpen(false); + } + }} + role="menuitem" + tabIndex={i + 1} + > + {item.name} +
  • + ))} +
+
+ )} +
+ ); +} + +Select.defaultProps = { + className: "" +}; diff --git a/conformance-search/src/components/SpecsCovered.tsx b/conformance-search/src/components/SpecsCovered.tsx new file mode 100644 index 0000000..b1e3e38 --- /dev/null +++ b/conformance-search/src/components/SpecsCovered.tsx @@ -0,0 +1,44 @@ +import clsx from "clsx"; +import { Coverage } from "@/types/json"; +import { spec_info as specs } from "../../data/coverage.json"; + +export default function SpecsCovered({ + compact, + className +}: { + compact?: boolean; + className?: string; +}) { + return ( +
+
+ {specs.length} specifications covered +
+
+ {specs.map((info: Coverage["spec_info"][0]) => ( +
+ ISO/IEC {info.ISO} ({info.name}): ver + {info.version} + {info.amendmends && + info.amendmends.length > 0 && + `, ${info.amendmends.join(", ")}`} + {info.corrigenda && + info.corrigenda.length > 0 && + `, ${info.corrigenda.join(", ")}`} +
+ ))} +
+
+ ); +} + +SpecsCovered.defaultProps = { + className: "", + compact: false +}; diff --git a/conformance-search/src/components/index.ts b/conformance-search/src/components/index.ts new file mode 100644 index 0000000..3072018 --- /dev/null +++ b/conformance-search/src/components/index.ts @@ -0,0 +1,25 @@ +import BoxComponent from "./BoxComponent"; +import Chip from "./Chip"; +import CoverageSummary from "./CoverageSummary"; +import Drawer from "./Drawer"; +import FeatureComponent from "./FeatureComponent"; +import FileComponent from "./FileComponent"; +import Input from "./Input"; +import ListComponent from "./ListComponent"; +import NavigationBar from "./NavigationBar"; +import SearchComponent from "./SearchComponent"; +import Select from "./Select"; + +export { + BoxComponent, + Chip, + CoverageSummary, + Drawer, + FeatureComponent, + FileComponent, + Input, + ListComponent, + NavigationBar, + SearchComponent, + Select +}; diff --git a/conformance-search/src/contexts/RefinementContext.ts b/conformance-search/src/contexts/RefinementContext.ts new file mode 100644 index 0000000..819ec62 --- /dev/null +++ b/conformance-search/src/contexts/RefinementContext.ts @@ -0,0 +1,8 @@ +import { createContext } from "react"; +import { Box, Feature, SearchResultRefined } from "@/types"; + +const RefinementContext = createContext< + (result: SearchResultRefined, type: "box" | "feature") => void +>(() => {}); + +export default RefinementContext; diff --git a/conformance-search/src/index.css b/conformance-search/src/index.css new file mode 100644 index 0000000..d260667 --- /dev/null +++ b/conformance-search/src/index.css @@ -0,0 +1,39 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + @apply bg-paper; +} + +#root { + @apply h-screen w-screen flex flex-col; +} + +code.basic { + @apply rounded bg-gray-300 px-1 font-mono text-black; +} + +table { + @apply border-1 border-black bg-neutral-100; +} + +thead { + @apply bg-black text-white; +} + +tbody th { + @apply border-b-2 border-black px-2 text-center; +} + +tbody tr { + @apply border-b-1 border-black bg-white text-center last:border-0; +} + +tbody td { + @apply px-2; +} + +input[type="number"]::-webkit-inner-spin-button { + opacity: 1; +} diff --git a/conformance-search/src/lib/__snapshots__/database.spec.ts.snap b/conformance-search/src/lib/__snapshots__/database.spec.ts.snap new file mode 100644 index 0000000..0538236 --- /dev/null +++ b/conformance-search/src/lib/__snapshots__/database.spec.ts.snap @@ -0,0 +1,129 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Database > dictionary > should return a correct snapshot for =$moov 1`] = ` +{ + "fourccs": [ + "free", + "meta", + "mvex", + "mvhd", + "skip", + "trak", + "udta", + "uuid", + ], + "types": [ + "Box", + "FullBox", + ], +} +`; + +exports[`Database > dictionary > should return a correct snapshot for =$trak 1`] = ` +{ + "fourccs": [ + "edts", + "free", + "mdia", + "meta", + "skip", + "tkhd", + "tref", + "trgr", + "ttyp", + "udta", + "uuid", + ], + "types": [ + "Box", + "FullBox", + "GeneralTypeBox", + ], +} +`; + +exports[`Database > files > should return 2 files for hdlr under =moov.trak.meta 1`] = ` +[ + "published/isobmff/12_metas_v2.mp4", + "published/maf/vsaf/1.mp4", +] +`; + +exports[`Database > files > should return 2 files for meta under trak 1`] = ` +[ + "published/isobmff/12_metas_v2.mp4", + "published/maf/vsaf/1.mp4", +] +`; + +exports[`Database > files > should return 3 files for hdlr under =moov.meta 1`] = ` +[ + "published/isobmff/12_metas_v2.mp4", + "published/uvvu/Solekai002_1280_23_1x1_v7clear.uvvu", + "published/uvvu/Solekai007_1920_29_1x1_v7clear.uvu", +] +`; + +exports[`Database > files > should return 3 files for stz2 1`] = ` +[ + "published/isobmff/02_dref_edts_img.mp4", + "published/isobmff/04_bifs_video.mp4", + "published/isobmff/a7-tone-oddities.mp4", +] +`; + +exports[`Database > files > should return 5 files for hdlr under moov.FullBox 1`] = ` +[ + "published/isobmff/12_metas_v2.mp4", + "published/uvvu/Solekai002_1280_23_1x1_v7clear.uvvu", + "published/uvvu/Solekai007_1920_29_1x1_v7clear.uvu", + "published/maf/vsaf/1.mp4", + "published/isobmff/restricted.mp4", +] +`; + +exports[`Database > files > should return 5 files for hdlr under moov.meta 1`] = ` +[ + "published/isobmff/12_metas_v2.mp4", + "published/uvvu/Solekai002_1280_23_1x1_v7clear.uvvu", + "published/uvvu/Solekai007_1920_29_1x1_v7clear.uvu", + "published/maf/vsaf/1.mp4", + "published/isobmff/restricted.mp4", +] +`; + +exports[`Database > files > should return 12 files for idat under =file.meta 1`] = ` +[ + "published/heif/C007.heic", + "published/heif/C015.heic", + "published/heif/C016.heic", + "published/heif/C017.heic", + "published/heif/C018.heic", + "published/heif/C019.heic", + "published/heif/C020.heic", + "published/heif/C021.heic", + "published/heif/C022.heic", + "published/heif/C023.heic", + "published/heif/C024.heic", + "published/heif/C025.heic", +] +`; + +exports[`Database > files > should return 14 files for idat under file.meta 1`] = ` +[ + "published/heif/C007.heic", + "published/heif/C015.heic", + "published/heif/C016.heic", + "published/heif/C017.heic", + "published/heif/C018.heic", + "published/heif/C019.heic", + "published/heif/C020.heic", + "published/heif/C021.heic", + "published/heif/C022.heic", + "published/heif/C023.heic", + "published/heif/C024.heic", + "published/heif/C025.heic", + "published/uvvu/Solekai002_1280_23_1x1_v7clear.uvvu", + "published/uvvu/Solekai007_1920_29_1x1_v7clear.uvu", +] +`; diff --git a/conformance-search/src/lib/__snapshots__/search.spec.ts.snap b/conformance-search/src/lib/__snapshots__/search.spec.ts.snap new file mode 100644 index 0000000..56df2f2 --- /dev/null +++ b/conformance-search/src/lib/__snapshots__/search.spec.ts.snap @@ -0,0 +1,534 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Search > search of 'meta' > with a filter 1`] = ` +[ + "meta", +] +`; + +exports[`Search > search of 'meta' > with a filter that has no value 1`] = ` +[ + "meta", +] +`; + +exports[`Search > search of 'meta' > with multiple filters of same type 1`] = ` +[ + "meta", + "leva", + "mvra", + "mehd", + "mstv", + "ipma", + "schm", + "xml ", + "csch", + "pitm", + "uriI", + "iinf", + "csgp", + "stz2", + "txtC", + "saio", + "saiz", + "mvhd", + "infe", + "mfhd", + "tfhd", + "trun", + "mdhd", + "sthd", + "tfdt", + "tfra", + "stco", + "dref", + "mfro", + "tkhd", + "hmhd", + "nmhd", + "stss", + "smhd", + "vmhd", + "stts", +] +`; + +exports[`Search > search of 'meta' > without any filters 1`] = ` +[ + "meta", +] +`; + +exports[`Search > search with container filter > #SampleEntry > '' 1`] = ` +[ + "auxi", + "btrt", + "ccst", + "csch", + "free", + "frma", + "rinf", + "schi", + "schm", + "scrb", + "seii", + "sinf", + "skip", + "stvi", + "uuid", +] +`; + +exports[`Search > search with container filter > $avcC > '' 1`] = ` +[ + "free", + "skip", + "uuid", +] +`; + +exports[`Search > search with container filter > $file > $meta > 'idat' 1`] = ` +[ + "idat", +] +`; + +exports[`Search > search with container filter > $moov > $meta > 'xml' 1`] = ` +[ + "xml ", + "bxml", +] +`; + +exports[`Search > search with container filter > (exact) $file > $moov > 'trak' 1`] = ` +[ + "trak", +] +`; + +exports[`Search > search with container filter > (exact) $moov > $trak > $meta > 'hdlr' 1`] = ` +[ + "hdlr", +] +`; + +exports[`Search > search with container filter > (exact) $moov > '' TBD 1`] = ` +[ + "free", + "meta", + "mvex", + "mvhd", + "skip", + "trak", + "udta", + "uuid", +] +`; + +exports[`Search > search with container filter > (exact) $trak > '' 1`] = ` +[ + "edts", + "free", + "mdia", + "meta", + "skip", + "tkhd", + "tref", + "trgr", + "ttyp", + "udta", + "uuid", +] +`; + +exports[`Search > search with container filter > caches previous calculations 1`] = ` +[ + "3dpr", + "a3d1", + "a3d2", + "a3d3", + "a3d4", + "a3dC", + "acgl", + "adda", + "adrc", + "aebr", + "aebr", + "aebr", + "afbr", + "afbr", + "afbr", + "albc", + "alou", + "alst", + "alte", + "altr", + "altt", + "amgl", + "assp", + "aud ", + "auxC", + "auxi", + "auxl", + "auxl", + "avc1", + "avc1", + "avc2", + "avc2", + "avc3", + "avc3", + "avc4", + "avc4", + "avcC", + "avcC", + "avcp", + "avcp", + "avll", + "avss", + "base", + "brnd", + "brst", + "btrt", + "buff", + "bxml", + "cclv", + "cclv", + "ccst", + "cdsc", + "chnl", + "cinf", + "clap", + "clap", + "clli", + "clli", + "co64", + "colr", + "colr", + "cprt", + "crtt", + "csch", + "csgp", + "cslg", + "cstg", + "ctts", + "dcfi", + "deps", + "dimg", + "dimm", + "dinf", + "dmax", + "dmed", + "dmix", + "dobr", + "dobr", + "dobr", + "dpnd", + "drap", + "dref", + "drep", + "dtrt", + "edts", + "elng", + "elst", + "enc3", + "enca", + "enca", + "encf", + "encm", + "encp", + "encs", + "enct", + "encu", + "encv", + "eob ", + "eos ", + "eqiv", + "eqiv", + "etyp", + "evcr", + "exbl", + "favc", + "fdel", + "fdel", + "fdp ", + "fecr", + "fiin", + "fire", + "fobr", + "fobr", + "fobr", + "font", + "fpar", + "free", + "frma", + "gitn", + "grid", + "grpl", + "hdlr", + "hev1", + "hev1", + "hev2", + "hev2", + "hev3", + "hev3", + "hind", + "hinf", + "hint", + "hmhd", + "hnti", + "hvc1", + "hvc1", + "hvc2", + "hvc2", + "hvc3", + "hvc3", + "hvcC", + "hvcC", + "iaug", + "icpv", + "idat", + "iinf", + "iloc", + "iloc", + "imdt", + "imir", + "infe", + "ipco", + "ipma", + "ipro", + "iprp", + "iref", + "iroi", + "irot", + "iscl", + "ispe", + "jpgC", + "kind", + "lbli", + "ldep", + "leva", + "lhe1", + "lhv1", + "lhvC", + "lhvC", + "linf", + "lsel", + "ludt", + "maxr", + "md5i", + "mdcv", + "mdcv", + "mdft", + "mdhd", + "mdia", + "mebx", + "mehd", + "meta", + "mett", + "metx", + "minf", + "minp", + "mixn", + "msrc", + "mstv", + "mvc1", + "mvc2", + "mvc3", + "mvc4", + "mvcC", + "mvcg", + "mvci", + "mvd1", + "mvd2", + "mvd3", + "mvd4", + "mvdC", + "mvex", + "mvhd", + "mvif", + "mvra", + "nalm", + "nmhd", + "npck", + "nump", + "oinf", + "oinf", + "opeg", + "opth", + "oref", + "padb", + "paen", + "pano", + "pano", + "pano", + "pase", + "pasp", + "pasp", + "payt", + "pitm", + "pixi", + "pm2t", + "pmax", + "pred", + "prol", + "prtp", + "pss1", + "rap ", + "rash", + "recr", + "refs", + "res3", + "resa", + "resa", + "resf", + "resm", + "resp", + "ress", + "rest", + "resu", + "resv", + "rinf", + "rloc", + "rm2t", + "roll", + "rref", + "rrgn", + "rror", + "rrtp", + "rsrp", + "rssr", + "rtcp", + "rtp ", + "rtp ", + "sabt", + "saio", + "saiz", + "sap ", + "sbas", + "sbgp", + "sbtt", + "scal", + "schi", + "schm", + "scif", + "scnm", + "scrb", + "sdep", + "sdp ", + "sdtp", + "segr", + "seii", + "sgpd", + "sinf", + "skip", + "sm2t", + "smhd", + "snim", + "snro", + "snut", + "spid", + "spli", + "spor", + "srat", + "srpp", + "srtp", + "sstl", + "stbl", + "stco", + "stcp", + "stdp", + "ster", + "ster", + "sthd", + "stmg", + "stmi", + "stpp", + "strd", + "stri", + "strk", + "stsa", + "stsc", + "stsd", + "stsg", + "stsh", + "stss", + "stsz", + "stti", + "stts", + "stvi", + "stxt", + "stz2", + "subp", + "subs", + "subs", + "subt", + "sulm", + "svdr", + "svip", + "svpr", + "swfr", + "swtc", + "swtk", + "swto", + "sync", + "tbas", + "tbas", + "tele", + "thmb", + "thmb", + "tibr", + "tims", + "tiri", + "tkhd", + "tlou", + "tmax", + "tmin", + "tols", + "totl", + "tpay", + "tpyl", + "trak", + "tran", + "tref", + "trep", + "trex", + "trgr", + "trif", + "trpy", + "tsas", + "tscl", + "tsel", + "tsro", + "tssy", + "tstb", + "tsyn", + "ttyp", + "txtC", + "tyco", + "udes", + "udta", + "uriI", + "urim", + "url ", + "urn ", + "uuid", + "vdep", + "vipr", + "vlab", + "vmhd", + "vopi", + "vplx", + "vref", + "vreg", + "vttC", + "vvcN", + "vvcb", + "vwdi", + "vwid", + "wbbr", + "wbbr", + "wbbr", + "wvtt", + "xml ", +] +`; diff --git a/conformance-search/src/lib/database.spec.ts b/conformance-search/src/lib/database.spec.ts new file mode 100644 index 0000000..2e7370b --- /dev/null +++ b/conformance-search/src/lib/database.spec.ts @@ -0,0 +1,125 @@ +import { Box, SearchResultRefined } from "@/types"; +import Database from "./database"; +import Search from "./search"; + +describe("Database", () => { + let database: Database; + let search: Search; + beforeAll(async () => { + database = await Database.getInstance(); + search = await Search.getInstance(); + }); + + function getBox(fourcc: string): SearchResultRefined { + const box = database.boxes.find((obox: Box) => obox.fourcc === fourcc); + if (!box) throw new Error(`Box ${fourcc} not found in database`); + return { + item: box, + refIndex: -1, + actualScore: 0, + score: 0, + count: 0, + exclude: false, + type: "box" + }; + } + + describe("files", () => { + beforeEach(async () => { + await database.updateDatabase([]); + }); + + it("should return 3 files for stz2", () => { + const results = database.getMatchingFilesByBox([getBox("stz2")]); + + expect(results.length).toEqual(3); + expect(results.map((r) => r.item.abs_filepath)).toMatchSnapshot(); + }); + + it("should return 2 files for meta under trak", async () => { + await database.updateDatabase([{ container: "$trak" }]); + const results = database.getMatchingFilesByBox([getBox("meta")]); + + expect(results.length).toEqual(2); + expect(results.map((r) => r.item.abs_filepath)).toMatchSnapshot(); + }); + + it("should return 12 files for idat under =file.meta", async () => { + await database.updateDatabase([{ container: "=$file.$meta" }]); + const results = database.getMatchingFilesByBox([getBox("idat")]); + + expect(results.length).toEqual(12); + expect(results.map((r) => r.item.abs_filepath)).toMatchSnapshot(); + }); + + it("should return 14 files for idat under file.meta", async () => { + await database.updateDatabase([{ container: "$file.$meta" }]); + const results = database.getMatchingFilesByBox([getBox("idat")]); + + expect(results.length).toEqual(14); + expect(results.map((r) => r.item.abs_filepath)).toMatchSnapshot(); + }); + + it("should return 5 files for hdlr under moov.FullBox", async () => { + await database.updateDatabase([{ container: "$moov.#FullBox" }]); + const results = database.getMatchingFilesByBox([getBox("hdlr")]); + + expect(results.length).toEqual(5); + expect(results.map((r) => r.item.abs_filepath)).toMatchSnapshot(); + }); + + it("should return 5 files for hdlr under moov.meta", async () => { + await database.updateDatabase([{ container: "$moov.$meta" }]); + const results = database.getMatchingFilesByBox([getBox("hdlr")]); + + expect(results.length).toEqual(5); + expect(results.map((r) => r.item.abs_filepath)).toMatchSnapshot(); + }); + + it("should return 3 files for hdlr under =moov.meta", async () => { + await database.updateDatabase([{ container: "=$moov.$meta" }]); + const results = database.getMatchingFilesByBox([getBox("hdlr")]); + + expect(results.length).toEqual(3); + expect(results.map((r) => r.item.abs_filepath)).toMatchSnapshot(); + }); + + it("should return 2 files for hdlr under =moov.trak.meta", async () => { + await database.updateDatabase([{ container: "=$moov.$trak.$meta" }]); + const results = database.getMatchingFilesByBox([getBox("hdlr")]); + + expect(results.length).toEqual(2); + expect(results.map((r) => r.item.abs_filepath)).toMatchSnapshot(); + }); + + it("should return more than 0 files after removing a container filter", async () => { + await search.search("meta", [{ type: "container", value: "$trak" }]); + const { boxes } = await search.search("mvex", []); + const wrappedBoxes = boxes.map((box) => getBox(box.item.fourcc)); + + const files = database.getMatchingFilesByBox(wrappedBoxes); + + expect(files.length).toBeGreaterThan(0); + }); + }); + + describe("dictionary", () => { + it("should return a correct snapshot for =$trak", async () => { + await database.updateDatabase([{ container: "=$trak" }]); + const sorted = { + fourccs: database.dictionary.fourccs.sort(), + types: database.dictionary.types.sort() + }; + expect(sorted).toMatchSnapshot(); + }); + + it("should return a correct snapshot for =$moov", async () => { + await database.updateDatabase([{ container: "=$moov" }]); + const sorted = { + fourccs: database.dictionary.fourccs.sort(), + types: database.dictionary.types.sort() + }; + expect(sorted).toMatchSnapshot(); + }); + }); +}); diff --git a/conformance-search/src/lib/database.ts b/conformance-search/src/lib/database.ts new file mode 100644 index 0000000..265cce7 --- /dev/null +++ b/conformance-search/src/lib/database.ts @@ -0,0 +1,585 @@ +import hash from "object-hash"; +import { + Box, + Feature, + FileSearchResult, + Filter, + FilterConverted, + SearchResultRefined +} from "@/types"; +import { Dictionary, FileMetadata, Files, Hierarchy } from "@/types/json"; +import { collectMatchingBranches, crawlBranches } from "./utils"; + +class Database { + static instance: Database; + + #files: Files; + + #db: { + [db_hash: string]: { + boxes: Box[]; + dictionary: Dictionary; + hierarchy: Hierarchy[]; + stripped: { + boxes: Box[]; + dictionary: Dictionary; + } | null; + }; + } = {}; + + #currentFilters: { exact: boolean; configuration: Filter[] }[] = []; + + #activeHashes = ["DEFAULT"]; + + /** + * Initializes the database. Loads the cached version from local storage if available. + * Otherwise, loads the JSON files. + * @access private + */ + async init() { + // load files and coverage from JSONs + this.#files = (await import("@data/files.json").then((module) => module.default)) as Files; + + // load the database from local storage if it exists + if ( + typeof window !== "undefined" && + window.localStorage && + process.env.NODE_ENV !== "development" + ) { + // Remove expired databases + Object.keys(window.localStorage).forEach((key) => { + if (key !== BUILD_TIMESTAMP) localStorage.removeItem(key); + }); + + const db = window.localStorage.getItem(BUILD_TIMESTAMP); + if (db) { + try { + const parsed = JSON.parse(db); + if (parsed) { + this.#db = parsed; + return; + } + } catch (error) { + // Remove faulty database from local storage + window.localStorage.removeItem(BUILD_TIMESTAMP); + } + } + } + + // load the database from JSON files + this.#db = { + DEFAULT: { + boxes: (await import("@data/boxes.json").then((module) => module.default)) as Box[], + dictionary: (await import("@data/dictionary.json").then( + (module) => module.default + )) as Dictionary, + hierarchy: [ + await import("@data/hierarchy.json").then((module) => module.default) + ] as Hierarchy[], + stripped: null + } + }; + this.saveDatabase(); + } + + /** + * Return the current instance of the database. If the instance is not initialized, it will initialize it. + * @param reset - If true, it will return a new instance of the database + */ + static async getInstance(reset = false) { + if (!Database.instance || reset) { + const instance = new Database(); + await instance.init(); + Database.instance = instance; + } + + return Database.instance; + } + + /** + * Return the current instance of the database. If the instance is not initialized, it will throw an error. + */ + static getInstanceSync() { + if (Database.instance) return Database.instance; + throw new Error("Database instance is not initialized"); + } + + /** + * Converts _updateDatabase to a promise + * @param filters - Current filters + */ + async updateDatabase(filters: FilterConverted[]) { + return new Promise((resolve, reject) => { + try { + this.updateDatabaseAction(filters); + } catch (error) { + reject(error); + } + resolve(null); + }); + } + + /** + * Updates the database based on the current filters. + * Caches the compound filters in the database for faster access. + * @param rawFilters - Current raw filters + */ + private updateDatabaseAction(rawFilters: FilterConverted[]) { + //* get only container filters + const filters = rawFilters.filter((filter) => filter?.container); + + //* if no container filters, return + if (!filters.length) { + this.#activeHashes = ["DEFAULT"]; + this.#currentFilters = []; + return; + } + + //* parse container values + // The container filter value is dot separated + // If value starts with $, it is 4CC + // If value starts with #, it is a box type + // If value starts with =, it is an exact match + this.#currentFilters = filters.map((filter) => { + const value = filter.container; + const values = value.startsWith("=") ? value.slice(1).split(".") : value.split("."); + + return { + exact: value.startsWith("="), + configuration: values.map((cfg) => { + if (cfg.startsWith("$")) { + return { + type: "fourcc", + value: cfg.slice(1) + }; + } + if (cfg.startsWith("#")) { + return { + type: "type", + value: cfg.slice(1) + }; + } + throw new Error("Invalid container filter value"); + }) + }; + }); + + // * Reset active hashes + this.#activeHashes = []; + + this.#currentFilters.forEach((filterValues) => { + // * get the hash of the filter + const filterHash = hash(filterValues); + + // * add to active hashes + this.#activeHashes.push(filterHash); + + // * check if we have a cached version of the filter + const cachedFilter = this.#db[filterHash]; + + // * if we have a cached version, skip constructing the filter + if (cachedFilter) return; + + // * construct the filter + const pathSoFar: Filter[] = []; + filterValues.configuration.forEach((currentNode) => { + // * check the db if we have the current path in db + pathSoFar.push(currentNode); + + // * get the hash of the path + const pathHash = hash({ + ...filterValues, + configuration: pathSoFar + }); + + // * check if we have a cached version of the path + const cachedPath = this.#db[pathHash]; + + // * if we have a cached version, skip constructing the path + if (cachedPath) return; + + let rootAttributes = this.#db.DEFAULT; + if (pathSoFar.length > 1) { + // * get previous attributes, if any + const previousPath: Filter[] = pathSoFar.slice(0, -1); + const rootAttributesHash = hash({ + ...filterValues, + configuration: previousPath + }); + + // * get the previous attributes + if (rootAttributesHash in this.#db) + rootAttributes = this.#db[rootAttributesHash]; + } + + // * filter and generate matching branches + const matchingBranches = collectMatchingBranches( + currentNode, + rootAttributes.hierarchy + ); + + // * clean the matching branches + // If a branch does not have any descedants after filtering, we will remove that branch from the list + const cleanHierarchy = (hierarchy: Hierarchy[]) => { + const hashes: string[] = []; + return hierarchy + .map((branch) => { + // * remove empty branches + if (Object.keys(branch).length === 0) return null; + + // * remove duplicates + const branchHash = hash(branch); + if (hashes.includes(branchHash)) return null; + hashes.push(branchHash); + + return branch; + }) + .flatMap((branch) => (branch ? [branch] : [])); + }; + + const cleanedMatchingBranches = cleanHierarchy(matchingBranches); + + // * get unique fourccs, types, and tuples + const { + fourccs: uniqueFourccs, + types: uniqueTypes, + tuples: uniqueFourccTypeTuples + } = crawlBranches(cleanedMatchingBranches); + + // * filter the boxes + const filterBoxes = (boxes: Box[], tuples: string[]) => { + return boxes.filter((box) => { + const boxFourcc = box.fourcc; + const boxType = box.type; + + let found = false; + tuples.forEach((tuple) => { + const [fourcc, type] = tuple.split(":"); + + if (fourcc === boxFourcc && type === boxType) found = true; + }); + + return found; + }); + }; + + // * if we are on the last filter and the filter requires exact match, we will strip the boxes + // * Therefore, only EXACT boxes will be returned + let stripped: { + boxes: Box[]; + dictionary: Dictionary; + } | null = null; + if (filterValues.exact) { + const matchingBranchesStripped = matchingBranches.map((branch) => { + const keys = Object.keys(branch); + const newBranch: Hierarchy = {}; + keys.forEach((key) => { + newBranch[key] = {}; + }); + return newBranch; + }); + + const { + fourccs: uniqueFourccsStripped, + types: uniqueTypesStripped, + tuples: uniqueFourccTypeTuplesStripped + } = crawlBranches(cleanHierarchy(matchingBranchesStripped)); + + // Stripped means we will only return first descendent of each branch + stripped = { + boxes: filterBoxes(rootAttributes.boxes, uniqueFourccTypeTuplesStripped), + dictionary: { + fourccs: uniqueFourccsStripped, + types: uniqueTypesStripped, + specs: rootAttributes.dictionary.specs, + registered_types: rootAttributes.dictionary.registered_types + } + }; + } + + // * save the filter to the db + this.#db[pathHash] = { + hierarchy: cleanedMatchingBranches, + boxes: filterBoxes(rootAttributes.boxes, uniqueFourccTypeTuples), + dictionary: { + fourccs: uniqueFourccs, + types: uniqueTypes, + specs: rootAttributes.dictionary.specs, + registered_types: rootAttributes.dictionary.registered_types + }, + stripped + }; + }); + }); + this.saveDatabase(); + } + + /** + * Saves the database to local storage if available + */ + saveDatabase() { + if ( + typeof window !== "undefined" && + window.localStorage && + process.env.NODE_ENV !== "development" + ) + window.localStorage.setItem(BUILD_TIMESTAMP, JSON.stringify(this.#db)); + } + + /** + * Searches the files based on the current filters and given boxes + * @param boxes - Boxes to search within files + */ + getMatchingFilesByBox(boxes: SearchResultRefined[]): FileSearchResult[] { + const matchingFiles: { + item: FileMetadata; + matches: { + type: string; + value: string; + }[]; + }[] = []; + + boxes.forEach((currentBox) => { + const key = `${currentBox.item.fourcc}:${currentBox.item.type}`; + + // * If the box is excluded, skip + if (currentBox.exclude) return; + + // * First step is to search files.boxes to see what are the possible paths this box can be found in + if (!(key in this.#files.boxes)) return; + + let matchingPaths = this.#files.boxes[key]; + + // * If we have active filters, we will filter the matching paths + matchingPaths = matchingPaths.filter((path) => { + let matched = true; + // Currently, we only support one container filter. This is for future proofing + this.#currentFilters.forEach((filterValues) => { + let totalMatched = 0; + let latchAfterFirst = 0; + for (let i = 0; i < path.length; i += 1) { + // if we have already matched all the filters, we can break out of the loop + if (totalMatched === filterValues.configuration.length) break; + + // on exact match, we can break out of the loop if order of the filters are not met + if (filterValues.exact && totalMatched !== latchAfterFirst) { + matched = false; + break; + } + + const currentNode = path[i]; + const [boxFourcc, boxType] = currentNode.split(":"); + const { type, value } = filterValues.configuration[totalMatched]; + + // if we have a "*" in the filter, accept the whole path as a match + if (boxFourcc === "*") { + totalMatched = filterValues.configuration.length; + break; + } + + if (type === "fourcc" && value === boxFourcc) totalMatched += 1; + if (type === "type" && value === boxType) totalMatched += 1; + + // on exact match we need to start counting after the first match + if (totalMatched > 0) latchAfterFirst += 1; + } + + if (totalMatched !== filterValues.configuration.length) matched = false; + }); + return matched; + }); + + // * Second step is to look through files.path_file_map to see what files have the matching paths + const matchingPathsConverted = matchingPaths.map((path) => { + // We don't need the box type anymore. But we need to add currentBox at the end of each path + return path + .map((node) => node.split(":")[0]) + .concat(currentBox.item.fourcc) + .join("."); + }); + + const matchingFilesConverted = matchingPathsConverted.flatMap((path) => { + // If there are no refinements, we can just return the files + if (!currentBox.refinements) + return [...new Set(Object.values(this.#files.path_file_map[path]).flat())]; + + // Quick catch-up if file key has *:* that means it can be any version:flag + // That can be seperate as well. 0:* means version 0, any flag + // By any we mean GPAC couldn't find that version or flag in the JSON output + // If standard specifies a version/flag and a refinement is applied we will try to match it exactly + /* + If "*:*" is present then GPAC had no idea what version or flag it was but if we are here then there should've been a version or flag specified in the standard + + Note: X means don't care + Example: Only version is given + version:X + Example: Multiple versions are given + version1:X,version2:X + Example: Only flag is given + X:flag + Example: Both version and flag is given + version:flag + Example: Multiple versions and flag is given + version1:flag,version2:flag + */ + + // versions is an array of numbers + // flags will be ORed and used as base 16 + const { versions, flags } = currentBox.refinements.variant; + const ORedFlags = flags.value.reduce( + (accumulator, currentValue) => + accumulator | parseInt(currentValue.split("0x")[1], 16), + 0 + ); + + const flagMatcher = (flag: string) => { + const nFlag = parseInt(flag, 10); + if (flags.exact) return nFlag === ORedFlags; + return (nFlag & ORedFlags) === nFlag; + }; + + // We will filter the variants to collect based on the refinements + const variantsToCollect = Object.keys(this.#files.path_file_map[path]).filter( + (variant) => { + const [vv, vf] = variant.split(":"); + return ( + !( + versions.value.length > 0 && + !versions.value.includes(parseInt(vv, 10)) + ) && !(flags.value.length > 0 && !flagMatcher(vf)) + ); + } + ); + + // Merge the files from the variants + const variantFiles = variantsToCollect.flatMap( + (variant) => this.#files.path_file_map[path][variant] + ); + + // Remove duplicates + return [...new Set(variantFiles)]; + }); + + // Flatten and remove duplicates + const files = [...new Set(matchingFilesConverted)]; + + // * Last step is to map the files to their metadata + const matchingFilesMetadata = files.map((file) => { + return { + item: this.#files.file_metadata[file], + matches: [ + { + type: "box", + value: `${currentBox.item.fourcc}:${currentBox.item.type}` + } + ] + }; + }); + + matchingFiles.push(...matchingFilesMetadata); + }); + + return matchingFiles; + } + + /** + * Searches the files based on the current filters and given features + * @param features - Features to search within files + */ + getMatchingFilesByFeature(features: SearchResultRefined[]): FileSearchResult[] { + const matchingFiles: { + item: FileMetadata; + matches: { + type: string; + value: string; + }[]; + }[] = []; + + features.forEach((currentFeature) => { + // * If the feature is excluded, skip + if (currentFeature.exclude) return; + + matchingFiles.push( + ...this.#files.feature_file_map[currentFeature.item.name].files.map((file) => { + return { + item: this.#files.file_metadata[file], + matches: [ + { + type: "feature", + value: currentFeature.item.name + } + ] + }; + }) + ); + }); + + return matchingFiles; + } + + /** + * Getter for boxes. It will reflect the filters applied during updateDatabase. + * If stripped boxes are available, it will return those. + */ + get boxes() { + let buffer: Box[] = []; + this.#activeHashes.forEach((currentHash) => { + const boxes = ( + this.#db[currentHash].stripped !== null + ? this.#db[currentHash].stripped?.boxes + : this.#db[currentHash].boxes + ) as Box[]; + + buffer.push(...boxes); + }); + + // Remove duplicates + buffer = buffer.filter( + (box, index, self) => + index === self.findIndex((t) => t.fourcc === box.fourcc && t.type === box.type) + ); + + return buffer; + } + + /** + * Getter for dictionary. It will reflect the filters applied during updateDatabase. + * If stripped dictionary is available, it will return those. + */ + get dictionary() { + const buffer: Dictionary = { + fourccs: [], + types: [], + specs: this.#db.DEFAULT.dictionary.specs, + registered_types: this.#db.DEFAULT.dictionary.registered_types + }; + + this.#activeHashes.forEach((currentHash) => { + // Fourccs + const fourccs: string[] = ( + this.#db[currentHash].stripped !== null + ? this.#db[currentHash].stripped?.dictionary.fourccs + : this.#db[currentHash].dictionary.fourccs + ) as string[]; + + fourccs.forEach((fourcc) => { + if (!buffer.fourccs.includes(fourcc)) buffer.fourccs.push(fourcc); + }); + + // Types + const types: string[] = ( + this.#db[currentHash].stripped !== null + ? this.#db[currentHash].stripped?.dictionary.types + : this.#db[currentHash].dictionary.types + ) as string[]; + + types.forEach((type) => { + if (!buffer.types.includes(type)) buffer.types.push(type); + }); + }); + + return buffer; + } +} + +export default Database; diff --git a/conformance-search/src/lib/search.spec.ts b/conformance-search/src/lib/search.spec.ts new file mode 100644 index 0000000..9dc1d2f --- /dev/null +++ b/conformance-search/src/lib/search.spec.ts @@ -0,0 +1,253 @@ +import _ from "lodash"; +import { Box, SearchResult } from "@/types"; +import Database from "./database"; +import Search from "./search"; + +describe("Search", () => { + describe("search of empty", () => { + let search: Search; + beforeAll(async () => { + search = await Search.getInstance(); + }); + + it("should not return anything", async () => { + expect(await search.search("")).toEqual({ + boxes: [], + features: [] + }); + }); + }); + + describe("search of 'meta'", () => { + let search: Search; + beforeAll(async () => { + search = await Search.getInstance(); + }); + + it("without any filters", async () => { + const { boxes } = await search.search("meta"); + + expect(boxes.length).toBeGreaterThan(0); + expect( + _.some(boxes, (r: SearchResult) => r.item.fourcc === "meta" && r.score === 0) + ).toBeTruthy(); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + + it("with a filter", async () => { + const { boxes } = await search.search("meta", [{ type: "type", value: "=FullBox" }]); + + expect(boxes.length).toBeGreaterThan(0); + expect( + _.some(boxes, (r: SearchResult) => r.item.fourcc === "meta" && r.score === 0) + ).toBeTruthy(); + expect(boxes.map((r) => r.item.type)).not.toContain("Box"); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + + it("with a filter that has no value", async () => { + const { boxes } = await search.search("meta", [{ type: "type", value: "" }]); + + expect(boxes.length).toBeGreaterThan(0); + expect( + _.some(boxes, (r: SearchResult) => r.item.fourcc === "meta" && r.score === 0) + ).toBeTruthy(); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + + it("with multiple filters of same type", async () => { + const { boxes } = await search.search("meta", [ + { type: "type", value: "FullBox" }, + { type: "type", value: "Box" } + ]); + + expect(boxes.length).toBeGreaterThan(0); + expect( + _.some(boxes, (r: SearchResult) => r.item.fourcc === "meta" && r.score === 0) + ).toBeTruthy(); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + }); + + describe("search with container filter", () => { + let search: Search; + beforeAll(async () => { + search = await Search.getInstance(); + }); + + it("$mdat > '=free'", async () => { + const { boxes } = await search.search("=free", [{ type: "container", value: "$mdat" }]); + + expect(boxes.length).toEqual(1); + expect( + _.some(boxes, (r: SearchResult) => r.item.fourcc === "free" && r.score === 0) + ).toBeTruthy(); + }); + + it("$trak > 'encf'", async () => { + const { boxes } = await search.search("encf", [{ type: "container", value: "$trak" }]); + + expect(boxes.length).toEqual(1); + expect( + _.some(boxes, (r: SearchResult) => r.item.fourcc === "encf" && r.score === 0) + ).toBeTruthy(); + }); + + it("$avcC > ''", async () => { + const { boxes } = await search.search("", [{ type: "container", value: "$avcC" }]); + + expect(boxes.length).toEqual(3); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + + it("$file > $meta > 'idat'", async () => { + const { boxes } = await search.search("idat", [ + { type: "container", value: "$file.$meta" } + ]); + + expect(boxes.length).toEqual(1); + expect( + _.some(boxes, (r: SearchResult) => r.item.fourcc === "idat" && r.score === 0) + ).toBeTruthy(); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + + it("(exact) $file > $moov > 'trak'", async () => { + const { boxes } = await search.search("trak", [ + { type: "container", value: "=$file.$moov" } + ]); + + expect(boxes.length).toEqual(1); + expect( + _.some(boxes, (r: SearchResult) => r.item.fourcc === "trak" && r.score === 0) + ).toBeTruthy(); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + + it("(exact) $moov > $trak > $meta > 'hdlr'", async () => { + const { boxes } = await search.search("hdlr", [ + { type: "container", value: "=$moov.$trak.$meta" } + ]); + + expect(boxes.length).toEqual(1); + expect( + _.some(boxes, (r: SearchResult) => r.item.fourcc === "hdlr" && r.score === 0) + ).toBeTruthy(); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + + it("(exact) $trak > ''", async () => { + const { boxes } = await search.search("", [{ type: "container", value: "=$trak" }]); + + expect(boxes.length).toEqual(11); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + + it("(exact) $moov > '' TBD", async () => { + const { boxes } = await search.search("", [{ type: "container", value: "=$moov" }]); + + expect(boxes.length).toEqual(8); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + + it("$moov > $edts > 'elst'", async () => { + it("exact match", async () => { + const { boxes } = await search.search("elst", [ + { type: "container", value: "=$moov.$edts" } + ]); + + expect(boxes.length).toEqual(0); + }); + + it("normal match", async () => { + const { boxes } = await search.search("elst", [ + { type: "container", value: "$moov.$edts" } + ]); + + expect(boxes.length).toEqual(1); + expect( + _.some( + boxes, + (r: SearchResult) => r.item.fourcc === "elst" && r.score === 0 + ) + ).toBeTruthy(); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + }); + + it("$mdat > $free > ''", async () => { + const { boxes } = await search.search("=free", [ + { type: "container", value: "$mdat.$free" } + ]); + + expect(boxes.length).toEqual(0); + }); + + it("$moov > $meta > 'xml'", async () => { + const { boxes } = await search.search("xml", [ + { type: "container", value: "$moov.$meta" } + ]); + + expect(boxes.length).toEqual(2); + expect( + _.some(boxes, (r: SearchResult) => r.item.fourcc === "xml " && r.score === 0) + ).toBeTruthy(); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + + it("#SampleEntry > ''", async () => { + const { boxes } = await search.search("", [ + { type: "container", value: "#SampleEntry" } + ]); + + expect(boxes.length).toBeGreaterThan(0); + expect( + _.some(boxes, (r: SearchResult) => r.item.fourcc === "seii" && r.score === 0) + ).toBeTruthy(); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + + it("entering container value one by one", async () => { + await Database.getInstance(true); + search = await Search.getInstance(true); + + await search.search("", [{ type: "container", value: "" }]); + await search.search("", [{ type: "container", value: "=$file" }]); + await search.search("", [{ type: "container", value: "=$file.$moov" }]); + const { boxes: result1 } = await search.search("trak", [ + { type: "container", value: "=$file.$moov" } + ]); + + expect(result1.length).toEqual(1); + expect( + _.some(result1, (r: SearchResult) => r.item.fourcc === "trak" && r.score === 0) + ).toBeTruthy(); + + await search.search("", [{ type: "container", value: "" }]); + await search.search("", [{ type: "container", value: "=$moov" }]); + await search.search("", [{ type: "container", value: "=$moov.$trak" }]); + await search.search("", [{ type: "container", value: "=$moov.$trak.$meta" }]); + const { boxes: result2 } = await search.search("hdlr", [ + { type: "container", value: "=$moov.$trak.$meta" } + ]); + + expect(result2.length).toEqual(1); + expect( + _.some(result2, (r: SearchResult) => r.item.fourcc === "hdlr" && r.score === 0) + ).toBeTruthy(); + }); + + it("caches previous calculations", async () => { + // Just for cache + await search.search("xml", [{ type: "container", value: "$moov.$meta" }]); + + const { boxes } = await search.search("", [{ type: "container", value: "$moov" }]); + + expect(boxes.length).toBeGreaterThan(0); + expect( + _.some(boxes, (r: SearchResult) => r.item.fourcc === "avcp" && r.score === 0) + ).toBeTruthy(); + expect(boxes.map((r) => r.item.fourcc)).toMatchSnapshot(); + }); + }); +}); diff --git a/conformance-search/src/lib/search.ts b/conformance-search/src/lib/search.ts new file mode 100644 index 0000000..9ba9d0a --- /dev/null +++ b/conformance-search/src/lib/search.ts @@ -0,0 +1,440 @@ +import Fuse from "fuse.js"; +import hash from "object-hash"; + +import { Box, Feature, FileSearchResult, Filter, SearchResult, SearchResultRefined } from "@/types"; +import { Files } from "@/types/json"; +import Database from "./database"; +import { normalizeResultScores } from "./utils"; + +/** + * This is the list of filter options + */ +export const FILTER_OPTIONS: { + [key: string]: { + name: string; + placeholder: string; + }; +} = { + container: { + name: "Container", + placeholder: "Start by typing a box or a type..." + }, + type: { + name: "Box Type", + placeholder: "Start by typing a type..." + }, + registered_type: { + name: "Registered Type", + placeholder: "Start by typing a registered type..." + }, + spec: { + name: "Specification", + placeholder: "Start by typing the ISO/IEC number..." + } +}; + +class Search { + static instance: Search; + + #database: Database; + + #filters: Filter[] = []; + + #files: Files; + + #currentHash = ""; + + #fuses: [Fuse, Fuse]; + + #fuseCache: { + [hash: string]: [Fuse, Fuse]; + } = {}; + + #fuseOptions = { + includeScore: true, + fieldNormWeight: 0.8, + useExtendedSearch: true, + keys: [ + { + name: "fourcc", + weight: 100 + }, + { + name: "description", + weight: 40 + }, + { + name: "type", + weight: 30 + }, + { + name: "registered_type", + weight: 30 + }, + { + name: "syntax", + weight: 15 + } + ] + }; + + #searchOptions = { + querySearchAttributes: ["fourcc", "description", "syntax"] + }; + + /** + * Initialize the search instance by + * - Loading the database + * - Loading the files + * - Creating the default fuse instance + */ + async init() { + this.#database = await Database.getInstance(); + this.#files = (await import("@data/files.json").then((module) => module.default)) as Files; + await this.getFuse(); + } + + /** + * Get the search instance + * @param reset - Reset the search instance + */ + static async getInstance(reset = false) { + if (!Search.instance || reset) { + const instance = new Search(); + await instance.init(); + Search.instance = instance; + } + return Search.instance; + } + + /** + * Getter for the filters + * This will group the filters by type and return a unique list of filters + */ + get filters() { + const groupedFilters = this.#filters.reduce((acc: { [type: string]: Filter[] }, filter) => { + if (filter.value === "") return acc; + if (!acc[filter.type]) acc[filter.type] = []; + acc[filter.type].push(filter); + return acc; + }, {}); + + // Get unique filters + const uniqueFilters = Object.values(groupedFilters) + .map((filters) => { + if (filters.length === 1) { + return { + [filters[0].type]: filters[0].value + }; + } + if (filters.length > 1) { + return { + [filters[0].type]: filters.map((filter) => filter.value).join("|") + }; + } + return null; + }) + .flatMap((filter) => (filter ? [filter] : [])); + + return uniqueFilters; + } + + /** + * Getter for the dictionary from the database + */ + get dictionary() { + return this.#database.dictionary; + } + + /** + * Returns the cached fuse instance if current filter state is same + * Otherwise it will update the database and create new fuse instances (box and feature) + */ + async getFuse() { + if (this.#currentHash !== this.searchStateHash()) { + this.#currentHash = this.searchStateHash(); + + // We need to update database instance + // It needs container filter to recreate boxes, dictionary, possible hierarchy list + try { + await this.#database.updateDatabase(this.filters); + } catch (error) { + console.error(error); + } + + // Check if we have a cached version of the fuse instance + const cachedFuse = this.#fuseCache[this.#currentHash]; + + if (cachedFuse) { + this.#fuses = cachedFuse; + } else { + // Create new fuse instances + this.#fuses = [ + new Fuse(this.#database.boxes, this.#fuseOptions), + new Fuse( + Object.values(this.#files.feature_file_map).map((feature) => ({ + name: feature.key, + description: feature.description, + spec: feature.spec + })), + { + ...this.#fuseOptions, + keys: ["name", "description", "spec"] + } + ) + ]; + + // Cache the fuse instance + this.#fuseCache[this.#currentHash] = this.#fuses; + } + } + return this.#fuses; + } + + /** + * This hash is used to identify the current database after container filter has been applied + * For that reason we only care about the container filter + */ + searchStateHash() { + return hash({ + filters: Object.values(this.filters).filter((filter) => filter?.container) + }); + } + + /** + * This is actually an indirect way to update the database + */ + async flushFilters(filters: Filter[]) { + this.#filters = filters; + await this.getFuse(); + } + + /** + * Refinement process consists of several features: + * - Search files matching the boxes and features + * - Add match count to boxes and features + * - Clean the resulting files and construct a match list for each file + * @param boxes - List of boxes to refine + * @param features - List of features to refine + * @param first - If this is the first refinement, it is used to exclude items based on score + */ + refine( + boxes: SearchResultRefined[], + features: SearchResultRefined[], + first: boolean = false + ): { + boxes: SearchResultRefined[]; + features: SearchResultRefined[]; + files: FileSearchResult[]; + } { + // Create a map for boxes and features + const boxMap = new Map>( + boxes.map((box, index) => { + return [ + `${box.item.fourcc}:${box.item.type}`, + { + ...box, + refIndex: index + } + ]; + }) + ); + const featureMap = new Map>( + features.map((feature, index) => { + return [ + feature.item.name, + { + ...feature, + refIndex: index + } + ]; + }) + ); + const fileMap = new Map(); + + const files = this.#database + .getMatchingFilesByFeature(features) + .concat(this.#database.getMatchingFilesByBox(boxes)); + + // Go through the matches and create a map of boxes and features + files.forEach((file) => { + file.matches.forEach((match) => { + const { type, value } = match; + + if (type === "box") { + let existing = boxes.find( + (box) => `${box.item.fourcc}:${box.item.type}` === value + ); + + if (!existing || !boxMap.has(value)) + throw new Error(`Sanity Check failed: Box ${value} not found in box list`); + + if (boxMap.has(value)) { + existing = boxMap.get(value); + if (existing) existing.count += 1; + } + } else if (type === "feature") { + let existing = features.find((feature) => feature.item.name === value); + + if (!existing || !featureMap.has(value)) + throw new Error( + `Sanity Check failed: Feature ${value} not found in feature list` + ); + + if (featureMap.has(value)) { + existing = featureMap.get(value); + if (existing) existing.count += 1; + } + } + }); + }); + + // Merge matches of duplicate files (by md5) + files.forEach((file) => { + const existing = fileMap.get(file.item.md5); + if (existing) existing.matches = existing.matches.concat(file.matches); + else fileMap.set(file.item.md5, file); + }); + + // Convert to array + const boxesArray = Array.from(boxMap.values()); + const featuresArray = Array.from(featureMap.values()); + let filesArray = Array.from(fileMap.values()); + + // Remove duplicate matches + filesArray = filesArray.map((file) => ({ + ...file, + matches: file.matches.filter( + (match, index, self) => + self.findIndex((m) => m.type === match.type && m.value === match.value) === + index + ) + })); + + // Sort files by alphabetical order + filesArray = filesArray.sort((a, b) => + a.item.rel_filepath.localeCompare(b.item.rel_filepath) + ); + + if (!first) + return { + boxes: boxesArray, + features: featuresArray, + files: filesArray + }; + + // On first refinement, we should aim to have the best results of boxes and features individually + let reducedFeatures = featuresArray; + let reducedBoxes = boxesArray; + + if (boxesArray.length > 1) + reducedBoxes = boxesArray.map((box) => ({ + ...box, + exclude: box.score > 0.1 || box.actualScore > 0.2 + })); + + if (featuresArray.length > 1) + reducedFeatures = featuresArray.map((feature) => ({ + ...feature, + exclude: feature.score > 0.1 || feature.actualScore > 0.2 + })); + + return this.refine(reducedBoxes, reducedFeatures); + } + + /** + * Search the database with the given query and filters + * It will construct a query for boxes and features separately + * Then it will search the database with the constructed queries + * It will return the results with normalized scores and filters out low relevance results + * @param query - Search query + * @param filters - List of filters to apply + */ + async search(query: string, filters?: Filter[]) { + if (filters) this.#filters = filters; + + // This is for searching multiple attributes with the same query with OR condition + const attributes = query !== "" && [ + { + $or: this.#searchOptions.querySearchAttributes.map((attr) => ({ + [attr]: query + })) + } + ]; + + // This adds the filters as an AND condition + const constructedQueryForBox: Fuse.Expression = { + $and: [...this.filters.filter((filter) => !filter?.container), ...(attributes || [])] + }; + + // This adds the spec filter as an AND condition + const spec = this.filters.find((filter) => filter?.spec)?.spec; + const constructedQueryForFeature: Fuse.Expression = { + $and: [ + { + $or: [ + { + name: query + }, + { + description: query + } + ] + }, + ...(spec ? [{ spec }] : []) + ] + }; + + let boxes: SearchResult[] = []; + let features: SearchResult[] = []; + try { + const [boxFuse, featureFuse] = await this.getFuse(); + + // If the query is empty but we have container filter, we need to return all the boxes + if ( + query === "" && + this.filters.length > 0 && + this.filters.every((filter) => filter?.container) + ) { + boxes = this.#database.boxes.map((box, index) => ({ + item: box, + refIndex: index, + actualScore: 0, + score: 0 + })); + features = Object.values(this.#files.feature_file_map).map((feature, index) => ({ + item: { + name: feature.key, + description: feature.description, + spec: feature.spec + }, + refIndex: index, + actualScore: 0, + score: 0 + })); + } else { + boxes = boxFuse.search(constructedQueryForBox) as SearchResult[]; + features = featureFuse.search( + constructedQueryForFeature + ) as SearchResult[]; + } + } catch (e) { + console.error(e); + } + + // Special case: remove 'file' from the box list + boxes = boxes.filter((box) => box.item.fourcc !== "file"); + + // Normalize scores + boxes = normalizeResultScores(boxes, query === "" ? 1.0 : 0.2); + features = normalizeResultScores(features, query === "" ? 1.0 : 0.2); + + // Filter out results with low scores + boxes = boxes.filter((result) => result.score <= 0.2); + features = features.filter((result) => result.score <= 0.2); + + return { boxes, features }; + } +} + +export default Search; diff --git a/conformance-search/src/lib/utils.ts b/conformance-search/src/lib/utils.ts new file mode 100644 index 0000000..1b1e5fb --- /dev/null +++ b/conformance-search/src/lib/utils.ts @@ -0,0 +1,108 @@ +import { Filter, FuseSearchWithScore } from "@/types"; +import { Hierarchy } from "@/types/json"; + +/** + * This will go through the given hierarchies and collect all the branches that match the given filter. + * We terminate each branch at the first match. So that next filter can start from that branch. + * @param filter - the filter to match + * @param hierarchies - the hierarchies to search + * @param matches - the matches found so far + */ +function collectMatchingBranches( + filter: Filter, + hierarchies: Hierarchy[], + matches: Hierarchy[] = [] +) { + // Basically, we will start from the root, and go down the tree. If we encounter a node that matches the filter, we will keep the descedants of that node in a list (preserving the branch) and continue to other branches. + const { type, value } = filter; + + // * go through hierarchies + hierarchies.forEach((hierarchy) => { + Object.keys(hierarchy).forEach((key) => { + const [keyFourcc, keyType] = key.split(":"); + + let found = false; + if (type === "fourcc") { + if (keyFourcc === value) { + matches.push(hierarchy[key]); + found = true; + } + } else if (type === "type") { + if (keyType === value) { + matches.push(hierarchy[key]); + found = true; + } + } + + if (Object.keys(hierarchy[key]).length > 0 && !found) { + collectMatchingBranches(filter, [hierarchy[key]], matches); + } + }); + }); + + return matches; +} + +/** + * This goes through the given hierarchies and collects all unique the fourccs, types and tuples. + * @param branches - the hierarchies to crawl + */ +function crawlBranches( + branches: Hierarchy[], + fourccs: string[] = [], + types: string[] = [], + tuples: string[] = [] +) { + branches.forEach((branch) => { + Object.keys(branch).forEach((key) => { + const box = branch[key]; + const [boxFourcc, boxType] = key.split(":"); + + if (!fourccs.includes(boxFourcc)) fourccs.push(boxFourcc); + if (!types.includes(boxType)) types.push(boxType); + if (!tuples.includes(key)) tuples.push(key); + + if (Object.keys(box).length > 0) { + crawlBranches([box], fourccs, types, tuples); + } + }); + }); + + return { fourccs, types, tuples }; +} + +/** + * Normalize the scores of the given results. + * @param results - the results to normalize + */ +function normalizeResultScores(results: FuseSearchWithScore[], threshold = 0.2) { + let normalizedResults = results; + if (results.length === 1) { + normalizedResults = results.map((result) => ({ + ...result, + actualScore: result.score, + score: 0 + })); + } else if (results.length > 1) { + const minScore = results[0].score; + const maxScore = results[results.length - 1].score; + + if (minScore === maxScore) { + normalizedResults = results.map((result) => ({ + ...result, + actualScore: result.score, + score: minScore < threshold ? 0 : 1 + })); + } else { + normalizedResults = results.map((result) => ({ + ...result, + actualScore: result.score, + score: ((result.score || 0) - minScore) / (maxScore - minScore) + })); + } + } + + return normalizedResults; +} + +export { collectMatchingBranches, crawlBranches, normalizeResultScores }; diff --git a/conformance-search/src/main.tsx b/conformance-search/src/main.tsx new file mode 100644 index 0000000..64a22e1 --- /dev/null +++ b/conformance-search/src/main.tsx @@ -0,0 +1,25 @@ +import ReactDOM from "react-dom/client"; +import { createHashRouter, RouterProvider } from "react-router-dom"; +import CoverageView from "@/pages/CoveragePage"; +import HomeView from "@/pages/SearchPage"; +import AboutPage from "./pages/AboutPage"; +import "./index.css"; + +const router = createHashRouter([ + { + path: "/", + element: + }, + { + path: "/about", + element: + }, + { + path: "/coverage", + element: + } +]); + +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + +); diff --git a/conformance-search/src/pages/AboutPage.tsx b/conformance-search/src/pages/AboutPage.tsx new file mode 100644 index 0000000..bae09a0 --- /dev/null +++ b/conformance-search/src/pages/AboutPage.tsx @@ -0,0 +1,116 @@ +/* eslint-disable tailwindcss/no-custom-classname */ +import "github-markdown-css/github-markdown-light.css"; +import { NavigationBar } from "@/components"; + +export default function AboutPage() { + return ( + <> + +
+

Overview

+

+ Welcome to the File Format Conformance Framework, a repository dedicated to + supporting the conformance resources for specifications developed by the MPEG + Systems File Format group. This framework is based on ISO/IEC 14496-32 and + contains conformance files for various specifications, such as: +

+
    +
  • ISOBMFF: 14496-12
  • +
  • MP4: 14496-14
  • +
  • NALUFF: 14496-15
  • +
  • Text: 14496-30
  • +
  • HEIF: 23008-12
  • +
+

The main goals for the File Format Conformance Framework are:

+
    +
  • to provide a way to contribute new files to the conformance suite.
  • +
  • + to manage exising files and gather additional metadata associated with the + files. +
  • +
  • + to create a dump of the contents of the files by utiilzing automation tools + with the ability to add additional information which could not be + automatically determined. +
  • +
  • + to export all features (e.g. boxes, sample groups, etc.) from our + specifications to a json format which we can later use to map conformance + files to them which claim to be conformant to these features. +
  • +
  • + to utilize automation tools to check for validity of contributed files by + checking the metadata extracted from specifications (this metadata includes + checking box types, version, flags, location of the boxes, user defined + features from specifications which files claim to be conformant to, etc.). +
    +

    + NOTE: This framework DOES NOT validate the + conformance of each feature, but rather provides a mapping from + contributed files to features that are defined in our + specifications. We check for correct box definitions and locations + as well as defined versions and flags. +

    +
    +
  • +
  • + to automate validation of the registered boxes from{" "} + MP4RA. +
  • +
  • + to provide visualization of exising files and its mapping to specifications, + as well as providing a search tool to quickly find files with desired + features. +
  • +
  • + to visualize the coverage page, which shows how many features can be found + in files contributed to the framework. This information is used to + understand the current status of the files that we have currently in our + suite and how many files we still need to gather to provide example files to + every feature defined our specifications. +
  • +
+

+ Conformance files themselves are stored on{" "} + + this GitHub repository + {" "} + using the Git Large File Storage (LFS). +

+

+ The design of the framework allows for easy extensions to support new + specifications and file formats. The addition of new specifications or + amendments to the framework is as simple as providing the necessary metadata. +

+

Contributing

+

+ We encourage your contributions! If you identify any issues with the metadata or + the functionality of this framework or if you can contribute conformance files, + feel free to{" "} + + open an issue + {" "} + or contribute directly to{" "} + + the project on GitHub + + . Please refer to our{" "} + + CONTRIBUTING.md + {" "} + for information on the process for submitting new conformance files to this + repository (MPEG Members only). +

+

License

+

+ This project operates under the Clear BSD License. For more details, please see + our{" "} + + LICENSE + {" "} + file. +

+
+ + ); +} diff --git a/conformance-search/src/pages/CoveragePage.tsx b/conformance-search/src/pages/CoveragePage.tsx new file mode 100644 index 0000000..bb28f48 --- /dev/null +++ b/conformance-search/src/pages/CoveragePage.tsx @@ -0,0 +1,445 @@ +import { Slider } from "@mui/material"; +import Fuse from "fuse.js"; +import React, { useEffect, useMemo, useState } from "react"; +import { AiOutlineLoading } from "react-icons/ai"; +import { FaExpandAlt } from "react-icons/fa"; +import { useAsync, useMedia, useThrottle } from "react-use"; +import { Coverage } from "@/types/json"; +import SpecsCovered from "@/components/SpecsCovered"; +import { NavigationBar } from "@/components"; +import { CoverageResults } from "@/types"; + +function HighlightBox({ children }: { children: string }) { + const path = children.split(".").slice(0, -1).join("."); + const last = children.split(".").slice(-1)[0]; + return ( +
+ + {path.includes("*") ? ( + <> + {path.split("*")[0]} + + {path.split("*")[1]} + + ) : ( + path + )} + + .{last} +
+ ); +} + +function CoverageTables({ + coverageStats, + processedCoverageStats, + depth +}: { + coverageStats: Coverage; + processedCoverageStats: Coverage; + depth: number; +}) { + const download = () => { + const dataStr = `data:text/json;charset=utf-8,${encodeURIComponent( + JSON.stringify(coverageStats) + )}`; + const downloadAnchorNode = document.createElement("a"); + downloadAnchorNode.setAttribute("href", dataStr); + downloadAnchorNode.setAttribute("download", `coverage-${BUILD_TIMESTAMP}.json`); + downloadAnchorNode.click(); + downloadAnchorNode.remove(); + }; + + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + +
File Statistics
CountAttribute
{coverageStats.files.count}Files submitted
{coverageStats.files.published_count}Published
{coverageStats.files.under_consideration_count}Under consideration
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Boxes
CountAttribute
{processedCoverageStats.path_file_map.count}All possible box locations
+ {( + (processedCoverageStats.lists.boxes.covered.length / + processedCoverageStats.lists.boxes.not_covered.length) * + 100 + ).toFixed(2)} + % + Coverage percentage (depth={depth})
{processedCoverageStats.path_file_map.non_empty}Unique box locations in files
{processedCoverageStats.path_file_map.published.count}Published
{processedCoverageStats.path_file_map.under_consideration.count}Under consideration
+ + + + + + + + + + + + + + + + + + + + + + + + +
User Defined Features
CountAttribute
{processedCoverageStats.feature_file_map.count}Total number of features
{processedCoverageStats.feature_file_map.published_features}Published
+ {processedCoverageStats.feature_file_map.under_consideration_features} + Under consideration
+
+ +
+ +
+ ); +} + +function Tables({ results }: { results: CoverageResults }) { + return ( + <> + {["covered", "not_covered", "under_consideration"].map((type) => { + if (!results) return null; + if (results.boxes[type].length === 0 && results.features[type].length === 0) + return null; + return ( +
+ + {type.replace("_", " ")} ( + {results.boxes[type].length + results.features[type].length}) + + {results.boxes[type].length > 0 && ( + <> + + Boxes ({results.boxes[type].length}) + + + + {results.boxes[type].map( + (path: Fuse.FuseResult) => { + return ( + + + + ); + } + )} + +
+ {path.item} +
+ + )} + {results.features[type].length > 0 && ( + <> + + Features ({results.features[type].length}) + + + + {results.features[type].map( + (feature: Fuse.FuseResult) => { + return ( + + + + ); + } + )} + +
+ {feature.item} +
+ + )} +
+ ); + })} + + ); +} + +export default function CoveragePage() { + const mobile = useMedia("(max-height: 1000px)"); + const [processedCoverageStats, setProcessedCoverageStats] = useState(); + const [search, setSearch] = useState(""); + const throttledSearch = useThrottle(search, 250); + const [depth, setDepth] = useState(3); + const [fuses, setFuses] = useState<{ + boxes: { + covered: Fuse; + not_covered: Fuse; + under_consideration: Fuse; + }; + features: { + covered: Fuse; + not_covered: Fuse; + under_consideration: Fuse; + }; + }>(); + + // Load coverage stats + const { value: coverageStats } = useAsync(async () => { + return (await import("../../data/coverage.json").then( + (module) => module.default + )) as Coverage; + }, []); + + // When coverage stats are loaded or depth value is changed, process them + useEffect(() => { + if (!coverageStats) return undefined; + + // Process paths that they are truncated to the depth specified + const process = (list: string[]) => + list.map((path) => { + const split = path.split("."); + + if (split.length <= depth + 1) return path; + + return split + .slice(1, split.length + 1) + .reverse() + .slice(0, depth) + .concat(["*", "file"]) + .reverse() + .join("."); + }); + + // Deduplicate paths and also remove similar paths + const dedupe = (list: string[]) => { + const set = new Set(); + + // Add all items to set + list.forEach((item) => set.add(item)); + + // Remove items that are similar to other items + list.forEach((item) => { + if (!item.includes("*")) return; + const similar = item.replace(".*", ""); + if (set.has(similar)) set.delete(similar); + }); + + return Array.from(set); + }; + + const cs = structuredClone(coverageStats); + + cs.lists.boxes.covered = dedupe(process(cs.lists.boxes.covered)); + cs.lists.boxes.under_consideration = dedupe(process(cs.lists.boxes.under_consideration)); + cs.lists.boxes.not_covered = dedupe(process(cs.lists.boxes.not_covered)).filter( + (path) => !cs.lists.boxes.covered.includes(path) + ); + + setProcessedCoverageStats(cs); + + // Create Fuse instances + const fuseOptions: Fuse.IFuseOptions = { + threshold: 0.4, + ignoreLocation: true, + ignoreFieldNorm: true, + useExtendedSearch: true + }; + + setFuses({ + boxes: { + covered: new Fuse(cs.lists.boxes.covered, fuseOptions), + not_covered: new Fuse(cs.lists.boxes.not_covered, fuseOptions), + under_consideration: new Fuse(cs.lists.boxes.under_consideration, fuseOptions) + }, + features: { + covered: new Fuse(cs.lists.features.covered, fuseOptions), + not_covered: new Fuse(cs.lists.features.not_covered, fuseOptions), + under_consideration: new Fuse(cs.lists.features.under_consideration, fuseOptions) + } + }); + + return () => { + setFuses(undefined); + setProcessedCoverageStats(undefined); + }; + }, [coverageStats, depth]); + + // Apply current search query to all lists + const results: CoverageResults = useMemo(() => { + if (!fuses || !processedCoverageStats) + return { + boxes: { + covered: [], + not_covered: [], + under_consideration: [] + }, + features: { + covered: [], + not_covered: [], + under_consideration: [] + } + }; + + if (throttledSearch === "") { + const wrapInFuseResult = (arr: string[]) => + arr.map((item) => ({ item, refIndex: 0, score: 0 })); + + return { + boxes: { + covered: wrapInFuseResult(processedCoverageStats.lists.boxes.covered), + not_covered: wrapInFuseResult(processedCoverageStats.lists.boxes.not_covered), + under_consideration: wrapInFuseResult( + processedCoverageStats.lists.boxes.under_consideration + ) + }, + features: { + covered: wrapInFuseResult(processedCoverageStats.lists.features.covered), + not_covered: wrapInFuseResult( + processedCoverageStats.lists.features.not_covered + ), + under_consideration: wrapInFuseResult( + processedCoverageStats.lists.features.under_consideration + ) + } + }; + } + + const boxes = { + covered: fuses.boxes.covered.search(throttledSearch), + not_covered: fuses.boxes.not_covered.search(throttledSearch), + under_consideration: fuses.boxes.under_consideration.search(throttledSearch) + }; + const features = { + covered: fuses.features.covered.search(throttledSearch), + not_covered: fuses.features.not_covered.search(throttledSearch), + under_consideration: fuses.features.under_consideration.search(throttledSearch) + }; + + return { boxes, features }; + }, [fuses, processedCoverageStats, throttledSearch]); + + // If screen is smaller than 1000px, then #root should have height: auto + useEffect(() => { + if (mobile) document.getElementById("root")?.style.setProperty("height", "auto"); + else document.getElementById("root")?.style.setProperty("height", "100vh"); + }, [mobile]); + + // Show a loading indicator if coverage stats are not loaded yet + if (!processedCoverageStats || !coverageStats) + return ( +
+ +
+ ); + + return ( + <> + +
+
+ +
+
+ ) => + setSearch((e.target as HTMLInputElement).value) + } + placeholder="Start by typing a feature or box fourcc..." + type="text" + value={search} + /> + + Note: You can use unix-style search + operators. For example, type avcC$ to search + for features/boxes ending in avcC. + +
+ Depth Setting + setDepth(value as number)} + step={1} + valueLabelDisplay="auto" + /> +
+
+
+ +
+
+ + ); +} diff --git a/conformance-search/src/pages/SearchPage.tsx b/conformance-search/src/pages/SearchPage.tsx new file mode 100644 index 0000000..dd25186 --- /dev/null +++ b/conformance-search/src/pages/SearchPage.tsx @@ -0,0 +1,162 @@ +import { Tab, Tabs } from "@mui/material"; +import { useCallback, useEffect, useState } from "react"; +import { useAsync, useMedia } from "react-use"; +import { + BoxComponent, + CoverageSummary, + FeatureComponent, + FileComponent, + ListComponent, + NavigationBar, + SearchComponent +} from "@/components"; +import RefinementContext from "@/contexts/RefinementContext"; +import Search from "@/lib/search"; +import { Box, Feature, FileSearchResult, SearchResult, SearchResultRefined } from "@/types"; + +export default function SearchPage() { + const [tab, setTab] = useState(0); + const [state, setState] = useState<{ + boxes: SearchResultRefined[]; + features: SearchResultRefined[]; + files: FileSearchResult[]; + }>(); + + // Initialize search and database + const { value: search } = useAsync(async () => { + return Search.getInstance(); + }, []); + + // When a result is received, refine the search results + const onResult = async (inBoxes: SearchResult[], inFeatures: SearchResult[]) => { + if (!search) return; + setState( + search.refine( + inBoxes.map((box) => ({ + ...box, + exclude: false, + count: 0, + type: "box" + })), + inFeatures.map((feature) => ({ + ...feature, + exclude: false, + count: 0, + type: "feature" + })), + true + ) + ); + }; + + // Combine boxes and features into a single array and sort them + const combinedResults = [...(state?.boxes || []), ...(state?.features || [])].sort( + (a: SearchResultRefined, b: SearchResultRefined) => { + // Follow this order: + // 1. count: 0 is always last + // 2. Lowest score is first + // 3. Highest count is first + // 4. excluded: false comes first + // 5. Alphabetical order + if (a.count === 0 && b.count !== 0) return 1; + if (a.count !== 0 && b.count === 0) return -1; + if (a.score < b.score) return -1; + if (a.score > b.score) return 1; + if (a.count > b.count) return -1; + if (a.count < b.count) return 1; + if (a.exclude && !b.exclude) return 1; + if (!a.exclude && b.exclude) return -1; + if ("fourcc" in a.item && "fourcc" in b.item) + return (a.item as Box).fourcc.localeCompare((b.item as Box).fourcc); + if ("name" in a.item && "name" in b.item) + return (a.item as Feature).name.localeCompare((b.item as Feature).name); + return 0; + } + ); + + // Refine handler for the refinement context + const refineHandler = useCallback( + async (result: SearchResultRefined, type: "box" | "feature") => { + if (!search || !state) return; + + // Find and replace the result + if (type === "box") state.boxes[result.refIndex] = result as SearchResultRefined; + else state.features[result.refIndex] = result as SearchResultRefined; + + setState(search.refine(state.boxes, state.features)); + }, + [search, state] + ); + + // If screen is smaller than 700px, then #root should have height: auto + const mobileH = useMedia("(max-height: 800px)"); + const mobileW = useMedia("(max-width: 800px)"); + useEffect(() => { + if (mobileH) document.getElementById("root")?.style.setProperty("height", "auto"); + else document.getElementById("root")?.style.setProperty("height", "100vh"); + }, [mobileH]); + + return ( + + +
+ + {combinedResults.length > 0 && mobileW && ( + setTab(value)} + value={tab} + variant="fullWidth" + > + + + + )} +
+ {state && combinedResults.length > 0 && ( + <> + {(tab === 0 || !mobileW) && ( + + {combinedResults.map( + (result: SearchResultRefined) => { + if (result.type === "box") + return ( + } + /> + ); + return ( + } + /> + ); + } + )} + + )} + {(tab === 1 || !mobileW) && ( + + {state?.files.map((file: FileSearchResult) => ( + + ))} + + )} + + )} + {(!state || combinedResults.length === 0) && ( + + )} +
+
+
+ ); +} diff --git a/conformance-search/src/pages/pages.spec.tsx b/conformance-search/src/pages/pages.spec.tsx new file mode 100644 index 0000000..9d131fb --- /dev/null +++ b/conformance-search/src/pages/pages.spec.tsx @@ -0,0 +1,196 @@ +// @vitest-environment jsdom +import { fireEvent, render, screen, within } from "@testing-library/react"; +import { BrowserRouter } from "react-router-dom"; +import { describe, expect, it, vi } from "vitest"; +import Search from "@/lib/search"; +import CoverageView from "@/pages/CoveragePage"; +import HomeView from "@/pages/SearchPage"; + +Object.defineProperty(window, "matchMedia", { + writable: true, + value: vi.fn().mockImplementation((query) => ({ + matches: false, + media: query, + onchange: null, + addListener: vi.fn(), // deprecated + removeListener: vi.fn(), // deprecated + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn() + })) +}); + +Object.defineProperty(window, "scrollTo", { + writable: true, + value: vi.fn() +}); + +describe("Views", () => { + it("should render HomeView", async () => { + render( + + + + ); + const text = await screen.findByText(/Coverage Statistics/i); + expect(text).toBeInTheDocument(); + }); + + it("should render CoverageView", async () => { + render( + + + + ); + const text = await screen.findByText(/File Statistics/i); + expect(text).toBeInTheDocument(); + }); +}); + +describe("Search", () => { + const search = async (query: string) => { + // Render + render( + + + + ); + + // Search for the query and wait for the results to appear + const input = await screen.findByTestId(/search-input/i); + fireEvent.input(input, { + target: { value: query } + }); + }; + + const validate = async (query: string | number[]) => { + let resultCounts = query; + if (typeof query === "string") { + // Get actual result counts + const mSearch = await Search.getInstance(); + const { boxes, features } = await mSearch.search(query); + const { files } = mSearch.refine( + boxes.map((box) => ({ + ...box, + exclude: false, + count: 0, + type: "box" + })), + features.map((feature) => ({ + ...feature, + exclude: false, + count: 0, + type: "feature" + })), + true + ); + + resultCounts = [boxes.length + features.length, files.length]; + } + + // Wait for the results to appear + const lists = await screen.findAllByTestId(/list-view/i); + expect(lists.length).toBe(2); + + // Left list + const llist = lists[0]; + const lelements = within(llist).getAllByTestId("list-item"); + const lresults = within(llist).getAllByTestId("list-item-key"); + const lresultTitle = within(llist).getByText(/Search resulted in/i, { + exact: false + }); + expect(lresultTitle.textContent).toBe(`Search resulted in ${resultCounts[0]} hits`); + expect(lresults.length).toBe(resultCounts[0]); + + const rlist = lists[1]; + const relements = within(rlist).getAllByTestId("list-item"); + const rresults = within(rlist).getAllByTestId("list-item-key"); + const rresultTitle = within(rlist).getByText(/Search resulted in/i, { + exact: false + }); + expect(rresultTitle.textContent).toBe(`Search resulted in ${resultCounts[1]} hits`); + expect(rresults.length).toBe(resultCounts[1]); + + return { + lists: [lresults, rresults], + elements: [lelements, relements], + resultCounts + }; + }; + + it("should perform a search", async () => { + await search("=trun"); + const { + lists: [lresult, rresult] + } = await validate("=trun"); + + // Check that first result is trun box + expect(lresult[0].textContent).toBe("trun"); + + // Check that second file result is 21_segment.mp4 + expect(rresult[1].textContent).toBe("21_segment.mp4"); + }); + + it("should be able to select/unselect a result", async () => { + await search("trun"); + const { + elements: [lelements], + resultCounts + } = await validate("trun"); + + // Uncheck the first result + const checkbox = within(lelements[1]).getByTestId(/list-item-checkbox/i); + fireEvent.click(checkbox); + + // Check that box order and files are updated + const newCounts: number[] = resultCounts as number[]; + newCounts[1] += 1; + await validate(newCounts); + }); + + it("should be able to select version 0", async () => { + await search("=trun"); + const { + elements: [lelements] + } = await validate("=trun"); + + // Open versions drawer + const drawerButton = await within(lelements[0]).findByText(/Versions/i); + fireEvent.click(drawerButton); + + // Wait for drawer to open + const firstVersion = await within(lelements[0]).findByTestId(/list-item-version-0/i); + fireEvent.click(firstVersion); + + // Check that files are updated + const { + lists: [, rresult] + } = await validate([1, 18]); + + // Check that first file result is a4-tone-fragmented.mp4 + expect(rresult[1].textContent).toBe("a4-tone-fragmented.mp4"); + }); + + it("should be able to select first flag", async () => { + await search("=trun"); + const { + elements: [lelements] + } = await validate("=trun"); + + // Open versions drawer + const drawerButton = await within(lelements[0]).findByText(/Flags/i); + fireEvent.click(drawerButton); + + // Wait for drawer to open + const firstFlag = await within(lelements[0]).findByTestId(/list-item-flag-0/i); + fireEvent.click(firstFlag); + + // Check that files are updated + const { + lists: [, rresult] + } = await validate([1, 3]); + + // Check that first file result is a4-tone-fragmented.mp4 + expect(rresult[0].textContent).toBe("a4-tone-fragmented.mp4"); + }); +}); diff --git a/conformance-search/src/types/index.ts b/conformance-search/src/types/index.ts new file mode 100644 index 0000000..9ab34cc --- /dev/null +++ b/conformance-search/src/types/index.ts @@ -0,0 +1,93 @@ +import Fuse from "fuse.js"; +import { FileMetadata } from "./json"; + +export type Box = { + fourcc: string; + spec: string; + codec: string; + description: string; + type: string; + versions: number[]; + flags: ( + | { + name: string; + value: string; + description: string; + } + | { + wildcard: string; + } + )[]; + containers: { + fourcc: string; + type: string; + }[]; + syntax: string; +}; + +export type Feature = { + name: string; + description: string; + spec: string; +}; + +export type Filter = { + type: string; + value: string; +}; + +export type FilterConverted = { + [key: string]: string; +}; + +export type SearchResult = { + item: T; + score: number; + actualScore: number; + refIndex: number; +}; + +export type SearchResultRefined = SearchResult & { + count: number; + type: string; + exclude: boolean; + refinements?: { + variant: { + versions: { + value: number[]; + }; + flags: { + value: string[]; + exact: boolean; + }; + }; + }; +}; + +export type FuseSearchWithScore = Fuse.FuseResult & { + score: number; + actualScore: number; +}; + +export type FileSearchResult = { + item: FileMetadata; + matches: { + type: string; + value: string; + }[]; +}; + +export type CoverageResults = { + boxes: { + covered: Fuse.FuseResult[]; + not_covered: Fuse.FuseResult[]; + under_consideration: Fuse.FuseResult[]; + [key: string]: Fuse.FuseResult[]; + }; + features: { + covered: Fuse.FuseResult[]; + not_covered: Fuse.FuseResult[]; + under_consideration: Fuse.FuseResult[]; + [key: string]: Fuse.FuseResult[]; + }; +}; diff --git a/conformance-search/src/types/json.ts b/conformance-search/src/types/json.ts new file mode 100644 index 0000000..672ca91 --- /dev/null +++ b/conformance-search/src/types/json.ts @@ -0,0 +1,111 @@ +export type Coverage = { + lists: { + boxes: { + covered: Array; + not_covered: Array; + under_consideration: Array; + }; + features: { + covered: Array; + not_covered: Array; + under_consideration: Array; + }; + }; + path_file_map: { + count: number; + non_empty: number; + overall_coverage: number; + published: { + count: number; + coverage: number; + }; + under_consideration: { + count: number; + coverage: number; + }; + }; + feature_file_map: { + count: number; + published_features: number; + under_consideration_features: number; + features_from_spec: number; + features_from_file: number; + }; + files: { + count: number; + published_count: number; + under_consideration_count: number; + }; + boxes: { + count: number; + }; + spec_info: Array<{ + ISO: string; + name: string; + version: number; + amendmends?: Array; + corrigenda?: Array; + }>; +}; + +export type FileMetadata = { + contributor: string; + description: string; + license: string; + md5: string; + rel_filepath: string; + abs_filepath: string; + version: number; + published: boolean; + associated_files: string[]; + mdms_number: string; + features: string[]; + conforms_to: { + ISO: string; + version: number; + amendmends?: Array; + corrigenda?: Array; + }[]; + notes: + | string + | { + [key: string]: unknown; + }; +}; + +export type FeatureFileMap = { + key: string; + description: string; + spec: string; + added_from_file: "spec" | "file"; + files: string[]; +}; + +export type Files = { + not_found: string[]; + path_file_map: { + [path: string]: { + [variant: string]: string[]; + }; + }; + feature_file_map: { + [feature: string]: FeatureFileMap; + }; + file_metadata: { + [file: string]: FileMetadata; + }; + boxes: { + [box: string]: string[][]; + }; +}; + +export type Dictionary = { + fourccs: string[]; + types: string[]; + specs: string[]; + registered_types: string[]; +}; + +export type Hierarchy = { + [key: string]: Hierarchy; +}; diff --git a/conformance-search/src/vite-env.d.ts b/conformance-search/src/vite-env.d.ts new file mode 100644 index 0000000..2e76573 --- /dev/null +++ b/conformance-search/src/vite-env.d.ts @@ -0,0 +1,4 @@ +/// + +declare const BUILD_TIMESTAMP: string; +declare const MP4BOX_BASE: string; diff --git a/conformance-search/tailwind.config.js b/conformance-search/tailwind.config.js new file mode 100644 index 0000000..bcaa7e0 --- /dev/null +++ b/conformance-search/tailwind.config.js @@ -0,0 +1,26 @@ +import defaultTheme from "tailwindcss/defaultTheme"; + +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{ts,tsx}"], + theme: { + screens: { + xs: "400px", + ...defaultTheme.screens + }, + extend: { + colors: { + paper: "#f5f5f5" + }, + borderWidth: { + 1: "1px" + } + } + }, + plugins: [ + ({ addVariant }) => { + addVariant("child", "& > *"); + addVariant("child-hover", "& > *:hover"); + } + ] +}; diff --git a/conformance-search/tests/__mocks__/boxes.json b/conformance-search/tests/__mocks__/boxes.json new file mode 100644 index 0000000..bceb681 --- /dev/null +++ b/conformance-search/tests/__mocks__/boxes.json @@ -0,0 +1,7931 @@ +[ + { + "fourcc": "!mof", + "spec": "14496-12", + "codec": null, + "description": "Compressed movie fragment", + "type": "CompressedBox", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "file", + "type": null + } + ], + "syntax": "aligned(8) class CompressedMovieFragmentBox\n\textends CompressedBox('!mof', 'moof') {\n}\n" + }, + { + "fourcc": "!mov", + "spec": "14496-12", + "codec": null, + "description": "Compressed movie", + "type": "CompressedBox", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "file", + "type": null + } + ], + "syntax": "aligned(8) class CompressedMovieBox\n\textends CompressedBox('!mov', 'moov') {\n}" + }, + { + "fourcc": "!six", + "spec": "14496-12", + "codec": null, + "description": "Compressed segment index", + "type": "CompressedBox", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "file", + "type": null + } + ], + "syntax": "aligned(8) class CompressedSegmentIndexBox\n\textends CompressedBox('!six', 'sidx') {\n}\n" + }, + { + "fourcc": "!ssx", + "spec": "14496-12", + "codec": null, + "description": "Compressed subsegment index", + "type": "CompressedBox", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "file", + "type": null + } + ], + "syntax": "aligned(8) class CompressedSubsegmentIndexBox\n\textends CompressedBox('!ssx', 'ssix') {\n}" + }, + { + "fourcc": "3dpr", + "spec": "14496-15", + "codec": null, + "description": "MVDDepthResolutionBox", + "type": "Box", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "mvdC", + "type": "Box" + }, + { + "fourcc": "a3dC", + "type": "Box" + } + ], + "syntax": "class MVDDepthResolutionBox extends Box('3dpr')\n{\n\tunsigned int(16) depth_width;\n\tunsigned int(16) depth_height;\n/* The following 5 fields are collectively optional; they are either all present or all absent. When grid_pos_num_views is not present, the for loop is not present, equivalent to grid_pos_num_views equal to 0. These fields may be present or absent whenever the box is present (e.g., in MVCDConfigurationBox or A3DConfigurationBox). */\n\tunsigned int(16) depth_hor_mult_minus1; // optional\n\tunsigned int(16) depth_ver_mult_minus1; // optional\n\tunsigned int(4) depth_hor_rsh; // optional\n\tunsigned int(4) depth_ver_rsh; // optional\n\tunsigned int(16) grid_pos_num_views; // optional\n\tfor(i = 0; i < grid_pos_num_vies; i++) {\n\t\tbit(6) reserved=0;\n\t\tunsigned int(10) grid_pos_view_id[i];\n\t\tsigned int(16) grid_pos_x[grid_pos_view_id[i]];\n\t\tsigned int(16) grid_pos_y[grid_pos_view_id[i]];\n\t}\n}" + }, + { + "fourcc": "a3d1", + "spec": "14496-15", + "codec": null, + "description": "3D-AVC track with 3D-AVC NAL units only", + "type": "A3DSampleEntry", + "registered_type": "Codecs", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "stsd", + "type": "FullBox" + } + ], + "syntax": "class A3DSampleEntry() extends VisualSampleEntry ('a3d1') {\r\n\tA3DConfigurationBox\ta3dconfig;\t\t// mandatory\r\n\tMVDScalabilityInformationSEIBox\tmvdscalinfosei;\t// optional\r\n\tViewIdentifierBox\tview_identifiers;\t\t// mandatory\r\n\tMPEG4ExtensionDescriptorsBox descr;\t\t// optional\tIntrinsicCameraParametersBox\tintrinsic_camera_params;\t// optional\r\n\tExtrinsicCameraParametersBox\textrinsic_camera_params\t// optional\r\n}" + }, + { + "fourcc": "a3d2", + "spec": "14496-15", + "codec": null, + "description": "3D-AVC track with 3D-AVC NAL units only", + "type": "A3DSampleEntry", + "registered_type": "Codecs", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "stsd", + "type": "FullBox" + } + ], + "syntax": "class A3DSampleEntry() extends VisualSampleEntry ('a3d2') {\r\n\tA3DConfigurationBox\ta3dconfig;\t\t// mandatory\r\n\tMVDScalabilityInformationSEIBox\tmvdscalinfosei;\t// optional\r\n\tViewIdentifierBox\tview_identifiers;\t\t// mandatory\r\n\tMPEG4ExtensionDescriptorsBox descr;\t\t// optional\tIntrinsicCameraParametersBox\tintrinsic_camera_params;\t// optional\r\n\tExtrinsicCameraParametersBox\textrinsic_camera_params\t// optional\r\n}" + }, + { + "fourcc": "a3d3", + "spec": "14496-15", + "codec": null, + "description": "3D-AVC track with 3D-AVC NAL units only", + "type": "A3DSampleEntry", + "registered_type": "Codecs", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "stsd", + "type": "FullBox" + } + ], + "syntax": "class A3DSampleEntry() extends VisualSampleEntry ('a3d3') {\r\n\tA3DConfigurationBox\ta3dconfig;\t\t// mandatory\r\n\tMVDScalabilityInformationSEIBox\tmvdscalinfosei;\t// optional\r\n\tViewIdentifierBox\tview_identifiers;\t\t// mandatory\r\n\tMPEG4ExtensionDescriptorsBox descr;\t\t// optional\tIntrinsicCameraParametersBox\tintrinsic_camera_params;\t// optional\r\n\tExtrinsicCameraParametersBox\textrinsic_camera_params\t// optional\r\n}" + }, + { + "fourcc": "a3d4", + "spec": "14496-15", + "codec": null, + "description": "3D-AVC track with 3D-AVC NAL units only", + "type": "A3DSampleEntry", + "registered_type": "Codecs", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "stsd", + "type": "FullBox" + } + ], + "syntax": "class A3DSampleEntry() extends VisualSampleEntry ('a3d4') {\r\n\tA3DConfigurationBox\ta3dconfig;\t\t// mandatory\r\n\tMVDScalabilityInformationSEIBox\tmvdscalinfosei;\t// optional\r\n\tViewIdentifierBox\tview_identifiers;\t\t// mandatory\r\n\tMPEG4ExtensionDescriptorsBox descr;\t\t// optional\tIntrinsicCameraParametersBox\tintrinsic_camera_params;\t// optional\r\n\tExtrinsicCameraParametersBox\textrinsic_camera_params\t// optional\r\n}" + }, + { + "fourcc": "a3dC", + "spec": "14496-15", + "codec": null, + "description": "A3D configuration", + "type": "Box", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "avc1", + "type": "AVCSampleEntry" + }, + { + "fourcc": "avc3", + "type": "AVCSampleEntry" + }, + { + "fourcc": "mvc1", + "type": "MVCSampleEntry" + }, + { + "fourcc": "mvc2", + "type": "MVCSampleEntry" + }, + { + "fourcc": "mvc3", + "type": "MVCSampleEntry" + }, + { + "fourcc": "mvc4", + "type": "MVCSampleEntry" + }, + { + "fourcc": "mvd1", + "type": "MVCDSampleEntry" + }, + { + "fourcc": "mvd2", + "type": "MVCDSampleEntry" + }, + { + "fourcc": "mvd3", + "type": "MVCDSampleEntry" + }, + { + "fourcc": "mvd4", + "type": "MVCDSampleEntry" + }, + { + "fourcc": "a3d1", + "type": "A3DSampleEntry" + }, + { + "fourcc": "a3d2", + "type": "A3DSampleEntry" + }, + { + "fourcc": "a3d3", + "type": "A3DSampleEntry" + }, + { + "fourcc": "a3d4", + "type": "A3DSampleEntry" + } + ], + "syntax": "class A3DConfigurationBox extends Box('a3dC') {\r\n\tMVDDecoderConfigurationRecord MVDConfig;\r\n\tMVDDepthResolutionBox mvdDepthRes;\t//Optional\r\n}" + }, + { + "fourcc": "acgl", + "spec": "14496-15", + "codec": null, + "description": "group of VVC subpicture tracks with common properties", + "type": "EntityToGroupBox", + "registered_type": "Entity Group Types", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "grpl", + "type": "Box" + } + ], + "syntax": "aligned(8) class SubpicCommonGroupBox extends EntityToGroupBox('acgl',0,0)\n{\tunsigned int(1) level_is_present_flag;\n\tunsigned int(1) level_is_static_flag;\n\tbit(6) reserved = 0;\n\tif( level_is_present_flag )\n\t\tunsigned int(8) level_idc;\n\tif( level_is_static_flag == 0 )\n\t\tunsigned_int(32) level_info_entity_idx;\n\tunsigned int(16) num_active_tracks;\n}" + }, + { + "fourcc": "adda", + "spec": "14496-12", + "codec": null, + "description": "additional audio tracks im multi-track DRC configuration", + "type": "TrackReferenceTypeBox", + "registered_type": "Track References", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "tref", + "type": "Box" + } + ], + "syntax": "aligned(8) class TrackReferenceTypeBox (unsigned int(32) reference_type) extends Box(reference_type) {\n\tunsigned int(32) track_IDs[];\n}" + }, + { + "fourcc": "adrc", + "spec": "14496-12", + "codec": null, + "description": "DRC metadata track containing dynamic DRC data", + "type": "TrackReferenceTypeBox", + "registered_type": "Track References", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "tref", + "type": "Box" + } + ], + "syntax": "aligned(8) class TrackReferenceTypeBox (unsigned int(32) reference_type) extends Box(reference_type) {\n\tunsigned int(32) track_IDs[];\n}" + }, + { + "fourcc": "aebr", + "spec": "23008-12", + "codec": null, + "description": "Auto exposure bracketing entity group", + "type": "EntityToGroupBox", + "registered_type": "Entity Group Types", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "grpl", + "type": "Box" + } + ], + "syntax": "aligned(8) class EntityToGroupBox(grouping_type, version, flags)\nextends FullBox(grouping_type, version, flags) {\n\tunsigned int(32) group_id;\n\tunsigned int(32) num_entities_in_group;\n\tfor(i=0; i= (1 << 8)) ? 16 : 8;\n\tfor (i = 0; i < num_entities_in_group; i++)\n\t\tunsigned int(subgroupIdLen) track_subgroup_id[i];\n\tfor (i = 0; i < num_subgroup_ids; i++)\n\t\tunsigned int(16) num_active_tracks[i];\n}" + }, + { + "fourcc": "assp", + "spec": "14496-12", + "codec": null, + "description": "alternative startup sequence properties", + "type": "FullBox", + "registered_type": "Boxes", + "versions": [ + 0, + 1 + ], + "flags": [], + "containers": [ + { + "fourcc": "trep", + "type": "FullBox" + } + ], + "syntax": "class AlternativeStartupSequencePropertiesBox extends FullBox('assp', version, 0) {\n\tif (version == 0) {\n\t\tsigned int(32)\t\tmin_initial_alt_startup_offset;\n\t}\n\telse if (version == 1) {\n\t\tunsigned int(32)\tnum_entries;\n\t\tfor (j=1; j <= num_entries; j++) {\n\t\t\tunsigned int(32)\tgrouping_type_parameter;\n\t\t\tsigned int(32)\t\tmin_initial_alt_startup_offset;\n\t\t}\n\t}\n}" + }, + { + "fourcc": "aud ", + "spec": "14496-15", + "codec": null, + "description": "Access unit delimiter", + "type": "VisualSampleGroupEntry", + "registered_type": "Sample Groups", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "sgpd", + "type": "FullBox" + } + ], + "syntax": "class AUDSampleEntry() extends VisualSampleGroupEntry ('aud ')\n{\n\tbit(24) audNalUnit;\n}" + }, + { + "fourcc": "auxC", + "spec": "23008-12", + "codec": null, + "description": "Auxiliary type", + "type": "ItemFullProperty", + "registered_type": "Item Properties", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "ipco", + "type": "Box" + } + ], + "syntax": "aligned(8) class AuxiliaryTypeProperty\nextends ItemFullProperty('auxC', version = 0, flags) {\n\tstring aux_type;\n\ttemplate unsigned int(8) aux_subtype[];\n\t\t// until the end of the box, the semantics depend on the aux_type value\n}" + }, + { + "fourcc": "auxi", + "spec": "23008-12", + "codec": null, + "description": "AuxiliaryTypeInfoBox", + "type": "FullBox", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "*", + "type": "SampleEntry" + } + ], + "syntax": "aligned(8) class AuxiliaryTypeInfoBox extends FullBox ('auxi', 0, 0)\n{\n\tstring aux_track_type;\n}" + }, + { + "fourcc": "auxl", + "spec": "14496-12", + "codec": null, + "description": "Auxiliary track reference", + "type": "TrackReferenceTypeBox", + "registered_type": "Track References", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "tref", + "type": "Box" + } + ], + "syntax": "aligned(8) class TrackReferenceTypeBox (unsigned int(32) reference_type) extends Box(reference_type) {\n\tunsigned int(32) track_IDs[];\n}" + }, + { + "fourcc": "auxl", + "spec": "23008-12", + "codec": null, + "description": "Auxiliary image item reference", + "type": "SingleItemTypeReferenceBox", + "registered_type": "Item References", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "iref", + "type": "FullBox" + } + ], + "syntax": "aligned(8) class SingleItemTypeReferenceBox(referenceType) extends Box(referenceType) {\n\tunsigned int(16) from_item_ID;\n\tunsigned int(16) reference_count;\n\tfor (j=0; j= 1) {\n\t\tbit(1) reserved = 0;\n\t\tbit(7) downmix_instructions_count;\n\t} else {\n\t\tint downmix_instructions_count = 1;\n\t}\n\tfor (a=1; a<=downmix_instructions_count; a++) { \n\t\tunsigned int(8) targetLayout;\n \t\tunsigned int(1) reserved = 0;\n\t\tunsigned int(7) targetChannelCount;\n\t\tbit(1) in_stream; \n\t\tunsigned int(7) downmix_ID;\n\t\tif (in_stream==0) \n\t\t{\t// downmix coefficients are out of stream and supplied here\n\t\t\tint i, j;\n\t\t\tif (version >= 1) {\n\t\t\t\tbit(4) bs_downmix_offset;\n\t\t\t\tint size = 4;\n\t\t\t\tfor (i=1; i <= targetChannelCount; i++){\n\t\t\t\t\tfor (j=1; j <= baseChannelCount; j++) {\n\t\t\t\t\t\tbit(5) bs_downmix_coefficient_v1;\n\t\t\t\t\t\tsize += 5;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbit(8 ceil(size / 8) \u2013 size) reserved = 0; // byte align\n\t\t\t} else {\n\t\t\t\tfor (i=1; i <= targetChannelCount; i++){\n\t\t\t\t\tfor (j=1; j <= baseChannelCount; j++) {\n\t\t\t\t\t\tbit(4) bs_downmix_coefficient;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}" + }, + { + "fourcc": "dobr", + "spec": "23008-12", + "codec": null, + "description": "Depth of field bracketing", + "type": "VisualSampleGroupEntry", + "registered_type": "Sample Groups", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "sgpd", + "type": "FullBox" + } + ], + "syntax": "aligned(8) class DepthOfFieldBracketingEntry\nextends VisualSampleGroupEntry('dobr') {\n\tint(8) f_stop_numerator;\n\tint(8) f_stop_denominator;\n}" + }, + { + "fourcc": "dobr", + "spec": "23008-12", + "codec": null, + "description": "Depth of field bracketing entity group", + "type": "EntityToGroupBox", + "registered_type": "Entity Group Types", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "grpl", + "type": "Box" + } + ], + "syntax": "aligned(8) class EntityToGroupBox(grouping_type, version, flags)\nextends FullBox(grouping_type, version, flags) {\n\tunsigned int(32) group_id;\n\tunsigned int(32) num_entities_in_group;\n\tfor(i=0; i 0)) {\n\t\t\t\tunsigned int(index_size*8)\titem_reference_index;\n\t\t\t}\n\t\t\tunsigned int(offset_size*8)\textent_offset;\n\t\t\tunsigned int(length_size*8)\textent_length;\n\t\t}\n\t}\n}" + }, + { + "fourcc": "imda", + "spec": "14496-12", + "codec": null, + "description": "Identified media data", + "type": "Box", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "file", + "type": null + } + ], + "syntax": "aligned(8) class IdentifiedMediaDataBox extends Box('imda') {\n\tunsigned int(32) imda_identifier;\n\tbit(8) data[]; // until the end of the box\n}" + }, + { + "fourcc": "imdt", + "spec": "14496-12", + "codec": null, + "description": "identified media data", + "type": "DataEntryBaseBox", + "registered_type": "Boxes", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "dref", + "type": "FullBox" + } + ], + "syntax": "aligned(8) class DataEntryImdaBox (bit(24) flags)\n\textends DataEntryBaseBox('imdt', flags) {\n\tunsigned int(32) imda_ref_identifier;\n}" + }, + { + "fourcc": "imir", + "spec": "23008-12", + "codec": null, + "description": "Image mirroring", + "type": "ItemProperty", + "registered_type": "Item Properties", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "ipco", + "type": "Box" + } + ], + "syntax": "aligned(8) class ImageMirror\nextends ItemProperty('imir') {\n\tunsigned int(7) reserved = 0;\n\tunsigned int(1) axis;\n}" + }, + { + "fourcc": "infe", + "spec": "14496-12", + "codec": null, + "description": "Item information entry", + "type": "FullBox", + "registered_type": "Boxes", + "versions": [ + 0, + 1, + 2, + 3 + ], + "flags": [ + { + "name": "part-of-presentation", + "value": "0x000001", + "description": "" + } + ], + "containers": [ + { + "fourcc": "iinf", + "type": "FullBox" + } + ], + "syntax": "aligned(8) class ItemInfoEntry\n\t\textends FullBox('infe', version, flags) {\n\tif ((version == 0) || (version == 1)) {\n\t\tunsigned int(16) item_ID;\n\t\tunsigned int(16) item_protection_index;\n\t\tutf8string item_name;\n\t\tutf8string content_type;\n\t\tutf8string content_encoding; //optional\n\t}\n\tif (version == 1) {\n\t\tunsigned int(32) extension_type; //optional\n\t\tItemInfoExtension(extension_type); //optional\n\t}\n\tif (version >= 2) {\n\t\tif (version == 2) {\n\t\t\tunsigned int(16) item_ID;\n\t\t} else if (version == 3) {\n\t\t\tunsigned int(32) item_ID;\n\t\t}\n\t\tunsigned int(16) item_protection_index;\n\t\tunsigned int(32) item_type;\n\t\tutf8string item_name;\n\t\tif (item_type=='mime') {\n\t\t\tutf8string content_type;\n\t\t\tutf8string content_encoding; //optional\n\t\t} else if (item_type == 'uri ') {\n\t\t\tutf8string item_uri_type;\n\t\t}\n\t}\n}" + }, + { + "fourcc": "ipco", + "spec": "14496-12", + "codec": null, + "description": "ItemPropertyContainerBox", + "type": "Box", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "iprp", + "type": "Box" + } + ], + "syntax": "aligned(8) class ItemPropertyContainerBox\n\textends Box('ipco')\n{\n\tBox properties[];\t// boxes derived from\n\t\t// ItemProperty or ItemFullProperty, or FreeSpaceBox(es)\n\t\t// to fill the box\n}\n" + }, + { + "fourcc": "ipma", + "spec": "14496-12", + "codec": null, + "description": "ItemPropertyAssociation", + "type": "FullBox", + "registered_type": "Boxes", + "versions": [ + 0, + 1 + ], + "flags": [], + "containers": [ + { + "fourcc": "iprp", + "type": "Box" + } + ], + "syntax": "aligned(8) class ItemPropertyAssociationBox\n\textends FullBox('ipma', version, flags)\n{\n\tunsigned int(32) entry_count;\n\tfor(i = 0; i < entry_count; i++) {\n\t\tif (version < 1)\n\t\t\tunsigned int(16)\titem_ID;\n\t\telse\n\t\t\tunsigned int(32)\titem_ID;\n\t\tunsigned int(8) association_count;\n\t\tfor (i=0; i=1 is allowed\n\tloudness\t\t\tTrackLoudnessInfo[];\n\t// not more than one AlbumLoudnessInfo box with version>=1 is allowed\talbumLoudness\tAlbumLoudnessInfo[];\n}" + }, + { + "fourcc": "maxr", + "spec": "14496-12", + "codec": null, + "description": "maximum data rate", + "type": "Box", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "hinf", + "type": "Box" + } + ], + "syntax": "aligned(8) class hintmaxrate extends Box('maxr') {\t// maximum data rate\n\tuint(32)\tperiod;\t\t\t// in milliseconds\n\tuint(32)\tbytes; }\t\t\t// max bytes sent in any period 'period' long\n\t\t\t\t\t\t\t\t\t// including RTP headers" + }, + { + "fourcc": "md5i", + "spec": "23008-12", + "codec": null, + "description": "MD5IntegrityBox", + "type": "FullBox", + "registered_type": "Boxes", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "meta", + "type": "FullBox" + } + ], + "syntax": "aligned(8) class MD5IntegrityBox()\nextends FullBox('md5i', version = 0, flags) {\n\tunsigned int(8)[16] input_MD5;\n\tunsigned int(32) input_4cc;\n\tif (input_4cc == 'sgpd') {\n\t\tunsigned int(32) grouping_type;\n\t\tif (flags&1)\n\t\t\tunsigned int(32) grouping_type_parameter;\n\t\tunsigned int(32) num_entries;\n\t\tfor(i=0; i=1) { unsigned int(32) default_length; }\n\tif (version>=2) {\n\t\tunsigned int(32) default_group_description_index;\n\t}\n\tunsigned int(32) entry_count;\n\tint i;\n\tfor (i = 1 ; i <= entry_count ; i++){\n\t\tif (version>=1) {\n\t\t\tif (default_length==0) {\n\t\t\t\tunsigned int(32) description_length;\n\t\t\t}\n\t\t}\n\t\tSampleGroupDescriptionEntry (grouping_type);\n\t\t// an instance of a class derived from SampleGroupDescriptionEntry\n\t\t// that is appropriate and permitted for the media type\n\t}\n}" + }, + { + "fourcc": "sidx", + "spec": "14496-12", + "codec": null, + "description": "Segment Index Box", + "type": "CompressedBox", + "registered_type": "Boxes", + "versions": [ + 0, + 1 + ], + "flags": [], + "containers": [ + { + "fourcc": "file", + "type": null + } + ], + "syntax": "aligned(8) class CompressedSegmentIndexBox\n\textends CompressedBox('!six', 'sidx') {\n}\n" + }, + { + "fourcc": "sinf", + "spec": "14496-12", + "codec": null, + "description": "protection scheme information box", + "type": "Box", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "ipro", + "type": "FullBox" + }, + { + "fourcc": "*", + "type": "SampleEntry" + } + ], + "syntax": "aligned(8) class ProtectionSchemeInfoBox(fmt) extends Box('sinf') {\n\tOriginalFormatBox(fmt)\toriginal_format;\n\n\tSchemeTypeBox\t\t\tscheme_type_box;\t\t// optional\n\tSchemeInformationBox\tinfo;\t\t\t\t\t\t// optional\n}" + }, + { + "fourcc": "skip", + "spec": "14496-12", + "codec": null, + "description": "free space", + "type": "Box", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "*", + "type": "*" + } + ], + "syntax": "aligned(8) class FreeSpaceBox extends Box('skip') {\nunsigned int(8) data[];\n}" + }, + { + "fourcc": "sm2t", + "spec": "14496-12", + "codec": null, + "description": "MPEG-2 Transport Server", + "type": "MPEG2TSSampleEntry", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "stsd", + "type": "FullBox" + } + ], + "syntax": "class MPEG2TSServerSampleEntry extends MPEG2TSSampleEntry('sm2t') {}" + }, + { + "fourcc": "smhd", + "spec": "14496-12", + "codec": null, + "description": "sound media header, overall information (sound track only)", + "type": "FullBox", + "registered_type": "Boxes", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "minf", + "type": "Box" + } + ], + "syntax": "aligned(8) class SoundMediaHeaderBox\n\textends FullBox('smhd', version = 0, 0) {\n\ttemplate int(16) balance = 0;\n\tconst unsigned int(16)\treserved = 0;\n}" + }, + { + "fourcc": "snim", + "spec": "14496-12", + "codec": null, + "description": "sequence number identified media data", + "type": "DataEntryBaseBox", + "registered_type": "Boxes", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "dref", + "type": "FullBox" + } + ], + "syntax": "aligned(8) class DataEntrySeqNumImdaBox (bit(24) flags)\n\textends DataEntryBaseBox ('snim', flags) {\n}" + }, + { + "fourcc": "snro", + "spec": "14496-12", + "codec": null, + "description": "sequenceoffset", + "type": "Box", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "srtp", + "type": "HintSampleEntry" + }, + { + "fourcc": "rtp ", + "type": "HintSampleEntry" + } + ], + "syntax": "class timescaleentry() extends Box('tims') {\n\tuint(32)\ttimescale;\n}\n\nclass timeoffset() extends Box('tsro') {\n\tint(32)\t\toffset;\n}\n\nclass sequenceoffset() extends Box('snro') {\n\tint(32)\t\toffset;\n}" + }, + { + "fourcc": "snut", + "spec": "14496-15", + "codec": null, + "description": "a group of VVC subpicture tracks where the VCL NAL units of the time-aligned samples have the same NAL unit type", + "type": "TrackGroupTypeBox", + "registered_type": "Track Group Types", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "trgr", + "type": "Box" + } + ], + "syntax": "aligned(8) class TrackGroupTypeBox('snut') extends FullBox('snut', version = 0, flags = 0)\n{\n\tunsigned int(32) track_group_id;\n\t// the remaining data may be specified \n\t// for a particular track_group_type\n}" + }, + { + "fourcc": "spid", + "spec": "14496-15", + "codec": null, + "description": "VVC subpicture ID", + "type": "VisualSampleGroupEntry", + "registered_type": "Sample Groups", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "sgpd", + "type": "FullBox" + } + ], + "syntax": "aligned(8) class VvcSubpicIDEntry() extends VisualSampleGroupEntry('spid')\n{\n\tunsigned int(1) rect_region_flag;\n\tbit(2) reserved = 0;\n\tunsigned int(1) continuous_id_flag;\n\tunsigned int(12) num_subpics_minus1;\n\tfor (i = 0; i <= num_subpics_minus1; i++) {\n\t\tif ((continuous_id_flag && i == 0) || !continuous_id_flag)\n\t\t\tunsigned int(16) subpic_id[i];\n\t\tif (rect_region_flag)\n\t\t\tunsigned int(16) groupID[i];\n\t}\n}" + }, + { + "fourcc": "spli", + "spec": "14496-15", + "codec": null, + "description": "VVC subpicture level information", + "type": "VisualSampleGroupEntry", + "registered_type": "Sample Groups", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "sgpd", + "type": "FullBox" + } + ], + "syntax": "aligned(8) class SubpicLevelInfoEntry() extends VisualSampleGroupEntry('spli')\n{\n\tunsigned int(8) level_idc;\n}" + }, + { + "fourcc": "spor", + "spec": "14496-15", + "codec": null, + "description": "VVC subpicture order", + "type": "VisualSampleGroupEntry", + "registered_type": "Sample Groups", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "sgpd", + "type": "FullBox" + } + ], + "syntax": "aligned(8) class VvcSubpicOrderEntry() extends VisualSampleGroupEntry('spor')\n{\n\tunsigned int(1) subpic_id_info_flag;\n\tunsigned int(15) num_subpic_ref_idx;\n\tfor (i = 0; i < num_subpic_ref_idx; i++)\n\t\tunsigned int(16) subp_track_ref_idx[i];\n\tif (subpic_id_info_flag)\n\t\tVVCSubpicIDRewritingInfomationStruct() subpic_id_rewriting_info;\n}" + }, + { + "fourcc": "srat", + "spec": "14496-12", + "codec": null, + "description": "Sampling rate", + "type": "FullBox", + "registered_type": "Boxes", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "*", + "type": "AudioSampleEntry" + } + ], + "syntax": "aligned(8) class SamplingRateBox extends FullBox('srat') {\n\tunsigned int(32) sampling_rate;\n}" + }, + { + "fourcc": "srpp", + "spec": "14496-12", + "codec": null, + "description": "STRP Process", + "type": "FullBox", + "registered_type": "Boxes", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "srtp", + "type": "HintSampleEntry" + } + ], + "syntax": "aligned(8) class SRTPProcessBox extends FullBox('srpp', version, 0) {\n\tunsigned int(32)\t\tencryption_algorithm_rtp;\n\tunsigned int(32)\t\tencryption_algorithm_rtcp;\n\tunsigned int(32)\t\tintegrity_algorithm_rtp;\n\tunsigned int(32)\t\tintegrity_algorithm_rtcp;\n\tSchemeTypeBox\t\t\tscheme_type_box;\n\tSchemeInformationBox\tinfo;\n}" + }, + { + "fourcc": "srtp", + "spec": "14496-12", + "codec": null, + "description": "SRTP Hints", + "type": "HintSampleEntry", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "stsd", + "type": "FullBox" + } + ], + "syntax": "class SrtpHintSampleEntry() extends HintSampleEntry ('srtp') {\n\tuint(16)\t\thinttrackversion = 1;\n\tuint(16)\t\thighestcompatibleversion = 1;\n\tuint(32)\t\tmaxpacketsize;\n}" + }, + { + "fourcc": "ssix", + "spec": "14496-12", + "codec": null, + "description": "Sub-sample index", + "type": "CompressedBox", + "registered_type": "Boxes", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "file", + "type": null + } + ], + "syntax": "aligned(8) class CompressedSubsegmentIndexBox\n\textends CompressedBox('!ssx', 'ssix') {\n}" + }, + { + "fourcc": "sstl", + "spec": "14496-15", + "codec": null, + "description": "SVC sub track layer box", + "type": "FullBox", + "registered_type": "Boxes", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "strd", + "type": "Box" + } + ], + "syntax": "aligned(8) class SVCSubTrackLayerBox\n\textends FullBox('sstl', 0, 0) {\n\tunsigned int(16) item_count;\n\tfor(i = 0; i< item_count; i++) {\n\t\tunsigned int(3)\tdependency_id;\n\t\tunsigned int(4)\tquality_id;\n\t\tunsigned int(3)\ttemporal_id;\n\t\tunsigned int(6)\tpriority_id;\n\t\tunsigned int(2)\tdependency_id_range;\n\t\tunsigned int(2) \tquality_id_range;\n\t\tunsigned int(2)\ttemporal_id_range;\n\t\tunsigned int(2)\tpriority_id_range;\n\t}\n}" + }, + { + "fourcc": "stbl", + "spec": "14496-12", + "codec": null, + "description": "sample table box, container for the time/space map", + "type": "Box", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "minf", + "type": "Box" + } + ], + "syntax": "aligned(8) class SampleTableBox extends Box('stbl') {\n}" + }, + { + "fourcc": "stco", + "spec": "14496-12", + "codec": null, + "description": "chunk offset, partial data-offset information", + "type": "FullBox", + "registered_type": "Boxes", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "stbl", + "type": "Box" + } + ], + "syntax": "aligned(8) class ChunkOffsetBox\n\textends FullBox('stco', version = 0, 0) {\n\tunsigned int(32)\tentry_count;\n\tfor (i=1; i <= entry_count; i++) {\n\t\tunsigned int(32)\tchunk_offset;\n\t}\n}" + }, + { + "fourcc": "stcp", + "spec": "14496-12", + "codec": null, + "description": "SRTCP reception hint track", + "type": "HintSampleEntry", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "stsd", + "type": "FullBox" + } + ], + "syntax": "" + }, + { + "fourcc": "stdp", + "spec": "14496-12", + "codec": null, + "description": "sample degradation priority", + "type": "FullBox", + "registered_type": "Boxes", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "stbl", + "type": "Box" + } + ], + "syntax": "aligned(8) class DegradationPriorityBox\n\textends FullBox('stdp', version = 0, 0) {\n\tint i;\n\tfor (i=0; i < sample_count; i++) {\n\t\tunsigned int(16)\tpriority;\n\t}\n}" + }, + { + "fourcc": "ster", + "spec": "23008-12", + "codec": null, + "description": "Stereo entity grouping", + "type": "EntityToGroupBox", + "registered_type": "Entity Group Types", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "grpl", + "type": "Box" + } + ], + "syntax": "aligned(8) class EntityToGroupBox(grouping_type, version, flags)\nextends FullBox(grouping_type, version, flags) {\n\tunsigned int(32) group_id;\n\tunsigned int(32) num_entities_in_group;\n\tfor(i=0; i 0) {\n\t\t\tfor (j=0; j < subsample_count; j++) {\n\t\t\t\tif(version == 1)\n\t\t\t\t{\n\t\t\t\t\tunsigned int(32) subsample_size;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tunsigned int(16) subsample_size;\n\t\t\t\t}\n\t\t\t\tunsigned int(8) subsample_priority;\n\t\t\t\tunsigned int(8) discardable;\n\t\t\t\tunsigned int(32) codec_specific_parameters;\n\t\t\t}\n\t\t}\n\t}\n}" + }, + { + "fourcc": "subs", + "spec": "23008-12", + "codec": null, + "description": "Subsample information", + "type": "ItemProperty", + "registered_type": "Item Properties", + "versions": [ + 0, + 1 + ], + "flags": [], + "containers": [ + { + "fourcc": "ipco", + "type": "Box" + } + ], + "syntax": "aligned(8) class SubSampleInformationBox\n\textends FullBox('subs', version, flags) {\n\tunsigned int(32) entry_count;\n\tint i,j;\n\tfor (i=0; i < entry_count; i++) {\n\t\tunsigned int(32) sample_delta;\n\t\tunsigned int(16) subsample_count;\n\t\tif (subsample_count > 0) {\n\t\t\tfor (j=0; j < subsample_count; j++) {\n\t\t\t\tif(version == 1)\n\t\t\t\t{\n\t\t\t\t\tunsigned int(32) subsample_size;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tunsigned int(16) subsample_size;\n\t\t\t\t}\n\t\t\t\tunsigned int(8) subsample_priority;\n\t\t\t\tunsigned int(8) discardable;\n\t\t\t\tunsigned int(32) codec_specific_parameters;\n\t\t\t}\n\t\t}\n\t}\n}" + }, + { + "fourcc": "subt", + "spec": "14496-12", + "codec": null, + "description": "subtitle or timed text or overlay graphical information", + "type": "TrackReferenceTypeBox", + "registered_type": "Track References", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "tref", + "type": "Box" + } + ], + "syntax": "aligned(8) class TrackReferenceTypeBox (unsigned int(32) reference_type) extends Box(reference_type) {\n\tunsigned int(32) track_IDs[];\n}" + }, + { + "fourcc": "sulm", + "spec": "14496-15", + "codec": null, + "description": "VVC subpicture layout", + "type": "VisualSampleGroupEntry", + "registered_type": "Sample Groups", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "sgpd", + "type": "FullBox" + } + ], + "syntax": "class VvcSubpicLayoutMapEntry() extends VisualSampleGroupEntry ('sulm') {\n\tunsigned int(32) groupID_info_4cc;\n\tunsigned int(16) entry_count_minus1;\n\tfor(i=0; i <= entry_count_minus1; i++)\n\t\tunsigned int(16) groupID;\n}" + }, + { + "fourcc": "svdr", + "spec": "14496-15", + "codec": null, + "description": "SVC dependency range", + "type": "Box", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "scif", + "type": "VisualSampleGroupEntry" + } + ], + "syntax": "class SVCDependencyRangeBox extends Box('svdr') {\n\tunsigned int(3) min_dependency_id;\n\tunsigned int(3) min_temporal_id;\n\tbit(6) reserved = 0;\n\tunsigned int(4) min_quality_id;\n\tunsigned int(3) max_dependency_id;\n\tunsigned int(3) max_temporal_id;\n\tbit(6) reserved = 0;\n\tunsigned int(4) max_quality_id;\n}" + }, + { + "fourcc": "svip", + "spec": "14496-15", + "codec": null, + "description": "Initial parameter sets box for tiers", + "type": "Box", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "scif", + "type": "VisualSampleGroupEntry" + }, + { + "fourcc": "mvif", + "type": "VisualSampleGroupEntry" + } + ], + "syntax": "class InitialParameterSetBox extends Box ('svip') {\n\tunsigned int(8) sps_id_count;\n\tfor (i=0; i< sps_id_count; i++)\n\t\tunsigned int(8) SPS_index;\n\tunsigned int(8) pps_id_count;\n\tfor (i=0; i< pps_id_count; i++)\n\t\tunsigned int(8) PPS_index;\n}" + }, + { + "fourcc": "svpr", + "spec": "14496-15", + "codec": null, + "description": "Priority range", + "type": "Box", + "registered_type": "Boxes", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "scif", + "type": "VisualSampleGroupEntry" + }, + { + "fourcc": "mvif", + "type": "VisualSampleGroupEntry" + } + ], + "syntax": "class PriorityRangeBox extends Box('svpr') {\n\tbit(2) reserved1 = 0;\n\tunsigned int(6) min_priorityId;\n\tbit(2) reserved2 = 0;\n\tunsigned int(6) max_priorityId;\n}" + }, + { + "fourcc": "swfr", + "spec": "14496-15", + "codec": null, + "description": "AVC Switch from", + "type": "TrackReferenceTypeBox", + "registered_type": "Track References", + "versions": [], + "flags": [], + "containers": [ + { + "fourcc": "tref", + "type": "Box" + } + ], + "syntax": "aligned(8) class TrackReferenceTypeBox (unsigned int(32) reference_type) extends Box(reference_type) {\n\tunsigned int(32) track_IDs[];\n}" + }, + { + "fourcc": "swtc", + "spec": "14496-15", + "codec": null, + "description": "Multiview Group Relation", + "type": "FullBox", + "registered_type": "Boxes", + "versions": [ + 0 + ], + "flags": [], + "containers": [ + { + "fourcc": "mvci", + "type": "FullBox" + } + ], + "syntax": "aligned(8) class MultiviewGroupRelationBox() extends FullBox('swtc', version = 0, flags) {\n\tunsigned int(32) num_entries;\n\tfor (i=0; i