diff --git a/.env b/.env
index f0d8e65..6ba25e7 100644
--- a/.env
+++ b/.env
@@ -1,2 +1,6 @@
REACT_APP_GA_TRACKING_ID=G-XXXXXXXXXX
-REACT_APP_ENV=development
\ No newline at end of file
+REACT_APP_ENV=development
+DISABLE_ESLINT_PLUGIN=true
+TSC_COMPILE_ON_ERROR=true
+DANGEROUSLY_DISABLE_HOST_CHECK=true
+FAST_REFRESH=false
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 116697b..155e444 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,34 +8,27 @@
"name": "match-five",
"version": "0.1.0",
"dependencies": {
- "@reduxjs/toolkit": "^2.3.0",
- "@testing-library/jest-dom": "^6.0.0",
- "@testing-library/react": "^14.3.1",
- "@types/jest": "^29.5.14",
- "@types/node": "^16.18.0",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "@types/react-transition-group": "^4.4.11",
- "bootstrap": "^5.3.3",
+ "@reduxjs/toolkit": "^1.9.7",
+ "@types/node": "^16.18.68",
+ "@types/react": "^18.2.45",
+ "@types/react-dom": "^18.2.18",
+ "@types/react-redux": "^7.1.33",
+ "@types/react-router-dom": "^5.3.3",
+ "ajv": "^8.12.0",
+ "ajv-keywords": "^5.1.0",
+ "bootstrap": "^5.3.2",
+ "framer-motion": "^11.15.0",
"react": "^18.2.0",
- "react-bootstrap": "^2.10.5",
+ "react-bootstrap": "^2.9.1",
"react-dom": "^18.2.0",
- "react-ga4": "^2.1.0",
- "react-redux": "^9.1.2",
+ "react-icons": "^4.12.0",
+ "react-redux": "^8.1.3",
+ "react-router-dom": "^6.21.0",
"react-scripts": "5.0.1",
- "react-transition-group": "^4.4.5",
"typescript": "^4.9.5",
- "web-vitals": "^3.5.2"
- },
- "devDependencies": {
- "gh-pages": "^6.2.0"
+ "web-vitals": "^2.1.4"
}
},
- "node_modules/@adobe/css-tools": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz",
- "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ=="
- },
"node_modules/@alloc/quick-lru": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
@@ -59,6 +52,22 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@apideck/better-ajv-errors": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz",
+ "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==",
+ "dependencies": {
+ "json-schema": "^0.4.0",
+ "jsonpointer": "^5.0.0",
+ "leven": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "ajv": ">=8"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.26.2",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
@@ -73,9 +82,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.26.2",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz",
- "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz",
+ "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==",
"engines": {
"node": ">=6.9.0"
}
@@ -151,12 +160,12 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.26.2",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz",
- "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz",
+ "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==",
"dependencies": {
- "@babel/parser": "^7.26.2",
- "@babel/types": "^7.26.0",
+ "@babel/parser": "^7.26.3",
+ "@babel/types": "^7.26.3",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^3.0.2"
@@ -176,18 +185,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz",
- "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==",
- "dependencies": {
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
"node_modules/@babel/helper-compilation-targets": {
"version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
@@ -240,12 +237,12 @@
}
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz",
- "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz",
+ "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.25.9",
- "regexpu-core": "^6.1.1",
+ "regexpu-core": "^6.2.0",
"semver": "^6.3.1"
},
"engines": {
@@ -369,18 +366,6 @@
"@babel/core": "^7.0.0"
}
},
- "node_modules/@babel/helper-simple-access": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz",
- "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==",
- "dependencies": {
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
"version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
@@ -443,11 +428,11 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.26.2",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
- "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
+ "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
"dependencies": {
- "@babel/types": "^7.26.0"
+ "@babel/types": "^7.26.3"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -1111,11 +1096,10 @@
}
},
"node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz",
- "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz",
+ "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==",
"dependencies": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9",
"@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
@@ -1257,13 +1241,12 @@
}
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz",
- "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz",
+ "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
"dependencies": {
- "@babel/helper-module-transforms": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-simple-access": "^7.25.9"
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1698,9 +1681,9 @@
}
},
"node_modules/@babel/plugin-transform-typescript": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz",
- "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz",
+ "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.25.9",
"@babel/helper-create-class-features-plugin": "^7.25.9",
@@ -1878,9 +1861,9 @@
}
},
"node_modules/@babel/preset-react": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz",
- "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz",
+ "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==",
"dependencies": {
"@babel/helper-plugin-utils": "^7.25.9",
"@babel/helper-validator-option": "^7.25.9",
@@ -1939,15 +1922,15 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
- "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
+ "version": "7.26.4",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz",
+ "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==",
"dependencies": {
- "@babel/code-frame": "^7.25.9",
- "@babel/generator": "^7.25.9",
- "@babel/parser": "^7.25.9",
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.3",
+ "@babel/parser": "^7.26.3",
"@babel/template": "^7.25.9",
- "@babel/types": "^7.25.9",
+ "@babel/types": "^7.26.3",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -1956,9 +1939,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
- "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
+ "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
"dependencies": {
"@babel/helper-string-parser": "^7.25.9",
"@babel/helper-validator-identifier": "^7.25.9"
@@ -2289,6 +2272,21 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/@eslint/eslintrc/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
"node_modules/@eslint/eslintrc/node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -2319,6 +2317,11 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
"node_modules/@eslint/eslintrc/node_modules/type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
@@ -2561,25 +2564,6 @@
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
- "node_modules/@jest/expect-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
- "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
- "dependencies": {
- "jest-get-type": "^29.6.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/expect-utils/node_modules/jest-get-type": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
- "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
"node_modules/@jest/fake-timers": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
@@ -2774,9 +2758,9 @@
}
},
"node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
"dependencies": {
"@jridgewell/set-array": "^1.2.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
@@ -2970,18 +2954,18 @@
}
},
"node_modules/@reduxjs/toolkit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.3.0.tgz",
- "integrity": "sha512-WC7Yd6cNGfHx8zf+iu+Q1UPTfEcXhQ+ATi7CV1hlrSAaQBdlPzg7Ww/wJHNQem7qG9rxmWoFCDCPubSvFObGzA==",
+ "version": "1.9.7",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz",
+ "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==",
"dependencies": {
- "immer": "^10.0.3",
- "redux": "^5.0.1",
- "redux-thunk": "^3.1.0",
- "reselect": "^5.1.0"
+ "immer": "^9.0.21",
+ "redux": "^4.2.1",
+ "redux-thunk": "^2.4.2",
+ "reselect": "^4.1.8"
},
"peerDependencies": {
"react": "^16.9.0 || ^17.0.0 || ^18",
- "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
+ "react-redux": "^7.2.1 || ^8.0.2"
},
"peerDependenciesMeta": {
"react": {
@@ -2992,13 +2976,12 @@
}
}
},
- "node_modules/@reduxjs/toolkit/node_modules/immer": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz",
- "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/immer"
+ "node_modules/@remix-run/router": {
+ "version": "1.21.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz",
+ "integrity": "sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==",
+ "engines": {
+ "node": ">=14.0.0"
}
},
"node_modules/@restart/hooks": {
@@ -3371,85 +3354,6 @@
"tslib": "^2.8.0"
}
},
- "node_modules/@testing-library/dom": {
- "version": "9.3.4",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz",
- "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==",
- "dependencies": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^5.0.1",
- "aria-query": "5.1.3",
- "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/aria-query": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
- "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
- "dependencies": {
- "deep-equal": "^2.0.5"
- }
- },
- "node_modules/@testing-library/dom/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=="
- },
- "node_modules/@testing-library/jest-dom": {
- "version": "6.6.3",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz",
- "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==",
- "dependencies": {
- "@adobe/css-tools": "^4.4.0",
- "aria-query": "^5.0.0",
- "chalk": "^3.0.0",
- "css.escape": "^1.5.1",
- "dom-accessibility-api": "^0.6.3",
- "lodash": "^4.17.21",
- "redent": "^3.0.0"
- },
- "engines": {
- "node": ">=14",
- "npm": ">=6",
- "yarn": ">=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==",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@testing-library/react": {
- "version": "14.3.1",
- "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz",
- "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==",
- "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": "1.1.2",
"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
@@ -3466,11 +3370,6 @@
"node": ">=10.13.0"
}
},
- "node_modules/@types/aria-query": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
- "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="
- },
"node_modules/@types/babel__core": {
"version": "7.20.5",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@@ -3577,9 +3476,9 @@
}
},
"node_modules/@types/express-serve-static-core": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz",
- "integrity": "sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz",
+ "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==",
"dependencies": {
"@types/node": "*",
"@types/qs": "*",
@@ -3606,6 +3505,20 @@
"@types/node": "*"
}
},
+ "node_modules/@types/history": {
+ "version": "4.7.11",
+ "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
+ "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA=="
+ },
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz",
+ "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==",
+ "dependencies": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
"node_modules/@types/html-minifier-terser": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
@@ -3645,178 +3558,6 @@
"@types/istanbul-lib-report": "*"
}
},
- "node_modules/@types/jest": {
- "version": "29.5.14",
- "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz",
- "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==",
- "dependencies": {
- "expect": "^29.0.0",
- "pretty-format": "^29.0.0"
- }
- },
- "node_modules/@types/jest/node_modules/@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
- "dependencies": {
- "@sinclair/typebox": "^0.27.8"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@types/jest/node_modules/@jest/types": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
- "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "@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/@types/jest/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=="
- },
- "node_modules/@types/jest/node_modules/@types/yargs": {
- "version": "17.0.33",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
- "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "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==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@types/jest/node_modules/diff-sequences": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
- "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@types/jest/node_modules/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
- "dependencies": {
- "@jest/expect-utils": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@types/jest/node_modules/jest-diff": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
- "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
- "dependencies": {
- "chalk": "^4.0.0",
- "diff-sequences": "^29.6.3",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@types/jest/node_modules/jest-get-type": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
- "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@types/jest/node_modules/jest-matcher-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
- "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
- "dependencies": {
- "chalk": "^4.0.0",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@types/jest/node_modules/jest-message-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
- "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.6.3",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@types/jest/node_modules/jest-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
- "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@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/@types/jest/node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
- "dependencies": {
- "@jest/schemas": "^29.6.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.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
- },
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -3856,9 +3597,9 @@
"integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA=="
},
"node_modules/@types/prop-types": {
- "version": "15.7.13",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz",
- "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA=="
+ "version": "15.7.14",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ=="
},
"node_modules/@types/q": {
"version": "1.5.8",
@@ -3892,11 +3633,41 @@
"@types/react": "*"
}
},
- "node_modules/@types/react-transition-group": {
- "version": "4.4.11",
- "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz",
- "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==",
+ "node_modules/@types/react-redux": {
+ "version": "7.1.34",
+ "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz",
+ "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==",
+ "dependencies": {
+ "@types/hoist-non-react-statics": "^3.3.0",
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0",
+ "redux": "^4.0.0"
+ }
+ },
+ "node_modules/@types/react-router": {
+ "version": "5.1.20",
+ "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz",
+ "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-router-dom": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz",
+ "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==",
"dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router": "*"
+ }
+ },
+ "node_modules/@types/react-transition-group": {
+ "version": "4.4.12",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
+ "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
+ "peerDependencies": {
"@types/react": "*"
}
},
@@ -4213,9 +3984,9 @@
}
},
"node_modules/@ungap/structured-clone": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
- "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz",
+ "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA=="
},
"node_modules/@webassemblyjs/ast": {
"version": "1.14.1",
@@ -4463,14 +4234,14 @@
}
},
"node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"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"
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
},
"funding": {
"type": "github",
@@ -4493,32 +4264,15 @@
}
}
},
- "node_modules/ajv-formats/node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
+ "fast-deep-equal": "^3.1.3"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-formats/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- },
- "node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"peerDependencies": {
- "ajv": "^6.9.1"
+ "ajv": "^8.8.2"
}
},
"node_modules/ansi-escapes": {
@@ -4618,12 +4372,12 @@
}
},
"node_modules/array-buffer-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
- "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
"dependencies": {
- "call-bind": "^1.0.5",
- "is-array-buffer": "^3.0.4"
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
},
"engines": {
"node": ">= 0.4"
@@ -4703,14 +4457,14 @@
}
},
"node_modules/array.prototype.flat": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
- "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -4720,14 +4474,14 @@
}
},
"node_modules/array.prototype.flatmap": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
- "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -4772,18 +4526,17 @@
}
},
"node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
- "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
"dependencies": {
"array-buffer-byte-length": "^1.0.1",
- "call-bind": "^1.0.5",
+ "call-bind": "^1.0.8",
"define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.2.1",
- "get-intrinsic": "^1.2.3",
- "is-array-buffer": "^3.0.4",
- "is-shared-array-buffer": "^1.0.2"
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
},
"engines": {
"node": ">= 0.4"
@@ -4925,6 +4678,34 @@
"webpack": ">=2"
}
},
+ "node_modules/babel-loader/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/babel-loader/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/babel-loader/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
"node_modules/babel-loader/node_modules/schema-utils": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
@@ -5202,9 +4983,9 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/bonjour-service": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz",
- "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz",
+ "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==",
"dependencies": {
"fast-deep-equal": "^3.1.3",
"multicast-dns": "^7.2.5"
@@ -5259,9 +5040,9 @@
"integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
},
"node_modules/browserslist": {
- "version": "4.24.2",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
- "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz",
+ "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==",
"funding": [
{
"type": "opencollective",
@@ -5277,9 +5058,9 @@
}
],
"dependencies": {
- "caniuse-lite": "^1.0.30001669",
- "electron-to-chromium": "^1.5.41",
- "node-releases": "^2.0.18",
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
"update-browserslist-db": "^1.1.1"
},
"bin": {
@@ -5322,15 +5103,41 @@
}
},
"node_modules/call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
"dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
"es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
"get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
+ "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
+ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "get-intrinsic": "^1.2.6"
},
"engines": {
"node": ">= 0.4"
@@ -5387,9 +5194,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001680",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz",
- "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==",
+ "version": "1.0.30001690",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz",
+ "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==",
"funding": [
{
"type": "opencollective",
@@ -5834,9 +5641,9 @@
}
},
"node_modules/cross-spawn": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz",
- "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -6043,11 +5850,6 @@
"url": "https://github.com/sponsors/fb55"
}
},
- "node_modules/css.escape": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
- "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="
- },
"node_modules/cssdb": {
"version": "7.11.2",
"resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz",
@@ -6228,13 +6030,13 @@
}
},
"node_modules/data-view-buffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
- "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
+ "is-data-view": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -6244,27 +6046,27 @@
}
},
"node_modules/data-view-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
- "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
+ "is-data-view": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/inspect-js"
}
},
"node_modules/data-view-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
- "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"is-data-view": "^1.0.1"
},
@@ -6276,9 +6078,9 @@
}
},
"node_modules/debug": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"dependencies": {
"ms": "^2.1.3"
},
@@ -6301,37 +6103,6 @@
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
"integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA=="
},
- "node_modules/deep-equal": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
- "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==",
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "call-bind": "^1.0.5",
- "es-get-iterator": "^1.1.3",
- "get-intrinsic": "^1.2.2",
- "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.1",
- "side-channel": "^1.0.4",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -6522,11 +6293,6 @@
"node": ">=6.0.0"
}
},
- "node_modules/dom-accessibility-api": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
- "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="
- },
"node_modules/dom-converter": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
@@ -6637,6 +6403,19 @@
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
},
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -6667,15 +6446,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.59",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.59.tgz",
- "integrity": "sha512-faAXB6+gEbC8FsiRdpOXgOe4snP49YwjiXynEB8Mp7sUx80W5eN+BnnBHJ/F7eIeLzs+QBfDD40bJMm97oEFcw=="
- },
- "node_modules/email-addresses": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz",
- "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==",
- "dev": true
+ "version": "1.5.75",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz",
+ "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q=="
},
"node_modules/emittery": {
"version": "0.8.1",
@@ -6710,9 +6483,9 @@
}
},
"node_modules/enhanced-resolve": {
- "version": "5.17.1",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
- "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz",
+ "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==",
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
@@ -6746,56 +6519,57 @@
}
},
"node_modules/es-abstract": {
- "version": "1.23.5",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz",
- "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==",
+ "version": "1.23.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.7.tgz",
+ "integrity": "sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==",
"dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "arraybuffer.prototype.slice": "^1.0.3",
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "data-view-buffer": "^1.0.1",
- "data-view-byte-length": "^1.0.1",
- "data-view-byte-offset": "^1.0.0",
- "es-define-property": "^1.0.0",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.0.0",
"es-set-tostringtag": "^2.0.3",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.4",
- "get-symbol-description": "^1.0.2",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.2.6",
+ "get-symbol-description": "^1.1.0",
"globalthis": "^1.0.4",
- "gopd": "^1.0.1",
+ "gopd": "^1.2.0",
"has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.3",
- "has-symbols": "^1.0.3",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
"hasown": "^2.0.2",
- "internal-slot": "^1.0.7",
- "is-array-buffer": "^3.0.4",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
"is-callable": "^1.2.7",
- "is-data-view": "^1.0.1",
- "is-negative-zero": "^2.0.3",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.3",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.13",
- "is-weakref": "^1.0.2",
+ "is-data-view": "^1.0.2",
+ "is-regex": "^1.2.1",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.0",
+ "math-intrinsics": "^1.1.0",
"object-inspect": "^1.13.3",
"object-keys": "^1.1.1",
- "object.assign": "^4.1.5",
+ "object.assign": "^4.1.7",
"regexp.prototype.flags": "^1.5.3",
- "safe-array-concat": "^1.1.2",
- "safe-regex-test": "^1.0.3",
- "string.prototype.trim": "^1.2.9",
- "string.prototype.trimend": "^1.0.8",
+ "safe-array-concat": "^1.1.3",
+ "safe-regex-test": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
"string.prototype.trimstart": "^1.0.8",
- "typed-array-buffer": "^1.0.2",
- "typed-array-byte-length": "^1.0.1",
- "typed-array-byte-offset": "^1.0.2",
- "typed-array-length": "^1.0.6",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.15"
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.18"
},
"engines": {
"node": ">= 0.4"
@@ -6810,12 +6584,9 @@
"integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="
},
"node_modules/es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
- "dependencies": {
- "get-intrinsic": "^1.2.4"
- },
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"engines": {
"node": ">= 0.4"
}
@@ -6828,45 +6599,27 @@
"node": ">= 0.4"
}
},
- "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==",
- "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-iterator-helpers": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz",
- "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
+ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.3",
+ "es-abstract": "^1.23.6",
"es-errors": "^1.3.0",
"es-set-tostringtag": "^2.0.3",
"function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
+ "get-intrinsic": "^1.2.6",
"globalthis": "^1.0.4",
- "gopd": "^1.0.1",
+ "gopd": "^1.2.0",
"has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.3",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.7",
- "iterator.prototype": "^1.1.3",
- "safe-array-concat": "^1.1.2"
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.4",
+ "safe-array-concat": "^1.1.3"
},
"engines": {
"node": ">= 0.4"
@@ -6910,13 +6663,13 @@
}
},
"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==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
"dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
},
"engines": {
"node": ">= 0.4"
@@ -7397,6 +7150,21 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
+ "node_modules/eslint/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
"node_modules/eslint/node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -7442,6 +7210,11 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/eslint/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
"node_modules/eslint/node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -7632,9 +7405,9 @@
}
},
"node_modules/express": {
- "version": "4.21.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz",
- "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
@@ -7655,7 +7428,7 @@
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "path-to-regexp": "0.1.10",
+ "path-to-regexp": "0.1.12",
"proxy-addr": "~2.0.7",
"qs": "6.13.0",
"range-parser": "~1.2.1",
@@ -7670,6 +7443,10 @@
},
"engines": {
"node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/express/node_modules/debug": {
@@ -7788,6 +7565,34 @@
"webpack": "^4.0.0 || ^5.0.0"
}
},
+ "node_modules/file-loader/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/file-loader/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/file-loader/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
"node_modules/file-loader/node_modules/schema-utils": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
@@ -7832,32 +7637,6 @@
"node": ">=10"
}
},
- "node_modules/filename-reserved-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
- "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/filenamify": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
- "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
- "dev": true,
- "dependencies": {
- "filename-reserved-regex": "^2.0.0",
- "strip-outer": "^1.0.1",
- "trim-repeated": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/filesize": {
"version": "8.0.7",
"resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz",
@@ -7949,9 +7728,9 @@
}
},
"node_modules/flatted": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
- "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
+ "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA=="
},
"node_modules/follow-redirects": {
"version": "1.15.9",
@@ -8044,6 +7823,29 @@
}
}
},
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
"node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
@@ -8073,6 +7875,11 @@
"node": ">=10"
}
},
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
"node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
@@ -8131,11 +7938,37 @@
"url": "https://github.com/sponsors/rawify"
}
},
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "engines": {
+ "node_modules/framer-motion": {
+ "version": "11.15.0",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.15.0.tgz",
+ "integrity": "sha512-MLk8IvZntxOMg7lDBLw2qgTHHv664bYoYmnFTmE0Gm/FW67aOJk0WM3ctMcG+Xhcv+vh5uyyXwxvxhSeJzSe+w==",
+ "dependencies": {
+ "motion-dom": "^11.14.3",
+ "motion-utils": "^11.14.3",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "engines": {
"node": ">= 0.6"
}
},
@@ -8184,14 +8017,16 @@
}
},
"node_modules/function.prototype.name": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
- "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "functions-have-names": "^1.2.3"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
},
"engines": {
"node": ">= 0.4"
@@ -8225,15 +8060,20 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz",
+ "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==",
"dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "dunder-proto": "^1.0.0",
+ "es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
"function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
@@ -8267,13 +8107,13 @@
}
},
"node_modules/get-symbol-description": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
- "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
"dependencies": {
- "call-bind": "^1.0.5",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4"
+ "get-intrinsic": "^1.2.6"
},
"engines": {
"node": ">= 0.4"
@@ -8282,51 +8122,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/gh-pages": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-6.2.0.tgz",
- "integrity": "sha512-HMXJ8th9u5wRXaZCnLcs/d3oVvCHiZkaP5KQExQljYGwJjQbSPyTdHe/Gc1IvYUR/rWiZLxNobIqfoMHKTKjHQ==",
- "dev": true,
- "dependencies": {
- "async": "^3.2.4",
- "commander": "^11.0.0",
- "email-addresses": "^5.0.0",
- "filenamify": "^4.3.0",
- "find-cache-dir": "^3.3.1",
- "fs-extra": "^11.1.1",
- "globby": "^11.1.0"
- },
- "bin": {
- "gh-pages": "bin/gh-pages.js",
- "gh-pages-clean": "bin/gh-pages-clean.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/gh-pages/node_modules/commander": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
- "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
- "dev": true,
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/gh-pages/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -8441,11 +8236,11 @@
}
},
"node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dependencies": {
- "get-intrinsic": "^1.1.3"
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -8513,9 +8308,12 @@
}
},
"node_modules/has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -8524,9 +8322,9 @@
}
},
"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==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"engines": {
"node": ">= 0.4"
},
@@ -8567,6 +8365,19 @@
"he": "bin/he"
}
},
+ "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/hoopy": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
@@ -8916,14 +8727,6 @@
"node": ">=0.8.19"
}
},
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -8945,13 +8748,13 @@
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
},
"node_modules/internal-slot": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
- "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
"dependencies": {
"es-errors": "^1.3.0",
- "hasown": "^2.0.0",
- "side-channel": "^1.0.4"
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -8973,28 +8776,14 @@
"node": ">= 10"
}
},
- "node_modules/is-arguments": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
- "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-array-buffer": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
- "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
},
"engines": {
"node": ">= 0.4"
@@ -9023,11 +8812,14 @@
}
},
"node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
"dependencies": {
- "has-bigints": "^1.0.1"
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -9045,12 +8837,12 @@
}
},
"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==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz",
+ "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -9071,9 +8863,9 @@
}
},
"node_modules/is-core-module": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
- "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
"dependencies": {
"hasown": "^2.0.2"
},
@@ -9085,10 +8877,12 @@
}
},
"node_modules/is-data-view": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
- "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
"dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
"is-typed-array": "^1.1.13"
},
"engines": {
@@ -9099,11 +8893,12 @@
}
},
"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==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -9135,11 +8930,14 @@
}
},
"node_modules/is-finalizationregistry": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
- "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
"dependencies": {
- "call-bind": "^1.0.2"
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -9202,17 +9000,6 @@
"resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
"integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="
},
- "node_modules/is-negative-zero": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
- "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
- "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",
@@ -9222,11 +9009,12 @@
}
},
"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==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -9268,12 +9056,14 @@
"integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
},
"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==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -9310,11 +9100,11 @@
}
},
"node_modules/is-shared-array-buffer": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
- "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
"dependencies": {
- "call-bind": "^1.0.7"
+ "call-bound": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -9335,11 +9125,12 @@
}
},
"node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -9349,11 +9140,13 @@
}
},
"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==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
"dependencies": {
- "has-symbols": "^1.0.2"
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -9363,11 +9156,11 @@
}
},
"node_modules/is-typed-array": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
- "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
"dependencies": {
- "which-typed-array": "^1.1.14"
+ "which-typed-array": "^1.1.16"
},
"engines": {
"node": ">= 0.4"
@@ -9393,11 +9186,14 @@
}
},
"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==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz",
+ "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==",
"dependencies": {
- "call-bind": "^1.0.2"
+ "call-bound": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -9531,15 +9327,16 @@
}
},
"node_modules/iterator.prototype": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz",
- "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz",
+ "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==",
"dependencies": {
- "define-properties": "^1.2.1",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "reflect.getprototypeof": "^1.0.4",
- "set-function-name": "^2.0.1"
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "reflect.getprototypeof": "^1.0.8",
+ "set-function-name": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -10345,9 +10142,9 @@
}
},
"node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz",
- "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz",
+ "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==",
"engines": {
"node": ">=12.20"
}
@@ -10422,9 +10219,9 @@
}
},
"node_modules/jiti": {
- "version": "1.21.6",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
- "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
"bin": {
"jiti": "bin/jiti.js"
}
@@ -10492,9 +10289,9 @@
}
},
"node_modules/jsesc": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
- "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
"bin": {
"jsesc": "bin/jsesc"
},
@@ -10518,9 +10315,9 @@
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
},
"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=="
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
@@ -10772,14 +10569,6 @@
"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==",
- "bin": {
- "lz-string": "bin/bin.js"
- }
- },
"node_modules/magic-string": {
"version": "0.25.9",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
@@ -10818,6 +10607,14 @@
"tmpl": "1.0.5"
}
},
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/mdn-data": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
@@ -10921,14 +10718,6 @@
"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==",
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/mini-css-extract-plugin": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz",
@@ -10991,6 +10780,16 @@
"mkdirp": "bin/cmd.js"
}
},
+ "node_modules/motion-dom": {
+ "version": "11.14.3",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.14.3.tgz",
+ "integrity": "sha512-lW+D2wBy5vxLJi6aCP0xyxTxlTfiu+b+zcpVbGVFUxotwThqhdpPRSmX8xztAgtZMPMeU0WGVn/k1w4I+TbPqA=="
+ },
+ "node_modules/motion-utils": {
+ "version": "11.14.3",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.14.3.tgz",
+ "integrity": "sha512-Xg+8xnqIJTpr0L/cidfTTBFkvRw26ZtGGuIhA94J9PQ2p4mEa06Xx7QVYZH0BP+EpMSaDlu+q0I0mmvwADPsaQ=="
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -11019,9 +10818,9 @@
}
},
"node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"funding": [
{
"type": "github",
@@ -11081,9 +10880,9 @@
"integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="
},
"node_modules/node-releases": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
- "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="
},
"node_modules/normalize-path": {
"version": "3.0.0",
@@ -11135,9 +10934,9 @@
}
},
"node_modules/nwsapi": {
- "version": "2.2.13",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz",
- "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ=="
+ "version": "2.2.16",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz",
+ "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ=="
},
"node_modules/object-assign": {
"version": "4.1.1",
@@ -11166,21 +10965,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/object-is": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
- "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1"
- },
- "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",
@@ -11190,13 +10974,15 @@
}
},
"node_modules/object.assign": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
- "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
"dependencies": {
- "call-bind": "^1.0.5",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"define-properties": "^1.2.1",
- "has-symbols": "^1.0.3",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
"object-keys": "^1.1.1"
},
"engines": {
@@ -11270,11 +11056,12 @@
}
},
"node_modules/object.values": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
- "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"define-properties": "^1.2.1",
"es-object-atoms": "^1.0.0"
},
@@ -11522,9 +11309,9 @@
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
},
"node_modules/path-to-regexp": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
- "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w=="
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="
},
"node_modules/path-type": {
"version": "4.0.0",
@@ -12134,9 +11921,9 @@
}
},
"node_modules/postcss-load-config/node_modules/lilconfig": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
- "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
"engines": {
"node": ">=14"
},
@@ -12145,9 +11932,9 @@
}
},
"node_modules/postcss-load-config/node_modules/yaml": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz",
- "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz",
+ "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==",
"bin": {
"yaml": "bin.mjs"
},
@@ -12302,9 +12089,9 @@
}
},
"node_modules/postcss-modules-local-by-default": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz",
- "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
+ "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
"dependencies": {
"icss-utils": "^5.0.0",
"postcss-selector-parser": "^7.0.0",
@@ -13002,11 +12789,14 @@
}
},
"node_modules/psl": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.10.0.tgz",
- "integrity": "sha512-KSKHEbjAnpUuAUserOq0FxGXCUrzC3WniuSJhvdbs102rL55266ZcHBqLWOsG30spQMlPdpy7icATiAQehg/iA==",
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
"dependencies": {
"punycode": "^2.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/lupomontero"
}
},
"node_modules/punycode": {
@@ -13291,10 +13081,13 @@
"resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz",
"integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg=="
},
- "node_modules/react-ga4": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-2.1.0.tgz",
- "integrity": "sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ=="
+ "node_modules/react-icons": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz",
+ "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==",
+ "peerDependencies": {
+ "react": "*"
+ }
},
"node_modules/react-is": {
"version": "17.0.2",
@@ -13307,27 +13100,48 @@
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
},
"node_modules/react-redux": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz",
- "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==",
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz",
+ "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==",
"dependencies": {
+ "@babel/runtime": "^7.12.1",
+ "@types/hoist-non-react-statics": "^3.3.1",
"@types/use-sync-external-store": "^0.0.3",
+ "hoist-non-react-statics": "^3.3.2",
+ "react-is": "^18.0.0",
"use-sync-external-store": "^1.0.0"
},
"peerDependencies": {
- "@types/react": "^18.2.25",
- "react": "^18.0",
- "redux": "^5.0.0"
+ "@types/react": "^16.8 || ^17.0 || ^18.0",
+ "@types/react-dom": "^16.8 || ^17.0 || ^18.0",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0",
+ "react-native": ">=0.59",
+ "redux": "^4 || ^5.0.0-beta.0"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
+ "@types/react-dom": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ },
"redux": {
"optional": true
}
}
},
+ "node_modules/react-redux/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
+ },
"node_modules/react-refresh": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
@@ -13336,6 +13150,36 @@
"node": ">=0.10.0"
}
},
+ "node_modules/react-router": {
+ "version": "6.28.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.1.tgz",
+ "integrity": "sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==",
+ "dependencies": {
+ "@remix-run/router": "1.21.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.28.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.1.tgz",
+ "integrity": "sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==",
+ "dependencies": {
+ "@remix-run/router": "1.21.0",
+ "react-router": "6.28.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
"node_modules/react-scripts": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
@@ -13466,43 +13310,35 @@
"node": ">=6.0.0"
}
},
- "node_modules/redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "node_modules/redux": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
"dependencies": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
+ "@babel/runtime": "^7.9.2"
}
},
- "node_modules/redux": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
- "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="
- },
"node_modules/redux-thunk": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
- "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz",
+ "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==",
"peerDependencies": {
- "redux": "^5.0.0"
+ "redux": "^4"
}
},
"node_modules/reflect.getprototypeof": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
- "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz",
+ "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.1",
+ "dunder-proto": "^1.0.1",
+ "es-abstract": "^1.23.6",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "globalthis": "^1.0.3",
- "which-builtin-type": "^1.1.3"
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "which-builtin-type": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
@@ -13563,14 +13399,14 @@
}
},
"node_modules/regexpu-core": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz",
- "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
+ "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
"dependencies": {
"regenerate": "^1.4.2",
"regenerate-unicode-properties": "^10.2.0",
"regjsgen": "^0.8.0",
- "regjsparser": "^0.11.0",
+ "regjsparser": "^0.12.0",
"unicode-match-property-ecmascript": "^2.0.0",
"unicode-match-property-value-ecmascript": "^2.1.0"
},
@@ -13584,9 +13420,9 @@
"integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="
},
"node_modules/regjsparser": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz",
- "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==",
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz",
+ "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
"dependencies": {
"jsesc": "~3.0.2"
},
@@ -13594,6 +13430,17 @@
"regjsparser": "bin/parser"
}
},
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/relateurl": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
@@ -13636,22 +13483,25 @@
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
},
"node_modules/reselect": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
- "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
+ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="
},
"node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
"dependencies": {
- "is-core-module": "^2.13.0",
+ "is-core-module": "^2.16.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -13849,13 +13699,14 @@
}
},
"node_modules/safe-array-concat": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
- "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
"dependencies": {
- "call-bind": "^1.0.7",
- "get-intrinsic": "^1.2.4",
- "has-symbols": "^1.0.3",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
"isarray": "^2.0.5"
},
"engines": {
@@ -13885,13 +13736,13 @@
]
},
"node_modules/safe-regex-test": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
- "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bound": "^1.0.2",
"es-errors": "^1.3.0",
- "is-regex": "^1.1.4"
+ "is-regex": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
@@ -13972,9 +13823,9 @@
}
},
"node_modules/schema-utils": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
- "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
+ "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
@@ -13982,44 +13833,13 @@
"ajv-keywords": "^5.1.0"
},
"engines": {
- "node": ">= 12.13.0"
+ "node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
- "node_modules/schema-utils/node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/schema-utils/node_modules/ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dependencies": {
- "fast-deep-equal": "^3.1.3"
- },
- "peerDependencies": {
- "ajv": "^8.8.2"
- }
- },
- "node_modules/schema-utils/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- },
"node_modules/select-hose": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
@@ -14239,22 +14059,76 @@
}
},
"node_modules/shell-quote": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
- "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz",
+ "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dependencies": {
- "call-bind": "^1.0.7",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -14519,17 +14393,6 @@
"node": ">= 0.8"
}
},
- "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==",
- "dependencies": {
- "internal-slot": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@@ -14606,22 +14469,23 @@
}
},
"node_modules/string.prototype.matchall": {
- "version": "4.0.11",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
- "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
+ "es-abstract": "^1.23.6",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.7",
- "regexp.prototype.flags": "^1.5.2",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
"set-function-name": "^2.0.2",
- "side-channel": "^1.0.6"
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -14640,14 +14504,17 @@
}
},
"node_modules/string.prototype.trim": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
- "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.0",
- "es-object-atoms": "^1.0.0"
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -14657,14 +14524,18 @@
}
},
"node_modules/string.prototype.trimend": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
- "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
"define-properties": "^1.2.1",
"es-object-atoms": "^1.0.0"
},
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -14745,17 +14616,6 @@
"node": ">=6"
}
},
- "node_modules/strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dependencies": {
- "min-indent": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -14767,27 +14627,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/strip-outer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
- "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
- "dev": true,
- "dependencies": {
- "escape-string-regexp": "^1.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/strip-outer/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==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/style-loader": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz",
@@ -15077,9 +14916,9 @@
"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
},
"node_modules/tailwindcss": {
- "version": "3.4.15",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.15.tgz",
- "integrity": "sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==",
+ "version": "3.4.17",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
+ "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
@@ -15090,7 +14929,7 @@
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"jiti": "^1.21.6",
- "lilconfig": "^2.1.0",
+ "lilconfig": "^3.1.3",
"micromatch": "^4.0.8",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
@@ -15112,6 +14951,17 @@
"node": ">=14.0.0"
}
},
+ "node_modules/tailwindcss/node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
"node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -15172,9 +15022,9 @@
}
},
"node_modules/terser": {
- "version": "5.36.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz",
- "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==",
+ "version": "5.37.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz",
+ "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==",
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.8.2",
@@ -15189,15 +15039,15 @@
}
},
"node_modules/terser-webpack-plugin": {
- "version": "5.3.10",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
- "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
+ "version": "5.3.11",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz",
+ "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==",
"dependencies": {
- "@jridgewell/trace-mapping": "^0.3.20",
+ "@jridgewell/trace-mapping": "^0.3.25",
"jest-worker": "^27.4.5",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.1",
- "terser": "^5.26.0"
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
},
"engines": {
"node": ">= 10.13.0"
@@ -15221,23 +15071,6 @@
}
}
},
- "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
@@ -15347,27 +15180,6 @@
"node": ">=8"
}
},
- "node_modules/trim-repeated": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
- "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
- "dev": true,
- "dependencies": {
- "escape-string-regexp": "^1.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/trim-repeated/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==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/tryer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
@@ -15475,28 +15287,28 @@
}
},
"node_modules/typed-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
- "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-typed-array": "^1.1.13"
+ "is-typed-array": "^1.1.14"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/typed-array-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
- "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
},
"engines": {
"node": ">= 0.4"
@@ -15506,16 +15318,17 @@
}
},
"node_modules/typed-array-byte-offset": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
- "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
"dependencies": {
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
},
"engines": {
"node": ">= 0.4"
@@ -15525,16 +15338,16 @@
}
},
"node_modules/typed-array-length": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
- "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
"dependencies": {
"call-bind": "^1.0.7",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
- "has-proto": "^1.0.3",
"is-typed-array": "^1.1.13",
- "possible-typed-array-names": "^1.0.0"
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
},
"engines": {
"node": ">= 0.4"
@@ -15564,14 +15377,17 @@
}
},
"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==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
"dependencies": {
- "call-bind": "^1.0.2",
+ "call-bound": "^1.0.3",
"has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -15720,11 +15536,11 @@
}
},
"node_modules/use-sync-external-store": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz",
- "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz",
+ "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==",
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/util-deprecate": {
@@ -15850,9 +15666,9 @@
}
},
"node_modules/web-vitals": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.2.tgz",
- "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg=="
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz",
+ "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg=="
},
"node_modules/webidl-conversions": {
"version": "6.1.0",
@@ -15863,15 +15679,15 @@
}
},
"node_modules/webpack": {
- "version": "5.96.1",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz",
- "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==",
+ "version": "5.97.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz",
+ "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==",
"dependencies": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.6",
- "@webassemblyjs/ast": "^1.12.1",
- "@webassemblyjs/wasm-edit": "^1.12.1",
- "@webassemblyjs/wasm-parser": "^1.12.1",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
"acorn": "^8.14.0",
"browserslist": "^4.24.0",
"chrome-trace-event": "^1.0.2",
@@ -16050,6 +15866,29 @@
"node": ">=10.13.0"
}
},
+ "node_modules/webpack/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/webpack/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
"node_modules/webpack/node_modules/eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -16070,6 +15909,11 @@
"node": ">=4.0"
}
},
+ "node_modules/webpack/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
"node_modules/webpack/node_modules/schema-utils": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
@@ -16165,37 +16009,41 @@
}
},
"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==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
"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"
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/which-builtin-type": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz",
- "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
"dependencies": {
+ "call-bound": "^1.0.2",
"function.prototype.name": "^1.1.6",
"has-tostringtag": "^1.0.2",
"is-async-function": "^2.0.0",
- "is-date-object": "^1.0.5",
- "is-finalizationregistry": "^1.0.2",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
"is-generator-function": "^1.0.10",
- "is-regex": "^1.1.4",
+ "is-regex": "^1.2.1",
"is-weakref": "^1.0.2",
"isarray": "^2.0.5",
- "which-boxed-primitive": "^1.0.2",
+ "which-boxed-primitive": "^1.1.0",
"which-collection": "^1.0.2",
- "which-typed-array": "^1.1.15"
+ "which-typed-array": "^1.1.16"
},
"engines": {
"node": ">= 0.4"
@@ -16222,14 +16070,15 @@
}
},
"node_modules/which-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
- "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+ "version": "1.1.18",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz",
+ "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==",
"dependencies": {
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"for-each": "^0.3.3",
- "gopd": "^1.0.1",
+ "gopd": "^1.2.0",
"has-tostringtag": "^1.0.2"
},
"engines": {
@@ -16311,37 +16160,6 @@
"node": ">=10.0.0"
}
},
- "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz",
- "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==",
- "dependencies": {
- "json-schema": "^0.4.0",
- "jsonpointer": "^5.0.0",
- "leven": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "ajv": ">=8"
- }
- },
- "node_modules/workbox-build/node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
"node_modules/workbox-build/node_modules/fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
@@ -16356,11 +16174,6 @@
"node": ">=10"
}
},
- "node_modules/workbox-build/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- },
"node_modules/workbox-build/node_modules/source-map": {
"version": "0.8.0-beta.0",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
diff --git a/package.json b/package.json
index 9b5d5cb..bfd0677 100644
--- a/package.json
+++ b/package.json
@@ -1,35 +1,37 @@
{
"name": "match-five",
"version": "0.1.0",
- "homepage": "https://hamburgj.github.io/match-five",
"private": true,
"dependencies": {
- "@reduxjs/toolkit": "^2.3.0",
- "@testing-library/jest-dom": "^6.0.0",
- "@testing-library/react": "^14.3.1",
- "@types/jest": "^29.5.14",
- "@types/node": "^16.18.0",
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "@types/react-transition-group": "^4.4.11",
- "bootstrap": "^5.3.3",
+ "@reduxjs/toolkit": "^1.9.7",
+ "@types/node": "^16.18.68",
+ "@types/react": "^18.2.45",
+ "@types/react-dom": "^18.2.18",
+ "@types/react-redux": "^7.1.33",
+ "@types/react-router-dom": "^5.3.3",
+ "ajv": "^8.12.0",
+ "ajv-keywords": "^5.1.0",
+ "bootstrap": "^5.3.2",
+ "framer-motion": "^11.15.0",
"react": "^18.2.0",
- "react-bootstrap": "^2.10.5",
+ "react-bootstrap": "^2.9.1",
"react-dom": "^18.2.0",
- "react-ga4": "^2.1.0",
- "react-redux": "^9.1.2",
+ "react-icons": "^4.12.0",
+ "react-redux": "^8.1.3",
+ "react-router-dom": "^6.21.0",
"react-scripts": "5.0.1",
- "react-transition-group": "^4.4.5",
"typescript": "^4.9.5",
- "web-vitals": "^3.5.2"
+ "web-vitals": "^2.1.4"
},
"scripts": {
- "start": "react-scripts start",
+ "start": "set PORT=3010 && react-scripts start",
"build": "react-scripts build",
- "test": "react-scripts test",
- "eject": "react-scripts eject",
- "predeploy": "npm run build",
- "deploy": "gh-pages -d build"
+ "eject": "react-scripts eject"
+ },
+ "eslintConfig": {
+ "extends": [
+ "react-app"
+ ]
},
"browserslist": {
"production": [
diff --git a/public/favicon.svg b/public/favicon.svg
new file mode 100644
index 0000000..6e6480d
--- /dev/null
+++ b/public/favicon.svg
@@ -0,0 +1,8 @@
+
+
\ No newline at end of file
diff --git a/public/index.html b/public/index.html
index 50da021..6b42f49 100644
--- a/public/index.html
+++ b/public/index.html
@@ -2,43 +2,22 @@
-
+
-
+
-
-
+
-
- React App
-
+
+
+
+ Match Five
-
diff --git a/public/manifest.json b/public/manifest.json
index 080d6c7..9847bc0 100644
--- a/public/manifest.json
+++ b/public/manifest.json
@@ -1,25 +1,15 @@
{
- "short_name": "React App",
- "name": "Create React App Sample",
+ "short_name": "Match Five",
+ "name": "Match Five - Word Matching Game",
"icons": [
{
- "src": "favicon.ico",
+ "src": "favicon.svg",
"sizes": "64x64 32x32 24x24 16x16",
- "type": "image/x-icon"
- },
- {
- "src": "logo192.png",
- "type": "image/png",
- "sizes": "192x192"
- },
- {
- "src": "logo512.png",
- "type": "image/png",
- "sizes": "512x512"
+ "type": "image/svg+xml"
}
],
"start_url": ".",
"display": "standalone",
- "theme_color": "#000000",
+ "theme_color": "#1a237e",
"background_color": "#ffffff"
}
diff --git a/src/App.css b/src/App.css
index e625378..fdbe9a9 100644
--- a/src/App.css
+++ b/src/App.css
@@ -1,528 +1,602 @@
:root {
- --primary: #666666;
- --secondary: #888888;
- --accent: #666666;
- --success: #4CAF50;
- --danger: #F44336;
- --light: #FFFFFF;
- --dark: #333333;
- --text: #333333;
- --text-muted: rgba(51, 51, 51, 0.5);
- --background: #FFFFFF;
- --border: #666666;
-}
-
-.App {
- min-height: 100vh;
+ --primary: #4A4A4A;
+ --primary-variant: #2D2D2D;
+ --secondary: #8C8C8C;
+ --secondary-variant: #6B6B6B;
+ --background: #F5F5F5;
+ --surface: #FFFFFF;
+ --error: #D32F2F;
+ --success: #43A047;
+ --on-primary: #FFFFFF;
+ --on-secondary: #FFFFFF;
+ --on-background: #1A1A1A;
+ --on-surface: #1A1A1A;
+ --on-error: #FFFFFF;
+ --elevation-1: 0 2px 4px rgba(0,0,0,0.06);
+ --elevation-2: 0 4px 8px rgba(0,0,0,0.08);
+ --elevation-3: 0 8px 16px rgba(0,0,0,0.10);
+ --navbar-height: 56px;
+}
+
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
+ Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
background: var(--background);
- color: var(--text);
- padding: 10px;
- font-family: 'Poppins', sans-serif;
+ min-height: 100vh;
+ padding-top: var(--navbar-height);
}
-.App-logo {
- height: 40vmin;
- pointer-events: none;
+/* Navbar */
+.custom-navbar {
+ height: var(--navbar-height);
+ width: 100%;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 9999;
+ background: var(--surface);
+ box-shadow: var(--elevation-1);
+}
+
+/* Game board layout */
+.game-board {
+ padding: 0.5rem;
+ max-width: 1200px;
+ margin: 0 auto;
+ width: 100%;
}
-@media (prefers-reduced-motion: no-preference) {
- .App-logo {
- animation: App-logo-spin infinite 20s linear;
- }
+.level-title {
+ font-size: 1.25rem;
+ margin-bottom: 1rem;
+ color: var(--on-background);
}
-.App-header {
- background-color: #282c34;
- min-height: 100vh;
+.available-words-section {
+ background: var(--surface);
+ border-radius: 0.5rem;
+ padding: 1rem;
+ margin-bottom: 1rem;
+ box-shadow: var(--elevation-2);
+}
+
+.available-words-header {
display: flex;
- flex-direction: column;
+ justify-content: space-between;
align-items: center;
- justify-content: center;
- font-size: calc(10px + 2vmin);
- color: white;
- padding: 20px;
+ margin-bottom: 0.5rem;
}
-.App-link {
- color: #61dafb;
+.available-words-title {
+ font-size: 1rem;
+ color: var(--on-background);
+ margin-bottom: 0;
+ font-weight: 500;
}
-@keyframes App-logo-spin {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
+.available-words-container {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ padding: 0.5rem;
+ min-height: 50px;
+ border-radius: 0.5rem;
+ background: rgba(255, 255, 255, 0.05);
}
-/* Mobile-first responsive design */
-@media (max-width: 768px) {
- .App-header {
- font-size: calc(8px + 2vmin);
- padding: 10px;
- }
+.slots-grid {
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
+ gap: 0.5rem;
+ width: 100%;
}
-.game-universe {
- width: 100%;
- height: 100vh;
+.slot-card {
+ background: var(--surface);
+ border-radius: 0.5rem;
+ padding: 0.75rem;
+ height: 90px;
display: flex;
- justify-content: center;
- align-items: center;
- perspective: 1000px;
+ flex-direction: column;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ box-shadow: var(--elevation-1);
}
-.word-tile {
- background: white;
- padding: 4px 8px;
- border-radius: 2px;
- cursor: grab;
- user-select: none;
- color: var(--text);
- border: 1px solid var(--border);
- font-size: 0.9rem;
+.slot-card.correct {
+ background: linear-gradient(135deg, rgba(76, 175, 80, 0.1) 0%, rgba(76, 175, 80, 0.2) 100%);
+ border: 2px solid var(--success);
+ animation: pulse 1s cubic-bezier(0.4, 0, 0.6, 1);
}
-.word-tile:hover {
- transform: translateY(-2px);
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
+.slot-card.incorrect {
+ background: linear-gradient(135deg, rgba(176, 0, 32, 0.1) 0%, rgba(176, 0, 32, 0.2) 100%);
+ border: 2px solid var(--error);
+ animation: shake 0.5s cubic-bezier(0.36, 0, 0.66, 1);
}
-.empty-slot {
- border: 2px dashed rgba(255, 255, 255, 0.3);
- padding: 20px;
- border-radius: 8px;
- background: rgba(255, 255, 255, 0.1);
+.hint-word {
+ font-size: 1rem;
+ color: var(--on-surface);
+ opacity: 0.7;
+ margin-bottom: 0.25rem;
+ text-align: center;
}
-.card {
- background: rgba(255, 255, 255, 0.1);
- border: none;
- transition: all 0.3s ease;
+.word-tile {
+ background: var(--primary);
+ color: var(--on-primary);
+ padding: 0.15rem 0.75rem;
+ border-radius: 0.25rem;
+ cursor: grab;
+ user-select: none;
+ font-size: 0.8rem;
+ transition: all 0.2s ease;
+ box-shadow: var(--elevation-1);
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ width: fit-content;
}
-.card:hover {
- transform: translateY(-5px);
- box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
+.word-emoji {
+ font-size: 1em;
+ line-height: 1;
+ display: inline-block;
}
-.inventory-floating {
- position: sticky;
- top: 10px;
- background: white;
- border-radius: 4px;
- padding: 8px;
- border: 1px solid black;
+.word-container {
+ flex: 1;
+ display: flex;
+ justify-content: center;
+ align-items: center;
}
-.world-card {
- background: white;
- border: 1px solid black;
- margin-bottom: 6px;
+/* Drag and drop animations */
+.available-words-section.drag-over {
+ transform: scale(1.01);
+ box-shadow: var(--elevation-3);
transition: all 0.2s ease;
- border-radius: 4px;
- cursor: pointer;
- padding: 6px;
}
-.world-card:hover {
- background: #f5f5f5;
+.slot-card.drag-over {
+ transform: scale(1.02);
+ box-shadow: var(--elevation-3);
+ transition: all 0.2s ease;
+ background: rgba(74, 74, 74, 0.05);
}
-.level-card {
- background: white;
- margin: 4px 0;
- padding: 6px;
- border-radius: 4px;
- transition: all 0.2s ease;
- cursor: pointer;
- margin-left: 12px;
- border: 1px solid black;
+/* Make sure the word tile maintains its size in slots */
+.slot-card .word-tile {
+ width: fit-content;
+ min-width: 0;
+ max-width: 90%;
+}
+
+.word-tile:active {
+ cursor: grabbing;
}
-.level-card.completed {
- border-left: 3px solid black;
+/* Ensure the word container doesn't force the word to stretch */
+.word-container .word-tile {
+ flex: 0 0 auto;
}
-.level-card.locked {
+.empty-slot-text {
+ color: var(--on-surface);
opacity: 0.5;
- cursor: not-allowed;
+ font-size: 0.8rem;
+ text-align: center;
}
-.level-section.expanded {
- max-height: 1000px;
+/* Animations */
+@keyframes pulse {
+ 0%, 100% { transform: scale(1); }
+ 50% { transform: scale(1.05); }
}
-.word-tile {
- cursor: grab;
- user-select: none;
+@keyframes shake {
+ 0%, 100% { transform: translateX(0); }
+ 25% { transform: translateX(-4px); }
+ 75% { transform: translateX(4px); }
}
-.slot-card {
- background: white;
- border-radius: 4px;
- padding: 6px;
- width: 120px;
- height: 100px;
- display: flex;
- flex-direction: column;
- transition: all 0.2s ease;
- border: 1px solid var(--border);
- margin: 0 4px;
+/* Responsive adjustments */
+@media (max-width: 768px) {
+ .game-board {
+ padding: 0.5rem 0.25rem;
+ }
+
+ .level-title {
+ font-size: 1.125rem;
+ margin: 0.25rem 0;
+ }
+
+ .available-words-section {
+ padding: 0.75rem;
+ margin-bottom: 0.75rem;
+ }
+
+ .available-words-header {
+ margin-bottom: 0.5rem;
+ }
+
+ .slots-grid {
+ gap: 0.35rem;
+ }
+
+ .slot-card {
+ padding: 0.5rem;
+ height: 80px;
+ }
+
+ .word-tile {
+ padding: 0.15rem 0.5rem;
+ font-size: 0.6rem;
+ }
}
-.slot-card.correct {
- background: rgba(76, 175, 80, 0.1);
- border: 2px solid var(--success);
+/* Remove unused styles */
+.inventory-floating,
+.inventory-container,
+.inventory-col,
+.inventory-title,
+.inventory-words {
+ display: none;
}
-.slot-card.incorrect {
- background: rgba(244, 67, 54, 0.1);
- border: 2px solid var(--danger);
- color: white;
+/* Level Select Styles */
+.level-select-container {
+ padding: 2rem 1rem;
+ padding-top: calc(var(--navbar-height) + 2rem);
+ max-width: 1200px;
+ margin: 0 auto;
}
-.slot-card.drag-over {
- border: 2px dashed #666;
- background: rgba(0, 0, 0, 0.05);
+.level-select-title {
+ font-size: 2rem;
+ color: var(--on-background);
+ margin-bottom: 2rem;
+ text-align: center;
+ font-weight: 500;
}
-.word-tile.accepted {
- background: rgba(76, 175, 80, 0.1);
- border: 1px solid var(--success);
- color: var(--text);
+.levels-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+ gap: 1.5rem;
+ padding: 0.5rem;
}
-.word-tile.incorrect {
- background: rgba(244, 67, 54, 0.1);
- border: 1px solid var(--danger);
- color: var(--text);
+.level-select-card {
+ background: var(--surface);
+ border: none;
+ border-radius: 1rem;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ box-shadow: var(--elevation-1);
+ cursor: pointer;
+ overflow: hidden;
}
-.hint-word {
- font-size: 0.9rem;
- color: rgba(255, 255, 255, 0.7);
- margin-bottom: 12px;
- text-align: center;
+.level-select-card:not(.locked):hover {
+ transform: translateY(-4px);
+ box-shadow: var(--elevation-3);
}
-.word-container {
- flex: 1;
- display: flex;
- justify-content: center;
- align-items: center;
- min-height: 50px;
+.level-select-card.completed {
+ background: linear-gradient(135deg, rgba(67, 160, 71, 0.1) 0%, rgba(67, 160, 71, 0.2) 100%);
+ border: 2px solid var(--success);
}
-.empty-slot-text {
- color: rgba(255, 255, 255, 0.4);
- font-size: 0.9rem;
+.level-select-card.locked {
+ background: var(--surface);
+ border: 2px dashed rgba(0, 0, 0, 0.1);
+ cursor: not-allowed;
+ opacity: 0.7;
}
-.drop-zone {
- flex: 1;
+.level-select-card.coming-soon {
+ background: linear-gradient(135deg, rgba(33, 150, 243, 0.1) 0%, rgba(33, 150, 243, 0.2) 100%);
+ border: 2px dashed var(--primary);
+ cursor: default;
+ opacity: 0.9;
+}
+
+.level-header {
display: flex;
- justify-content: center;
+ justify-content: space-between;
align-items: center;
- border: 2px dashed rgba(255, 255, 255, 0.2);
- border-radius: 6px;
- margin-top: 20px;
- min-height: 80px;
- transition: all 0.2s ease;
+ margin-bottom: 1rem;
}
-.drop-zone.drag-over {
- background: rgba(255, 255, 255, 0.1);
- border-color: rgba(255, 255, 255, 0.4);
+.level-info {
+ flex: 1;
}
-.drop-text {
- color: rgba(255, 255, 255, 0.5);
- font-size: 0.9rem;
+.level-name {
+ font-size: 1.25rem;
+ color: var(--on-surface);
+ margin: 0;
+ font-weight: 500;
}
-.available-words {
- display: flex;
- flex-wrap: wrap;
- gap: 8px;
- padding: 12px;
- background: white;
- border: 1px solid var(--border);
- border-radius: 4px;
- min-height: 60px;
+.level-progress {
+ font-size: 0.875rem;
+ color: var(--on-surface);
+ opacity: 0.7;
+ margin-top: 0.25rem;
}
-.inventory-words {
+.level-status {
+ width: 2rem;
+ height: 2rem;
display: flex;
- flex-wrap: wrap;
- gap: 10px;
- padding: 15px;
- background: rgba(255, 255, 255, 0.05);
- border-radius: 8px;
- min-height: 60px;
-}
-
-.word-tile {
- background: #2a2a4a;
- padding: 8px 16px;
- border-radius: 6px;
- cursor: grab;
- transition: all 0.2s ease;
- user-select: none;
- color: white;
+ align-items: center;
+ justify-content: center;
+ border-radius: 50%;
+ background: var(--primary);
+ color: var(--on-primary);
+ margin-left: 1rem;
}
-.word-tile:hover {
- transform: translateY(-2px);
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
+.level-status.complete {
+ background: var(--success);
}
-.inventory-floating.drag-over {
- background: rgba(255, 255, 255, 0.15);
- box-shadow: 0 0 15px rgba(255, 255, 255, 0.1);
+.level-status.locked {
+ background: var(--error);
}
-.word-tile.accepted {
- background: #2a4a2a;
- border: 1px solid #4caf50;
- box-shadow: 0 0 8px rgba(76, 175, 80, 0.3);
+.solutions-row {
+ margin-top: 0.5rem;
+ padding-top: 0.5rem;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
}
-.word-tile.incorrect {
- background: #4a2a2a;
- border: 1px solid #f44336;
- box-shadow: 0 0 8px rgba(244, 67, 54, 0.3);
+.solutions-stars {
+ font-size: 1rem;
+ line-height: 1;
+ min-height: 1.5rem;
+ text-align: center;
}
-.worlds-container {
- padding: 15px;
- background: rgba(255, 255, 255, 0.05);
- border-radius: 12px;
- min-height: 100px;
- overflow: visible;
+.locked-message {
+ font-size: 0.875rem;
+ color: var(--error);
+ margin-top: 0.5rem;
+ text-align: center;
+ font-weight: 500;
}
-.world-card {
- background: var(--primary);
- border: none;
- margin-bottom: 10px;
- transition: all 0.3s ease;
- border-radius: 8px;
- cursor: pointer;
+/* Modal styles */
+.modal {
+ z-index: 10000;
}
-.world-card:hover {
- transform: translateX(5px);
- background: var(--secondary);
+.modal-backdrop {
+ z-index: 9999;
}
-.world-card.completed {
- background: var(--success);
- opacity: 0.8;
+.modal-content {
+ background: var(--surface);
+ border: none;
+ border-radius: 1rem;
+ box-shadow: var(--elevation-3);
}
-.level-card {
- background: var(--secondary);
- margin: 5px 0;
- padding: 10px;
- border-radius: 6px;
- transition: all 0.3s ease;
- cursor: pointer;
- margin-left: 20px;
- border-left: 3px solid var(--accent);
+.modal-header {
+ border-bottom: none;
+ padding: 1.5rem 1.5rem 0.5rem;
}
-.level-card.completed {
- border-left-color: var(--success);
- background: rgba(46, 204, 113, 0.2);
+.modal-header .modal-title {
+ font-size: 1.5rem;
+ font-weight: 600;
+ color: var(--on-surface);
}
-.level-card.locked {
- opacity: 0.5;
- cursor: not-allowed;
+.modal-body {
+ padding: 1rem 1.5rem;
+ color: var(--on-surface);
}
-.slot-container {
- display: flex;
- flex-direction: row;
- justify-content: center;
- flex-wrap: nowrap;
- gap: 8px;
- margin: 1rem 0;
- width: 100%;
+.modal-footer {
+ border-top: none;
+ padding: 0.5rem 1.5rem 1.5rem;
+ gap: 0.75rem;
}
-.slot-card {
- flex: 1;
- min-width: 120px;
- max-width: 300px;
- height: 100px;
- background: white;
- border-radius: 4px;
- padding: 6px;
- display: flex;
- flex-direction: column;
+.modal-footer .btn {
+ border-radius: 0.5rem;
+ padding: 0.5rem 1rem;
+ font-weight: 500;
transition: all 0.2s ease;
- border: 1px solid var(--border);
- margin: 0;
}
-.slot-card.correct {
- background: rgba(76, 175, 80, 0.1);
- border: 2px solid var(--success);
+.modal-footer .btn:hover {
+ transform: translateY(-1px);
}
-.slot-card.incorrect {
- background: rgba(244, 67, 54, 0.1);
- border: 2px solid var(--danger);
- color: white;
+.modal-footer .btn-secondary {
+ background: var(--surface);
+ border: 2px solid var(--primary);
+ color: var(--primary);
}
-.hint-word {
- font-size: 0.8rem;
- color: var(--text-muted);
- margin-bottom: 3px;
+.modal-footer .btn-secondary:hover {
+ background: var(--primary);
+ color: var(--on-primary);
}
-.word-container {
- flex: 1;
- display: flex;
- justify-content: center;
- align-items: center;
+.modal-footer .btn-info {
+ background: var(--primary-variant);
+ border: none;
+ color: var(--on-primary);
}
-.word-tile {
- background: var(--accent);
- padding: 5px 10px;
- border-radius: 4px;
- cursor: grab;
- transition: all 0.2s ease;
- user-select: none;
- font-size: 0.9rem;
+.modal-footer .btn-info:hover {
+ background: var(--primary);
}
-.word-tile:hover {
- transform: translateY(-2px);
- box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+.modal-footer .btn-primary {
+ background: linear-gradient(135deg, #2196f3 0%, #1976d2 100%);
+ border: none;
+ box-shadow: 0 2px 4px rgba(33, 150, 243, 0.3);
}
-.word-tile.accepted {
- background: var(--success);
+.modal-footer .btn-primary:hover {
+ background: linear-gradient(135deg, #1976d2 0%, #1565c0 100%);
+ box-shadow: 0 4px 8px rgba(33, 150, 243, 0.4);
}
-.word-tile.incorrect {
- background: var(--danger);
+.level-complete-stars {
+ font-size: 1.5rem;
+ text-align: center;
+ margin: 1rem 0;
+ line-height: 1;
}
-.inventory-floating {
- position: sticky;
- top: 20px;
- background: var(--primary);
- border-radius: 8px;
- padding: 15px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
- transition: all 0.3s ease;
+.level-complete-message {
+ text-align: center;
+ margin-bottom: 0.5rem;
}
-/* Custom scrollbar */
-::-webkit-scrollbar {
- width: 8px;
- height: 8px;
+.level-complete-submessage {
+ text-align: center;
+ color: var(--secondary);
+ font-size: 0.9rem;
}
-::-webkit-scrollbar-track {
- background: var(--dark);
-}
+@media (max-width: 768px) {
+ .levels-grid {
+ grid-template-columns: 1fr;
+ gap: 1rem;
+ }
-::-webkit-scrollbar-thumb {
- background: var(--accent);
- border-radius: 4px;
+ .level-select-title {
+ font-size: 1.5rem;
+ margin-bottom: 1.5rem;
+ }
}
-::-webkit-scrollbar-thumb:hover {
- background: var(--secondary);
+/* Home page styles */
+.temp-page {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: calc(100vh - var(--navbar-height));
+ font-size: 1.5rem;
+ color: #666;
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+ margin-top: calc(-1 * var(--navbar-height)); /* Offset the body padding */
}
-.world-section {
- margin-bottom: 1rem;
- overflow: visible;
+/* Tutorial overlay styles */
+.tutorial-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: none;
+ z-index: 10000;
}
-.world-card {
- cursor: pointer;
+.tutorial-spotlight {
+ position: fixed;
+ border-radius: 8px;
+ box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.5);
+ z-index: 10000;
+ pointer-events: none;
transition: all 0.3s ease;
}
-.world-card:hover {
- transform: translateY(-2px);
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+.tutorial-spotlight::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ border-radius: 8px;
+ box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.2);
}
-.level-section {
- padding: 1rem;
- margin-top: 0.5rem;
- background: rgba(255, 255, 255, 0.05);
+.tutorial-message {
+ color: var(--on-surface);
+ font-size: 0.95rem;
+ line-height: 1.5;
+ background: var(--surface);
+ padding: 16px 24px;
border-radius: 8px;
- overflow: visible;
- height: auto;
- max-height: none;
- transition: opacity 0.3s ease-out;
- opacity: 1;
- margin-top: 1rem;
+ box-shadow: var(--elevation-3);
}
-/* Bootstrap Collapse override */
-.collapse {
- display: none;
- overflow: visible !important;
+.tutorial-message button {
+ background: var(--primary) !important;
+ border: none !important;
+ transition: all 0.2s ease !important;
}
-.collapse.show {
- display: block;
- overflow: visible !important;
+.tutorial-message button:hover {
+ background: var(--primary-variant) !important;
+ transform: translateY(-1px);
}
-.collapsing {
- position: relative;
- height: 0;
- overflow: hidden;
- transition: height 0.35s ease;
-}
+/* Short screen adjustments */
+@media screen and (max-height: 750px) {
+ .game-board {
+ padding: 0.25rem;
+ }
-/* Level cards within collapsed section */
-.level-card {
- margin-bottom: 0.5rem;
-}
+ .level-title {
+ font-size: 1rem;
+ margin-bottom: 0.5rem;
+ }
-.empty-slot-text {
- color: #666;
- font-size: 0.9rem;
-}
+ .available-words-section {
+ padding: 0.5rem;
+ margin-bottom: 0.5rem;
+ }
-.hint-word {
- font-size: 0.9rem;
- color: #666;
- margin-bottom: 8px;
- text-align: center;
-}
+ .available-words-header {
+ margin-bottom: 0.25rem;
+ }
-.inventory-container {
- min-height: 100px;
- border: 2px solid var(--border);
- border-radius: 8px;
- padding: 15px;
-}
+ .available-words-title {
+ font-size: 0.9rem;
+ }
-.inventory-container.drag-over {
- border: 2px dashed var(--accent);
- background: rgba(0, 0, 0, 0.05);
-}
+ .available-words-container {
+ min-height: 40px;
+ padding: 0.25rem;
+ gap: 0.25rem;
+ }
-.inventory-words {
- display: flex;
- flex-wrap: wrap;
- gap: 8px;
- padding: 8px;
- min-height: 50px;
+ .word-tile {
+ padding: 0.15rem 0.5rem;
+ font-size: 0.6rem;
+ }
+
+ .slot-card {
+ height: 70px;
+ padding: 0.5rem;
+ }
+
+ .hint-word {
+ font-size: 0.8rem;
+ margin-bottom: 0.15rem;
+ }
+
+ .empty-slot-text {
+ font-size: 0.75rem;
+ }
}
diff --git a/src/App.test.tsx b/src/App.test.tsx
deleted file mode 100644
index 81bd52f..0000000
--- a/src/App.test.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import React from 'react';
-import { render, screen } from '@testing-library/react';
-import App from './App';
-
-describe('App Component', () => {
- it('renders without crashing', () => {
- render();
- });
-});
diff --git a/src/App.tsx b/src/App.tsx
index 86f8b17..7e554c3 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,42 +1,29 @@
-import React, { useEffect } from 'react';
-import { Provider, useDispatch } from 'react-redux';
-import { Container, Row, Col } from 'react-bootstrap';
+import React from 'react';
+import { HashRouter, Routes, Route } from 'react-router-dom';
+import { Provider } from 'react-redux';
import { store } from './store/store';
-import WorldSelector from './components/WorldSelector';
-import Inventory from './components/Inventory';
-import { loadSavedProgress } from './store/gameSlice';
+import Navbar from './components/Navbar';
+import Home from './components/Home';
+import LevelSelector from './components/LevelSelector';
+import GameBoard from './components/GameBoard';
import 'bootstrap/dist/css/bootstrap.min.css';
import './App.css';
-const GameContent: React.FC = () => {
- const dispatch = useDispatch();
-
- useEffect(() => {
- dispatch(loadSavedProgress());
- }, [dispatch]);
-
+function App() {
return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ } />
+ } />
+ } />
+
+
+
+
);
-};
-
-const App: React.FC = () => (
-
-
-
-);
+}
export default App;
diff --git a/src/components/FallingWords.tsx b/src/components/FallingWords.tsx
new file mode 100644
index 0000000..e01dfec
--- /dev/null
+++ b/src/components/FallingWords.tsx
@@ -0,0 +1,157 @@
+import React, { useEffect, useState, useRef } from 'react';
+import gameData from '../data/gameData.json';
+
+// Animation configuration constants
+const ANIMATION_CONFIG = {
+ NUM_WORDS: 20, // Number of words on screen
+ WORD_SCALE: 1, // Size scale of the words (1 = normal size)
+ WORD_OPACITY: 0.5, // Opacity of the words (0-1)
+ MIN_SPEED: 50, // Minimum fall speed (pixels per second)
+ MAX_SPEED: 150, // Maximum fall speed (pixels per second)
+ MIN_DELAY: 0, // Minimum delay before word starts falling (ms)
+ MAX_DELAY: 5000, // Maximum delay before word starts falling (ms)
+ VERTICAL_OFFSET: -50, // Starting position above viewport
+};
+
+interface FallingWord {
+ id: number;
+ text: string;
+ emoji: string;
+ x: number;
+ y: number;
+ speed: number;
+ delay: number;
+}
+
+const FallingWords: React.FC = () => {
+ const [words, setWords] = useState([]);
+ const [dimensions, setDimensions] = useState({ width: window.innerWidth, height: window.innerHeight });
+ const lastTimeRef = useRef(0);
+ const animationFrameRef = useRef();
+
+ // Get a random word and its emoji from the game data
+ const getRandomWord = () => {
+ const wordList = Object.entries(gameData.wordEmojis);
+ const [text, emoji] = wordList[Math.floor(Math.random() * wordList.length)];
+ return { text, emoji };
+ };
+
+ // Create a new falling word with random position and speed
+ const createFallingWord = (id: number, isInitial: boolean = false): FallingWord => {
+ const { text, emoji } = getRandomWord();
+ return {
+ id,
+ text,
+ emoji,
+ x: Math.random() * dimensions.width,
+ // If initial placement, distribute across screen height, otherwise start from top
+ y: isInitial ? Math.random() * dimensions.height : ANIMATION_CONFIG.VERTICAL_OFFSET,
+ speed: ANIMATION_CONFIG.MIN_SPEED + Math.random() * (ANIMATION_CONFIG.MAX_SPEED - ANIMATION_CONFIG.MIN_SPEED),
+ // No delay for initial words, normal delay for new words
+ delay: isInitial ? 0 : ANIMATION_CONFIG.MIN_DELAY + Math.random() * (ANIMATION_CONFIG.MAX_DELAY - ANIMATION_CONFIG.MIN_DELAY),
+ };
+ };
+
+ // Update window dimensions on resize
+ useEffect(() => {
+ const handleResize = () => {
+ const newWidth = window.innerWidth;
+ const newHeight = window.innerHeight;
+ setDimensions({ width: newWidth, height: newHeight });
+
+ // Redistribute words across new dimensions
+ setWords(currentWords =>
+ currentWords.map(word => ({
+ ...word,
+ x: (word.x / dimensions.width) * newWidth,
+ y: word.y < 0 ? word.y : (word.y / dimensions.height) * newHeight
+ }))
+ );
+ };
+
+ window.addEventListener('resize', handleResize);
+ return () => window.removeEventListener('resize', handleResize);
+ }, [dimensions.width, dimensions.height]);
+
+ // Initialize words
+ useEffect(() => {
+ const initialWords = Array.from(
+ { length: ANIMATION_CONFIG.NUM_WORDS },
+ (_, i) => createFallingWord(i, true)
+ );
+ setWords(initialWords);
+ lastTimeRef.current = performance.now();
+ }, []);
+
+ // Animate words using delta time
+ useEffect(() => {
+ const animate = (currentTime: number) => {
+ const deltaTime = currentTime - lastTimeRef.current;
+ lastTimeRef.current = currentTime;
+
+ setWords(currentWords => {
+ return currentWords.map(word => {
+ // Don't start moving until delay is over
+ if (word.delay > 0) {
+ return { ...word, delay: word.delay - deltaTime };
+ }
+
+ // Calculate new position based on speed and delta time
+ const pixelsPerFrame = (word.speed * deltaTime) / 1000;
+ const newY = word.y + pixelsPerFrame;
+
+ // Reset word if it goes off screen
+ if (newY > dimensions.height) {
+ return createFallingWord(word.id);
+ }
+ return { ...word, y: newY };
+ });
+ });
+
+ animationFrameRef.current = requestAnimationFrame(animate);
+ };
+
+ animationFrameRef.current = requestAnimationFrame(animate);
+ return () => {
+ if (animationFrameRef.current) {
+ cancelAnimationFrame(animationFrameRef.current);
+ }
+ };
+ }, [dimensions.height]);
+
+ return (
+
+ {words.map(word => (
+
+ {word.text}
+
+ {word.emoji}
+
+
+ ))}
+
+ );
+};
+
+export default FallingWords;
\ No newline at end of file
diff --git a/src/components/GameBoard.tsx b/src/components/GameBoard.tsx
index 05975d2..9127f3b 100644
--- a/src/components/GameBoard.tsx
+++ b/src/components/GameBoard.tsx
@@ -1,146 +1,681 @@
-import React, { useEffect } from 'react';
+import React, { useEffect, useState } from 'react';
import { useSelector, useDispatch } from 'react-redux';
-import { Container, Row, Col, Card } from 'react-bootstrap';
+import { useNavigate, useParams } from 'react-router-dom';
+import { Row, Col, Modal, Button } from 'react-bootstrap';
import { RootState } from '../store/store';
-import { placeWord, addToInventory, checkSolution } from '../store/gameSlice';
-import { Word, Slot } from '../store/types';
+import { placeWord, addToInventory, checkSolution, markSectionComplete, setCurrentSection } from '../store/gameSlice';
+import { Word, Slot, Section, Hint, HintDictionary } from '../store/types';
+import TutorialOverlay from './TutorialOverlay';
+import gameData from '../data/gameData.json';
+import '../styles/GameBoard.css';
+import WordTile from './WordTile';
-interface GameBoardProps {
- worldId: string;
- levelId: string;
+interface SectionWithId extends Section {
+ id: string;
}
-const GameBoard: React.FC = ({ worldId, levelId }) => {
+interface SectionCompletion {
+ isComplete: boolean;
+}
+
+interface LevelCompletion {
+ isComplete: boolean;
+ uniqueSolutions: Set;
+}
+
+interface TutorialStep {
+ targetSelector: string;
+ message: string;
+ position: 'bottom' | 'top' | 'left';
+}
+
+const GameBoard: React.FC = () => {
+ const { levelId = '' } = useParams();
+ const navigate = useNavigate();
const dispatch = useDispatch();
+ const [showLevelCompleteModal, setShowLevelCompleteModal] = useState(false);
+ const [showTutorial, setShowTutorial] = useState(false);
+ const [showHintTutorial, setShowHintTutorial] = useState(false);
+ const [tutorialStep, setTutorialStep] = useState(0);
+
+ // Get the current level and hints from Redux store
const level = useSelector((state: RootState) => {
- const world = state.game.worlds.find(w => w.id === worldId);
- return world?.levels.find(l => l.id === levelId);
+ const levelIndex = parseInt(levelId.split('_')[1]) - 1;
+ return state.game.levels[levelIndex];
+ });
+
+ const hints = useSelector((state: RootState) => state.game.hints);
+
+ // Check if a level is complete
+ const isLevelComplete = (levelId: string): boolean => {
+ const saved = localStorage.getItem(`level_completion_${levelId}`);
+ if (!saved) return false;
+ const completion = JSON.parse(saved);
+ return completion.isComplete;
+ };
+
+ // Check if the level is accessible
+ const isLevelAccessible = (levelId: string): boolean => {
+ if (levelId === 'level_1') return true;
+ const levelNum = parseInt(levelId.split('_')[1]);
+ const previousLevelId = `level_${levelNum - 1}`;
+ return isLevelComplete(previousLevelId);
+ };
+
+ // Redirect to home if level is not accessible
+ useEffect(() => {
+ if (!isLevelAccessible(levelId)) {
+ navigate('/');
+ }
+ }, [levelId, navigate]);
+
+ // Helper function to check if a section is complete
+ const checkSectionComplete = (levelId: string, sectionId: string): boolean => {
+ if (!level) return false;
+
+ const [_, levelNum, sectionNum] = sectionId.split('_').map(Number);
+ const targetSectionIndex = sectionNum - 1;
+ if (targetSectionIndex === -1) return false;
+
+ // Check all sections up to and including the target section
+ for (let i = 0; i <= targetSectionIndex; i++) {
+ const section = level.sections[i];
+ const sectionId = `section_${levelNum}_${i + 1}`;
+ const saved = localStorage.getItem(`completion_${levelId}_${sectionId}`);
+ if (!saved) return false;
+ const completion: SectionCompletion = JSON.parse(saved);
+ if (!completion.isComplete) return false;
+ }
+
+ return true;
+ };
+
+ // Get all unlocked sections up to the current section
+ const sections = useSelector((state: RootState) => {
+ if (!level) return [] as SectionWithId[];
+
+ const levelNum = parseInt(levelId.split('_')[1]);
+
+ // Find the first incomplete section based on stored completion state
+ const currentSectionIndex = level.sections.findIndex(section => {
+ const sectionId = `section_${levelNum}_${level.sections.indexOf(section) + 1}`;
+ return !checkSectionComplete(levelId, sectionId);
+ });
+
+ // If all sections are complete, show all sections
+ const lastIndex = currentSectionIndex === -1 ? level.sections.length : currentSectionIndex + 1;
+ return level.sections.slice(0, lastIndex) as SectionWithId[];
});
+ // Get all slots from unlocked sections in order
+ const allSlots = sections.flatMap(section => section.slots);
+
+ // Get only the current section's available words
+ const currentSection = sections[sections.length - 1] as SectionWithId | undefined;
+
+ // Tutorial steps for the first level
+ const tutorialSteps: TutorialStep[] = [
+ {
+ targetSelector: '.available-words-section',
+ message: 'Welcome to Match Five! These are your available words and inventory. Click or drag them to fill the slots below.',
+ position: 'bottom'
+ },
+ {
+ targetSelector: '.slots-grid',
+ message: 'Drop words into these slots. Each slot accepts specific words based on its hint.',
+ position: 'bottom'
+ }
+ ];
+
+ // Tutorial steps for when second section unlocks
+ const sectionTutorialSteps: TutorialStep[] = [
+ {
+ targetSelector: '.available-words-section',
+ message: 'New words are now available! You can use these new words along with your existing words.',
+ position: 'bottom'
+ },
+ {
+ targetSelector: '.slots-grid',
+ message: 'With more slots unlocked, you have more possible combinations! Try moving words between different slots to find new solutions. Be careful, some words have multiple possible matches!',
+ position: 'top'
+ }
+ ];
+
+ // Tutorial steps for incorrect word hint
+ const hintTutorialSteps: TutorialStep[] = [
+ {
+ targetSelector: '.slots-grid',
+ message: 'Remember that each slot can accept multiple different words! Think creatively about different ways words could fit the hint. Sometimes the first word that comes to mind isn\'t the right one.',
+ position: 'top'
+ }
+ ];
+
+ // Load and check tutorial state
useEffect(() => {
- if (level && level.slots.every(slot =>
- slot.currentWord && slot.acceptedWords.includes(slot.currentWord.text)
- )) {
- dispatch(checkSolution());
+ console.log('Tutorial check - Level ID:', levelId);
+ console.log('Tutorial check - Sections length:', sections.length);
+ console.log('Tutorial check - Level ID type:', typeof levelId);
+ console.log('Tutorial check - Level ID strict equality:', levelId === '1');
+ console.log('Tutorial check - Level ID includes:', levelId.includes('1'));
+
+ if (levelId.includes('level_1')) {
+ const hasSeenTutorial = localStorage.getItem('tutorial_completed') === 'true';
+ const hasSeenSectionTutorial = localStorage.getItem('section_tutorial_completed') === 'true';
+
+ console.log('Tutorial state:', {
+ hasSeenTutorial,
+ hasSeenSectionTutorial,
+ showTutorial,
+ tutorialStep
+ });
+
+ if (!hasSeenTutorial) {
+ console.log('Setting showTutorial to true - new user');
+ setShowTutorial(true);
+ } else if (sections.length === 2 && !hasSeenSectionTutorial) {
+ console.log('Setting showTutorial to true - second section unlocked');
+ setTutorialStep(0);
+ setShowTutorial(true);
+ }
}
- }, [level?.slots, dispatch, worldId, levelId]);
+ }, [levelId, sections.length]);
- if (!level) return null;
+ // Load saved game state
+ useEffect(() => {
+ if (!levelId || !level) return;
+
+ // Load section completion states
+ sections.forEach((section, index) => {
+ const levelNum = parseInt(levelId.split('_')[1]);
+ const sectionId = `section_${levelNum}_${index + 1}`;
+ const saved = localStorage.getItem(`completion_${levelId}_${sectionId}`);
+ if (saved) {
+ const completion = JSON.parse(saved);
+ if (completion.isComplete) {
+ dispatch(markSectionComplete({ levelId, sectionId }));
+ }
+ }
+ });
+
+ // Load level completion state
+ const levelCompletion = localStorage.getItem(`level_completion_${levelId}`);
+ if (levelCompletion) {
+ const completion = JSON.parse(levelCompletion);
+ if (completion.isComplete && completion.uniqueSolutions) {
+ completion.uniqueSolutions.forEach((solution: string) => {
+ saveLevelSolution(solution);
+ });
+ }
+ }
+ }, [levelId, level, sections, dispatch]);
+
+ // Save section completion state
+ useEffect(() => {
+ if (!currentSection || !levelId || !level) return;
+
+ // Check if ALL slots in ALL unlocked sections are correctly filled
+ const areAllSectionsComplete = sections.every(section =>
+ section.slots.every(slot => {
+ const hint = hints[slot.hintId];
+ return slot.currentWord && hint && hint.accepts.includes(slot.currentWord.text);
+ })
+ );
+
+ if (areAllSectionsComplete) {
+ // Save section completion
+ localStorage.setItem(
+ `completion_${levelId}_${currentSection.id}`,
+ JSON.stringify({ isComplete: true })
+ );
+ dispatch(markSectionComplete({ levelId, sectionId: currentSection.id }));
+
+ // If this was the last section, handle level completion
+ if (sections.length === level.sections.length) {
+ const solution = level.sections
+ .flatMap(section => section.slots)
+ .map(slot => slot.currentWord?.text)
+ .join(',');
+ const isNewSolution = saveLevelSolution(solution);
+ if (isNewSolution) {
+ setShowLevelCompleteModal(true);
+ }
+ }
+ }
+ }, [sections, levelId, currentSection, level, dispatch]);
+
+ // Check for all slots filled but with incorrect words
+ useEffect(() => {
+ if (!level || !levelId) return;
+
+ const hasSeenHintTutorial = localStorage.getItem('hint_tutorial_completed') === 'true';
+ if (hasSeenHintTutorial) return;
+
+ const allSlotsFilled = allSlots.every(slot => slot.currentWord);
+ const hasIncorrectWord = allSlots.some(slot => {
+ const hint = hints[slot.hintId];
+ return slot.currentWord && hint && !hint.accepts.includes(slot.currentWord.text);
+ });
+
+ if (allSlotsFilled && hasIncorrectWord) {
+ setShowHintTutorial(true);
+ }
+ }, [allSlots, level, levelId]);
+
+ const handleTutorialComplete = () => {
+ console.log('Tutorial completed');
+ setShowTutorial(false);
+ if (sections.length === 1) {
+ console.log('Saving initial tutorial completion');
+ localStorage.setItem('tutorial_completed', 'true');
+ } else {
+ console.log('Saving section tutorial completion');
+ localStorage.setItem('section_tutorial_completed', 'true');
+ }
+ };
+
+ const handleTutorialNext = () => {
+ console.log('Moving to next tutorial step:', tutorialStep + 1);
+ setTutorialStep(prev => prev + 1);
+ };
+
+ const handleHintTutorialComplete = () => {
+ setShowHintTutorial(false);
+ localStorage.setItem('hint_tutorial_completed', 'true');
+ };
+
+ const getLevelSolutions = (): Set => {
+ const saved = localStorage.getItem(`level_completion_${levelId}`);
+ if (!saved) return new Set();
+ const completion: LevelCompletion = JSON.parse(saved, (key, value) =>
+ key === 'uniqueSolutions' ? new Set(value) : value
+ );
+ return completion.uniqueSolutions;
+ };
+
+ const saveLevelSolution = (solution: string): boolean => {
+ const solutions = getLevelSolutions();
+ const isNewSolution = !solutions.has(solution);
+ solutions.add(solution);
+ localStorage.setItem(`level_completion_${levelId}`, JSON.stringify({
+ isComplete: true,
+ uniqueSolutions: Array.from(solutions)
+ }));
+ return isNewSolution;
+ };
+
+ const nextLevel = useSelector((state: RootState) => {
+ const levels = state.game.levels;
+ const currentLevelNum = parseInt(levelId.split('_')[1]);
+ return currentLevelNum < levels.length ? levels[currentLevelNum] : undefined;
+ });
const handleDrop = (e: React.DragEvent, slotId: string) => {
+ if (!currentSection || !levelId) return;
+
e.preventDefault();
e.currentTarget.classList.remove('drag-over');
const word = JSON.parse(e.dataTransfer.getData('word')) as Word;
- const sourceWorldId = e.dataTransfer.getData('sourceWorldId');
const sourceLevelId = e.dataTransfer.getData('sourceLevelId');
+ const sourceSectionId = e.dataTransfer.getData('sourceSectionId');
+ const sourceSlotId = e.dataTransfer.getData('sourceSlotId');
+ // Find the section that owns this slot
+ const targetSection = sections.find(section =>
+ section.slots.some(slot => slot.id === slotId)
+ );
+ if (!targetSection) return;
+
+ const levelNum = parseInt(levelId.split('_')[1]);
+ const sectionIndex = sections.indexOf(targetSection);
+ const targetSectionId = `section_${levelNum}_${sectionIndex + 1}`;
+
+ // If the slot already has a word and the source was another slot, switch the words
+ const existingWord = targetSection.slots.find(slot => slot.id === slotId)?.currentWord;
+ if (existingWord && sourceSlotId) {
+ // Move the existing word to the source slot
+ dispatch(placeWord({
+ levelId,
+ sectionId: sourceSectionId,
+ slotId: sourceSlotId,
+ word: existingWord,
+ sourceLevelId: levelId,
+ sourceSectionId: targetSectionId
+ }));
+ } else if (existingWord) {
+ // If source wasn't a slot (was inventory/available words), move to inventory
+ dispatch(placeWord({
+ levelId,
+ sectionId: targetSectionId,
+ slotId: 'inventory',
+ word: existingWord,
+ sourceLevelId: levelId,
+ sourceSectionId: targetSectionId
+ }));
+ }
+
+ // Place the new word in the target slot
dispatch(placeWord({
- worldId,
levelId,
+ sectionId: targetSectionId,
slotId,
word,
- sourceWorldId,
- sourceLevelId
+ sourceLevelId,
+ sourceSectionId
}));
};
+ // Add cleanup function for drag states
+ const cleanupDragStates = () => {
+ document.querySelectorAll('.drag-over').forEach(element => {
+ element.classList.remove('drag-over');
+ });
+ };
+
const handleDragStart = (e: React.DragEvent, word: Word) => {
+ if (!currentSection || !levelId) return;
+
e.dataTransfer.setData('word', JSON.stringify(word));
- e.dataTransfer.setData('sourceWorldId', worldId);
e.dataTransfer.setData('sourceLevelId', levelId);
+
+ // Find the section and slot that contains this word
+ let sourceSection;
+ let sourceSlot;
+ for (const section of sections) {
+ sourceSlot = section.slots.find(slot => slot.currentWord?.id === word.id);
+ if (sourceSlot) {
+ sourceSection = section;
+ break;
+ }
+ }
+
+ const sectionId = sourceSection?.id || currentSection.id;
+ e.dataTransfer.setData('sourceSectionId', sectionId);
+ if (sourceSlot) {
+ e.dataTransfer.setData('sourceSlotId', sourceSlot.id);
+ }
+ };
+
+ const handleDragEnd = () => {
+ cleanupDragStates();
+ };
+
+ const handleInventoryDrop = (e: React.DragEvent) => {
+ if (!currentSection || !levelId) return;
+
+ e.preventDefault();
+ e.currentTarget.classList.remove('drag-over');
+ const word = JSON.parse(e.dataTransfer.getData('word')) as Word;
+ const sourceLevelId = e.dataTransfer.getData('sourceLevelId');
+ const sourceSectionId = e.dataTransfer.getData('sourceSectionId');
+
+ dispatch(placeWord({
+ levelId,
+ sectionId: currentSection.id,
+ slotId: 'inventory',
+ word,
+ sourceLevelId,
+ sourceSectionId
+ }));
};
const handleWordClick = (word: Word, fromSlot: boolean = false) => {
+ if (!currentSection || !levelId) return;
+
if (fromSlot) {
+ const sourceSection = sections.find(section =>
+ section.slots.some(slot => slot.currentWord?.id === word.id)
+ );
+ if (!sourceSection) return;
+
dispatch(placeWord({
- worldId,
levelId,
+ sectionId: sourceSection.id,
slotId: 'inventory',
word,
- sourceWorldId: worldId,
- sourceLevelId: levelId
+ sourceLevelId: levelId,
+ sourceSectionId: sourceSection.id
}));
} else {
- dispatch(addToInventory({
- worldId,
+ // For words from the available words section
+ dispatch(placeWord({
levelId,
+ sectionId: currentSection.id,
+ slotId: 'inventory',
word,
- sourceWorldId: worldId,
- sourceLevelId: levelId
+ sourceLevelId: levelId,
+ sourceSectionId: currentSection.id
}));
}
};
const isWordAccepted = (word: Word, slot: Slot) => {
- return slot.acceptedWords.includes(word.text);
+ const hint = hints[slot.hintId];
+ return hint ? hint.accepts.includes(word.text) : false;
};
- const isLevelComplete = () => {
- return level.slots.every(slot =>
- slot.currentWord && slot.acceptedWords.includes(slot.currentWord.text)
- );
+ const getHintText = (hintId: string): string => {
+ // The hintId is the same as the display text in our case
+ return hintId;
+ };
+
+ const handleReturnAllToInventory = () => {
+ if (!levelId) return;
+
+ // Move all words from slots to inventory
+ sections.forEach(section => {
+ section.slots.forEach(slot => {
+ if (slot.currentWord) {
+ dispatch(placeWord({
+ levelId,
+ sectionId: section.id,
+ slotId: 'inventory',
+ word: slot.currentWord,
+ sourceLevelId: levelId,
+ sourceSectionId: section.id
+ }));
+ }
+ });
+ });
};
+ const getWordEmoji = (word: Word): string | null => {
+ return gameData.wordEmojis[word.text] || null;
+ };
+
+ if (!level || sections.length === 0 || !currentSection) return null;
+
+ const availableWords = currentSection.availableWords || [];
+
return (
-
- {level.availableWords.length > 0 && (
-
-
-
- {level.availableWords.map((word: Word) => (
-
handleDragStart(e, word)}
- onClick={() => handleWordClick(word)}
- >
- {word.text}
-
- ))}
-
-
-
- )}
-
-
-
-
- {level.slots.map((slot) => (
-
+ {showTutorial && (
+
+ )}
+
+ {showHintTutorial && (
+
+ )}
+
+
+
+
+
Level {levelId.split('_')[1]}
+
+ {/* Combined available words and inventory section */}
+
{
e.preventDefault();
- e.currentTarget.classList.add('drag-over');
+ const section = e.currentTarget;
+ if (!section.classList.contains('drag-over') && e.target === section) {
+ section.classList.add('drag-over');
+ }
}}
onDragLeave={(e) => {
- e.currentTarget.classList.remove('drag-over');
+ const section = e.currentTarget;
+ const rect = section.getBoundingClientRect();
+ if (
+ e.clientX <= rect.left ||
+ e.clientX >= rect.right ||
+ e.clientY <= rect.top ||
+ e.clientY >= rect.bottom
+ ) {
+ section.classList.remove('drag-over');
+ }
+ }}
+ onDrop={(e) => {
+ e.preventDefault();
+ cleanupDragStates();
+ handleInventoryDrop(e);
}}
- onDrop={(e) => handleDrop(e, slot.id)}
>
-
{slot.hintWord}
-
- {slot.currentWord ? (
-
handleDragStart(e, slot.currentWord!)}
- onClick={() => handleWordClick(slot.currentWord!, true)}
+
+
Available Words
+ {allSlots.some(slot => slot.currentWord) && (
+
- ) : (
-
Drop word here
+ Return all words
+
)}
+
+ {availableWords.map((word: Word) => (
+ handleDragStart(e, word)}
+ onClick={() => handleWordClick(word)}
+ />
+ ))}
+ {level.inventory.map((word) => (
+ handleDragStart(e, word)}
+ onClick={() => handleWordClick(word, true)}
+ />
+ ))}
+
+
+
+ {/* Slots grid */}
+
+ {allSlots.map((slot) => (
+
{
+ e.preventDefault();
+ const card = e.currentTarget;
+ if (!card.classList.contains('drag-over')) {
+ card.classList.add('drag-over');
+ }
+ }}
+ onDragLeave={(e) => {
+ const card = e.currentTarget;
+ const rect = card.getBoundingClientRect();
+ if (
+ e.clientX <= rect.left ||
+ e.clientX >= rect.right ||
+ e.clientY <= rect.top ||
+ e.clientY >= rect.bottom
+ ) {
+ card.classList.remove('drag-over');
+ }
+ }}
+ onDrop={(e) => {
+ e.preventDefault();
+ cleanupDragStates();
+ handleDrop(e, slot.id);
+ }}
+ >
+
{getHintText(slot.hintId)}
+
+ {slot.currentWord ? (
+
handleDragStart(e, slot.currentWord!)}
+ onClick={() => handleWordClick(slot.currentWord!, true)}
+ />
+ ) : (
+ Drop word here
+ )}
+
+
+ ))}
- ))}
-
-
-
-
+
+
+
+
+
setShowLevelCompleteModal(false)} centered>
+
+
+ {nextLevel ? 'Level Complete!' : 'Congratulations! 🎉'}
+
+
+
+
+ {nextLevel ? (
+ 'You\'ve completed this level!'
+ ) : (
+ 'You\'ve completed all available levels!'
+ )}
+
+
+ {Array(getLevelSolutions().size).fill('⭐').join(' ')}
+
+
+ {nextLevel ? (
+ 'Can you find more solutions?'
+ ) : (
+ 'More levels coming soon! Stay tuned for new challenges.'
+ )}
+
+
+
+
+ {nextLevel ? (
+ <>
+
+
+ >
+ ) : (
+
+ )}
+
+
+
+
);
};
diff --git a/src/components/Home.tsx b/src/components/Home.tsx
new file mode 100644
index 0000000..b0f85d4
--- /dev/null
+++ b/src/components/Home.tsx
@@ -0,0 +1,66 @@
+import React from 'react';
+import { useNavigate } from 'react-router-dom';
+import { useSelector } from 'react-redux';
+import { RootState } from '../store/store';
+import FallingWords from './FallingWords';
+import WordTile from './WordTile';
+import '../styles/Home.css';
+
+interface LevelCompletion {
+ isComplete: boolean;
+}
+
+const Home: React.FC = () => {
+ const navigate = useNavigate();
+ const levels = useSelector((state: RootState) => state.game.levels);
+
+ const findLastUnlockedLevel = () => {
+ // Go through levels in reverse to find the last unlocked one
+ for (let i = levels.length - 1; i >= 0; i--) {
+ const levelId = `level_${i + 1}`;
+ // A level is accessible if it's the first level or if the previous level is complete
+ if (i === 0 || isLevelComplete(`level_${i}`)) {
+ return levelId;
+ }
+ }
+ // If no level is found (shouldn't happen), return the first level
+ return 'level_1';
+ };
+
+ const isLevelComplete = (levelId: string): boolean => {
+ const saved = localStorage.getItem(`level_completion_${levelId}`);
+ if (!saved) return false;
+ const completion = JSON.parse(saved);
+ return completion.isComplete;
+ };
+
+ const handlePlayClick = () => {
+ const lastUnlockedLevelId = findLastUnlockedLevel();
+ navigate(`/play/${lastUnlockedLevelId}`);
+ };
+
+ return (
+
+
+
+
Match Five
+
+
+ A where you match words to their hints. When all your are , more words are revealed. Is your feeling today?
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Home;
\ No newline at end of file
diff --git a/src/components/Inventory.tsx b/src/components/Inventory.tsx
deleted file mode 100644
index 3a90ddf..0000000
--- a/src/components/Inventory.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-import React from 'react';
-import { useSelector, useDispatch } from 'react-redux';
-import { Container, Row, Col } from 'react-bootstrap';
-import { RootState } from '../store/store';
-import { Word } from '../store/types';
-import { placeWord } from '../store/gameSlice';
-
-const Inventory: React.FC = () => {
- const dispatch = useDispatch();
- const inventory = useSelector((state: RootState) => state.game.inventory);
- const currentWorld = useSelector((state: RootState) => state.game.currentWorld);
- const currentLevel = useSelector((state: RootState) => state.game.currentLevel);
-
- const handleDragStart = (e: React.DragEvent
, word: Word) => {
- e.dataTransfer.setData('word', JSON.stringify(word));
- };
-
- const handleDrop = (e: React.DragEvent) => {
- console.log('drop in inventory', currentWorld, currentLevel);
- e.preventDefault();
- const container = e.currentTarget;
- container.classList.remove('drag-over');
-
- try {
- if (currentWorld && currentLevel) {
- const word = JSON.parse(e.dataTransfer.getData('word')) as Word;
- if (word) {
- dispatch(placeWord({
- worldId: currentWorld,
- levelId: currentLevel,
- slotId: 'inventory',
- word
- }));
- }
- }
- } catch (error) {
- console.error('Error handling drop:', error);
- }
- };
-
- return (
- {
- e.preventDefault();
- e.currentTarget.classList.add('drag-over');
- }}
- onDragLeave={(e) => {
- e.currentTarget.classList.remove('drag-over');
- }}
- onDrop={handleDrop}
- >
- Inventory
- e.preventDefault()}
- onDrop={handleDrop}
- >
- {inventory.map(word => (
-
handleDragStart(e, word)}
- >
- {word.text}
-
- ))}
-
-
- );
-};
-
-export default Inventory;
\ No newline at end of file
diff --git a/src/components/LevelSelector.tsx b/src/components/LevelSelector.tsx
index 1388479..8315ef6 100644
--- a/src/components/LevelSelector.tsx
+++ b/src/components/LevelSelector.tsx
@@ -1,37 +1,138 @@
import React from 'react';
-import { useSelector, useDispatch } from 'react-redux';
-import { Card, Container, Row, Col } from 'react-bootstrap';
+import { useSelector } from 'react-redux';
+import { useNavigate } from 'react-router-dom';
+import { Card, Container } from 'react-bootstrap';
import { RootState } from '../store/store';
-import { setCurrentLevel } from '../store/gameSlice';
+import { FaLock, FaCheck, FaChevronRight } from 'react-icons/fa';
+
+interface LevelCompletion {
+ isComplete: boolean;
+ uniqueSolutions: string[];
+}
+
+interface SectionCompletion {
+ isComplete: boolean;
+}
const LevelSelector: React.FC = () => {
- const dispatch = useDispatch();
- const currentWorld = useSelector((state: RootState) => {
- const worldId = state.game.currentWorld;
- return state.game.worlds.find(w => w.id === worldId);
- });
+ const navigate = useNavigate();
+ const levels = useSelector((state: RootState) => state.game.levels);
+
+ const isLevelAccessible = (levelIndex: number): boolean => {
+ if (levelIndex === 0) return true;
+ const previousLevel = levels[levelIndex - 1];
+ return isLevelComplete(`level_${levelIndex}`);
+ };
+
+ const isLevelComplete = (levelId: string): boolean => {
+ const saved = localStorage.getItem(`level_completion_${levelId}`);
+ if (!saved) return false;
+ const completion: LevelCompletion = JSON.parse(saved);
+ return completion.isComplete;
+ };
+
+ const getLevelSolutions = (levelId: string): string[] => {
+ const saved = localStorage.getItem(`level_completion_${levelId}`);
+ if (!saved) return [];
+ const completion: LevelCompletion = JSON.parse(saved);
+ return completion.uniqueSolutions;
+ };
- if (!currentWorld) return null;
+ const isSectionComplete = (levelId: string, sectionId: string): boolean => {
+ const level = levels.find(l => l.id === levelId);
+ if (!level) return false;
+
+ const targetSectionIndex = level.sections.findIndex(s => s.id === sectionId);
+ if (targetSectionIndex === -1) return false;
+
+ for (let i = 0; i <= targetSectionIndex; i++) {
+ const section = level.sections[i];
+ const saved = localStorage.getItem(`completion_${levelId}_${section.id}`);
+ if (!saved) return false;
+ const completion: SectionCompletion = JSON.parse(saved);
+ if (!completion.isComplete) return false;
+ }
+
+ return true;
+ };
return (
-
-
- {currentWorld.levels.map(level => (
-
+
+ Select a Level
+
+ {levels.map((level, index) => {
+ const levelId = `level_${index + 1}`;
+ const isLevelUnlocked = isLevelAccessible(index);
+ const isComplete = isLevelComplete(levelId);
+ const solutions = getLevelSolutions(levelId);
+ const completedSections = level.sections.filter((section, sectionIndex) =>
+ isSectionComplete(levelId, `section_${index + 1}_${sectionIndex + 1}`)
+ ).length;
+
+ return (
level.isUnlocked && dispatch(setCurrentLevel(level.id))}
- className={`h-100 ${!level.isUnlocked ? 'opacity-50' : ''}`}
+ key={levelId}
+ onClick={() => isLevelUnlocked && navigate(`/play/${levelId}`)}
+ className={`level-select-card ${isComplete ? 'completed' : ''} ${!isLevelUnlocked ? 'locked' : ''}`}
>
- Level {level.id}
-
- {level.isUnlocked ? 'Click to play' : 'Complete previous level to unlock'}
-
+
+
+
{level.name || `Level ${index + 1}`}
+
+ {completedSections} / {level.sections.length} sections
+
+
+ {!isLevelUnlocked ? (
+
+
+
+ ) : isComplete ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+
+ {solutions.length > 0 && (
+
+
+ {Array(solutions.length).fill('⭐').join(' ')}
+
+
+ )}
+
+ {!isLevelUnlocked && (
+
+ Complete previous level to unlock
+
+ )}
-
- ))}
-
+ );
+ })}
+
+ {/* Coming Soon Card */}
+
+
+
+
+
New Levels Coming Soon
+
+ Stay tuned for more challenges!
+
+
+
+
+
+
+
+
+
);
};
diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx
new file mode 100644
index 0000000..da01ab3
--- /dev/null
+++ b/src/components/Navbar.tsx
@@ -0,0 +1,81 @@
+import React, { useState } from 'react';
+import { NavLink } from 'react-router-dom';
+import { useDispatch } from 'react-redux';
+import { Navbar as BootstrapNavbar, Container, Button, Modal, Nav } from 'react-bootstrap';
+import { FaInfoCircle, FaTrash, FaList } from 'react-icons/fa';
+import '../styles/Navbar.css';
+
+const Navbar: React.FC = () => {
+ const dispatch = useDispatch();
+ const [showInfoModal, setShowInfoModal] = useState(false);
+ const [showResetModal, setShowResetModal] = useState(false);
+
+ const handleResetData = () => {
+ localStorage.clear();
+ window.location.reload();
+ };
+
+ return (
+ <>
+
+
+
+ Match Five
+
+
+
+
+
+ setShowInfoModal(false)}>
+
+ How to Play
+
+
+ Game Rules:
+
+ - Complete each level by matching five words correctly
+ - Drag and drop words into the correct slots
+ - Click words to add them to your inventory for later use
+ - Complete all levels in a pack to unlock new challenges
+
+
+
+
+
+
+
+ setShowResetModal(false)}>
+
+ Reset Game Progress
+
+
+ Are you sure you want to reset all game progress? This action cannot be undone.
+
+
+
+
+
+
+ >
+ );
+};
+
+export default Navbar;
\ No newline at end of file
diff --git a/src/components/SolutionsCounter.tsx b/src/components/SolutionsCounter.tsx
new file mode 100644
index 0000000..593809e
--- /dev/null
+++ b/src/components/SolutionsCounter.tsx
@@ -0,0 +1,23 @@
+import React from 'react';
+import { Card } from 'react-bootstrap';
+
+interface SolutionsCounterProps {
+ solutionsCount: number;
+}
+
+const SolutionsCounter: React.FC = ({ solutionsCount }) => {
+ return (
+
+
+
+
Solutions Found
+
+ {Array(solutionsCount).fill('⭐').join(' ')}
+
+
+
+
+ );
+};
+
+export default SolutionsCounter;
\ No newline at end of file
diff --git a/src/components/TutorialOverlay.tsx b/src/components/TutorialOverlay.tsx
new file mode 100644
index 0000000..ac0188a
--- /dev/null
+++ b/src/components/TutorialOverlay.tsx
@@ -0,0 +1,129 @@
+import React from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+
+interface TutorialStep {
+ targetSelector: string;
+ message: string;
+ position: 'top' | 'bottom' | 'left' | 'right';
+}
+
+interface TutorialOverlayProps {
+ isVisible: boolean;
+ currentStep: number;
+ steps: TutorialStep[];
+ onComplete: () => void;
+ onNext: () => void;
+}
+
+const TutorialOverlay: React.FC = ({
+ isVisible,
+ currentStep,
+ steps,
+ onComplete,
+ onNext,
+}) => {
+ const currentTutorialStep = steps[currentStep];
+ const [messagePosition, setMessagePosition] = React.useState({ top: 0, left: 0 });
+
+ React.useEffect(() => {
+ if (isVisible && currentTutorialStep) {
+ const targetElement = document.querySelector(currentTutorialStep.targetSelector);
+ if (targetElement) {
+ const rect = targetElement.getBoundingClientRect();
+ const spotlight = document.querySelector('.tutorial-spotlight') as HTMLElement;
+
+ if (spotlight) {
+ spotlight.style.left = `${rect.left - 10}px`;
+ spotlight.style.top = `${rect.top - 10}px`;
+ spotlight.style.width = `${rect.width + 20}px`;
+ spotlight.style.height = `${rect.height + 20}px`;
+
+ const messageWidth = 300;
+ const messageHeight = 120;
+ const padding = 20;
+ const viewportPadding = 20;
+
+ let top = 0;
+ let left = 0;
+
+ switch (currentTutorialStep.position) {
+ case 'top':
+ top = rect.top - messageHeight - padding;
+ left = rect.left + (rect.width - messageWidth) / 2;
+ break;
+ case 'bottom':
+ top = rect.bottom + padding;
+ left = rect.left + (rect.width - messageWidth) / 2;
+ break;
+ case 'left':
+ top = rect.top + (rect.height - messageHeight) / 2;
+ left = rect.left - messageWidth - padding;
+ break;
+ case 'right':
+ top = rect.top + (rect.height - messageHeight) / 2;
+ left = rect.right + padding;
+ break;
+ }
+
+ const viewportWidth = window.innerWidth;
+ const viewportHeight = window.innerHeight;
+
+ if (left < viewportPadding) {
+ left = viewportPadding;
+ } else if (left + messageWidth > viewportWidth - viewportPadding) {
+ left = viewportWidth - messageWidth - viewportPadding;
+ }
+
+ if (top < viewportPadding) {
+ top = viewportPadding;
+ } else if (top + messageHeight > viewportHeight - viewportPadding) {
+ top = viewportHeight - messageHeight - viewportPadding;
+ }
+
+ setMessagePosition({ top, left });
+ }
+ }
+ }
+ }, [isVisible, currentStep, currentTutorialStep]);
+
+ if (!isVisible) return null;
+
+ return (
+
+
+
+
+ {currentTutorialStep.message}
+
+
+
+
+ );
+};
+
+export default TutorialOverlay;
\ No newline at end of file
diff --git a/src/components/WordTile.tsx b/src/components/WordTile.tsx
new file mode 100644
index 0000000..3b31b06
--- /dev/null
+++ b/src/components/WordTile.tsx
@@ -0,0 +1,59 @@
+import React from 'react';
+import gameData from '../data/gameData.json';
+
+interface WordTileProps {
+ word: string;
+ hint?: string;
+ disableHover?: boolean;
+ className?: string;
+ onDragStart?: (e: React.DragEvent) => void;
+ onClick?: () => void;
+}
+
+const WordTile: React.FC = ({
+ word,
+ hint,
+ disableHover = false,
+ className = 'word-tile',
+ onDragStart,
+ onClick
+}) => {
+ const emoji = gameData.wordEmojis[word];
+
+ return (
+
+ {word}
+ {emoji && (
+
+ {emoji}
+
+ )}
+
+ );
+};
+
+export default WordTile;
\ No newline at end of file
diff --git a/src/components/WorldSelector.tsx b/src/components/WorldSelector.tsx
deleted file mode 100644
index 9d44ff0..0000000
--- a/src/components/WorldSelector.tsx
+++ /dev/null
@@ -1,135 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { useDispatch, useSelector } from 'react-redux';
-import { Card, Row, Col, Collapse } from 'react-bootstrap';
-import { RootState } from '../store/store';
-import GameBoard from './GameBoard';
-import { Level } from '../store/types';
-import { setCurrentWorld, setCurrentLevel } from '../store/gameSlice';
-
-interface ExpandedState {
- [key: string]: {
- isExpanded: boolean;
- expandedLevels: Set;
- };
-}
-
-const WorldSelector: React.FC = () => {
- const dispatch = useDispatch();
- const worlds = useSelector((state: RootState) => state.game.worlds);
- const currentWorld = useSelector((state: RootState) => state.game.currentWorld);
- const currentLevel = useSelector((state: RootState) => state.game.currentLevel);
- const [expandedStates, setExpandedStates] = useState({});
-
- useEffect(() => {
- if (worlds.length > 0 && Object.keys(expandedStates).length === 0) {
- const firstWorld = worlds[0];
- dispatch(setCurrentWorld(firstWorld.id));
-
- const initialStates: ExpandedState = {
- [firstWorld.id]: {
- isExpanded: true,
- expandedLevels: new Set()
- }
- };
-
- setExpandedStates(initialStates);
- }
- }, [worlds, dispatch]);
-
- const toggleWorld = (worldId: string) => {
- dispatch(setCurrentWorld(worldId));
- setExpandedStates(prev => ({
- ...prev,
- [worldId]: {
- ...prev[worldId],
- isExpanded: !prev[worldId]?.isExpanded,
- expandedLevels: prev[worldId]?.expandedLevels || new Set()
- }
- }));
- };
-
- const toggleLevel = (worldId: string, levelId: string) => {
- dispatch(setCurrentLevel(levelId));
- setExpandedStates(prev => {
- const worldState = prev[worldId] || { isExpanded: true, expandedLevels: new Set() };
- const newExpandedLevels = new Set(worldState.expandedLevels);
-
- if (newExpandedLevels.has(levelId)) {
- newExpandedLevels.delete(levelId);
- } else {
- newExpandedLevels.add(levelId);
- }
-
- return {
- ...prev,
- [worldId]: {
- ...worldState,
- expandedLevels: newExpandedLevels
- }
- };
- });
- };
-
- const isLevelCurrentlyComplete = (level: Level) => {
- return level.slots.every(slot =>
- slot.currentWord && slot.acceptedWords.includes(slot.currentWord.text)
- );
- };
-
- const renderWorld = (world: any) => {
- return (
-
-
{
- if (world.isUnlocked) {
- toggleWorld(world.id);
- }
- }}
- className={`world-card ${world.levels.every(isLevelCurrentlyComplete) ? 'completed' : ''}`}
- >
-
- {world.name || `World ${world.id}`}
-
- {world.levels.filter(isLevelCurrentlyComplete).length} / {world.levels.length}
-
-
-
-
-
-
- {world.levels.map((level: Level) => (
-
-
{
- if (level.isUnlocked) {
- toggleLevel(world.id, level.id);
- }
- }}
- className={`level-card ${isLevelCurrentlyComplete(level) ? 'completed' : ''} ${!level.isUnlocked ? 'locked' : ''}`}
- >
-
- {level.name || `Level ${level.id}`}
-
-
-
- {level.isUnlocked && expandedStates[world.id]?.expandedLevels.has(level.id) && (
-
-
-
- )}
-
- ))}
-
-
-
- );
- };
-
- return (
-
- {worlds.map(renderWorld)}
-
- );
-};
-
-export default WorldSelector;
\ No newline at end of file
diff --git a/src/data/gameData.json b/src/data/gameData.json
new file mode 100644
index 0000000..0011ea1
--- /dev/null
+++ b/src/data/gameData.json
@@ -0,0 +1,349 @@
+{
+ "wordEmojis": {
+ "Air": "💨",
+ "Above": "⬆️",
+ "Answer": "✅",
+ "Apple": "🍎",
+ "Average": "📊",
+ "Ball": "⚽",
+ "Banana": "🍌",
+ "Bark": "🌳",
+ "Bat": "🦇",
+ "Bean": "🫘",
+ "Bear": "🐻",
+ "Below": "⬇️",
+ "Blackberry": "🫐",
+ "Blood": "🩸",
+ "Blueberry": "🫐",
+ "Book": "📚",
+ "Brain": "🧠",
+ "Broccoli": "🥦",
+ "Cardinal": "🐦",
+ "Carrot": "🥕",
+ "Cave": "🕳️",
+ "Center": "⚪",
+ "Cherry": "🍒",
+ "Chocolate": "🍫",
+ "Circle": "⭕",
+ "Cloud": "☁️",
+ "Coal": "🪨",
+ "Coffee": "☕",
+ "Corn": "🌽",
+ "Crane": "🏗️",
+ "Daisy": "🌼",
+ "Dance": "💃",
+ "Date": "📅",
+ "Diamond": "💎",
+ "Dog": "🐕",
+ "Down": "⬇️",
+ "Drum": "🥁",
+ "Duck": "🦆",
+ "Earth": "🌍",
+ "Eggplant": "🍆",
+ "Eye": "👁️",
+ "Fact": "📝",
+ "Fall": "🍂",
+ "Feather": "🪶",
+ "Fig": "🪪",
+ "Fire": "🔥",
+ "Fish": "🐟",
+ "Five": "5️⃣",
+ "Flute": "🎵",
+ "Garlic": "🧄",
+ "Glue": "🫠",
+ "Gold": "🥇",
+ "Grape": "🍇",
+ "Grass": "🌱",
+ "Guitar": "🎸",
+ "Heart": "❤️",
+ "High": "⬆️",
+ "Ice": "🧊",
+ "Ink": "🖋️",
+ "Iris": "🌸",
+ "Kiwi": "🥝",
+ "Leaf": "🍃",
+ "Left": "⬅️",
+ "Lemon": "🍋",
+ "Lettuce": "🥬",
+ "Light": "💡",
+ "Lime": "🟢",
+ "Low": "⬇️",
+ "Love": "❤️",
+ "Metal": "🔩",
+ "Middle": "⏺️",
+ "Mirror": "🪞",
+ "Money": "💰",
+ "Moon": "🌙",
+ "Mountain": "⛰️",
+ "Mouse": "🐁",
+ "Mud": "🟫",
+ "Music": "🎵",
+ "Night": "🌙",
+ "Ocean": "🌊",
+ "Orange": "🍊",
+ "Pea": "🟢",
+ "Pear": "🍐",
+ "Penguin": "🐧",
+ "Pepper": "🌶️",
+ "Piano": "🎹",
+ "Pig": "🐷",
+ "Plum": "🟣",
+ "Potato": "🥔",
+ "Pumpkin": "🎃",
+ "Puzzle Game": "🧩",
+ "Rage": "😠",
+ "Right": "➡️",
+ "River": "🌊",
+ "Rock": "🪨",
+ "Rope": "➰",
+ "Rose": "🌹",
+ "Rude": "😤",
+ "Sadness": "😢",
+ "Salmon": "🐟",
+ "Salt": "🧂",
+ "Saxophone": "🎷",
+ "Science": "🧪",
+ "Score": "💯",
+ "Seal": "🦭",
+ "Seed": "🌱",
+ "Shadow": "👥",
+ "Sky": "🌤️",
+ "Snake": "🐍",
+ "Snow": "❄️",
+ "Spring": "🌸",
+ "Star": "⭐",
+ "Stone": "🪨",
+ "Strawberry": "🍓",
+ "Stream": "💫",
+ "Student": "👨🎓",
+ "Summer": "☀️",
+ "Sun": "☀️",
+ "Swan": "🦢",
+ "Time": "⏰",
+ "Tomato": "🍅",
+ "Tower": "🗼",
+ "Traffic": "🚦",
+ "Tree": "🌳",
+ "Up": "⬆️",
+ "Violet": "🟣",
+ "Window": "🪟",
+ "Wine": "🍷",
+ "Winter": "⛄",
+ "Wrench": "🔧"
+ },
+ "hints": {
+ "Red": {
+ "accepts": ["Strawberry", "Apple", "Rage", "Rose", "Blood", "Cherry", "Tomato", "Fire", "Cardinal"]
+ },
+ "Purple": {
+ "accepts": ["Eggplant", "Grape", "Blueberry", "Blackberry", "Plum", "Violet", "Wine"]
+ },
+ "Yellow": {
+ "accepts": ["Banana", "Garlic", "Potato", "Lemon", "Sun", "Gold", "Corn", "Star"]
+ },
+ "Green": {
+ "accepts": ["Lettuce", "Kiwi", "Strawberry", "Money", "Grass", "Lime", "Pear", "Leaf", "Apple", "Broccoli", "Tree"]
+ },
+ "Black": {
+ "accepts": ["Blackberry", "Night", "Coal", "Ink", "Shadow", "Coffee"]
+ },
+ "Orange": {
+ "accepts": ["Apple", "Pumpkin", "Orange", "Carrot", "Fire", "Sun"]
+ },
+ "Blue": {
+ "accepts": ["Blueberry", "Sadness", "Sky", "Ocean", "River", "Ice"]
+ },
+ "White": {
+ "accepts": ["Garlic", "Strawberry", "Potato", "Snow", "Cloud", "Ice", "Salt", "Moon"]
+ },
+ "Brown": {
+ "accepts": ["Kiwi", "Potato", "Banana", "Coffee", "Chocolate", "Earth", "Bark", "Bear"]
+ },
+ "Fruit": {
+ "accepts": ["Apple", "Banana", "Grape", "Kiwi", "Blackberry", "Blueberry", "Eggplant", "Strawberry", "Lemon", "Orange", "Cherry", "Plum", "Pear", "Lime", "Fig", "Date", "Tomato"]
+ },
+ "Vegetable": {
+ "accepts": ["Lettuce", "Garlic", "Eggplant", "Potato", "Pumpkin", "Carrot", "Corn", "Tomato", "Pepper", "Bean", "Broccoli"]
+ },
+ "Berry": {
+ "accepts": ["Strawberry", "Blackberry", "Kiwi", "Blueberry", "Cherry", "Grape", "Tomato"]
+ },
+ "Flower": {
+ "accepts": ["Rose", "River", "Violet", "Iris", "Spring", "Daisy"]
+ },
+ "Plant": {
+ "accepts": ["Strawberry", "Kiwi", "Garlic", "Potato", "Pumpkin", "Eggplant", "Apple", "Blueberry", "Grape", "Banana", "Blackberry", "Rose", "Lemon", "Tree", "Grass", "Corn", "Bean", "Violet", "Iris", "Daisy", "Broccoli", "Lettuce", "Pepper", "Tomato"]
+ },
+ "Animal": {
+ "accepts": ["Dog", "Kiwi", "Snake", "Bear", "Mouse", "Fish", "Duck", "Seal", "Bat", "Penguin", "Bear", "Fish", "Snake"]
+ },
+ "Bird": {
+ "accepts": ["Kiwi", "Duck", "Crane", "Swan", "Cardinal", "Penguin"]
+ },
+ "Mammal": {
+ "accepts": ["Dog", "Bear", "Mouse", "Seal", "Bat"]
+ },
+ "Pink": {
+ "accepts": ["Strawberry", "Rose", "Pig", "Salmon", "Heart"]
+ },
+ "Round": {
+ "accepts": ["Apple", "Blueberry", "Grape", "Orange", "Moon", "Sun", "Ball", "Earth", "Tomato", "Pumpkin", "Kiwi", "Lemon", "Banana", "Cherry", "Plum", "Pear", "Lime", "Fig", "Date"]
+ },
+ "Long": {
+ "accepts": ["Snake", "River", "Banana", "Time", "Bean", "Rope"]
+ },
+ "Small": {
+ "accepts": ["Blueberry", "Grape", "Blackberry", "Mouse", "Seed", "Bean", "Pea"]
+ },
+ "Music": {
+ "accepts": ["Rock", "Dance"]
+ },
+ "Bright": {
+ "accepts": ["Sun", "Star", "Light", "Fire", "Student"]
+ },
+ "Mean": {
+ "accepts": ["Rude", "Average"]
+ },
+ "Direction": {
+ "accepts": ["Left", "Right", "Up", "Down", "Cardinal", "Duck"]
+ },
+ "Correct": {
+ "accepts": ["Right"]
+ },
+ "Bark": {
+ "accepts": ["Dog", "Tree"]
+ },
+ "Jam": {
+ "accepts": ["Strawberry", "Traffic", "Music"]
+ },
+ "Position": {
+ "accepts": ["Up", "Down", "Left", "Right", "Above", "Below", "Center", "Middle"]
+ },
+ "Mood": {
+ "accepts": ["Up", "Down", "High", "Low", "Sadness", "Rage", "Love", "Heart"]
+ },
+ "Season": {
+ "accepts": ["Summer", "Winter", "Spring", "Fall"]
+ },
+ "Smart": {
+ "accepts": ["Brain", "Money", "Book", "Student"]
+ },
+ "True": {
+ "accepts": ["Fact", "Answer", "Science"]
+ },
+ "Perfect": {
+ "accepts": ["Circle", "Score", "Diamond"]
+ },
+ "Look": {
+ "accepts": ["Eye", "Window", "Mirror"]
+ },
+ "Flow": {
+ "accepts": ["River", "Stream", "Blood"]
+ },
+ "Stuck": {
+ "accepts": ["Traffic", "Glue", "Mud"]
+ },
+ "Heavy": {
+ "accepts": ["Stone", "Metal", "Pumpkin"]
+ },
+ "Light": {
+ "accepts": ["Feather", "Cloud", "Air"]
+ },
+ "Dark": {
+ "accepts": ["Night", "Shadow", "Cave"]
+ },
+ "High": {
+ "accepts": ["Mountain", "Tower", "Sky"]
+ },
+ "Instrument": {
+ "accepts": ["Drum", "Guitar", "Piano", "Flute", "Saxophone", "Wrench"]
+ },
+ "Verb": {
+ "accepts": ["Dog", "Duck", "Bear", "Fish", "Snake"]
+ },
+ "Noun": {
+ "accepts": [
+ "Tomato", "Orange", "Banana", "Blueberry", "Daisy", "Dog", "Duck", "Bear", "Fish", "Snake", "Penguin"
+ ]
+ },
+ "Reptile": {
+ "accepts": ["Snake"]
+ }
+ },
+ "levels": [
+ {
+ "sections": [
+ {
+ "slots": ["Fruit", "Vegetable", "Berry", "Flower", "Plant"],
+ "words": ["Apple", "Broccoli", "Strawberry", "Rose", "Tree"]
+ },
+ {
+ "slots": ["Red", "Orange", "Yellow", "Blue", "Green"],
+ "words": ["Tomato", "Orange", "Banana", "Blueberry", "Daisy"]
+ }
+ ]
+ },
+ {
+ "sections": [
+ {
+ "slots": ["Verb","Animal", "Bird", "Mammal", "Reptile"],
+ "words": ["Dog", "Penguin", "Bear", "Fish", "Snake"]
+ },
+ {
+ "slots": ["Verb", "Noun", "Verb", "Noun", "Verb"],
+ "words": ["Dog", "Penguin", "Bear", "Fish", "Snake"]
+ },
+ {
+ "slots": ["Verb", "Verb", "Verb", "Verb", "Verb"],
+ "words": ["Dog", "Penguin", "Bear", "Fish", "Snake"]
+ }
+ ]
+ },
+ {
+ "sections": [
+ {
+ "slots": ["Direction", "Direction", "Direction", "Direction", "Animal"],
+ "words": ["Left", "Right", "Up", "Down", "Dog"]
+ },
+ {
+ "slots": ["Mood", "Bird", "Correct", "Verb", "Noun"],
+ "words": ["Cardinal", "Penguin", "Duck", "Fish", "Snake"]
+ },
+ {
+ "slots": ["Red", "Red", "Mood", "Verb", "Noun"],
+ "words": ["Cardinal", "Rage", "Tomato", "Penguin", "Bear"]
+ }
+ ]
+ },
+ {
+ "name": "Elements",
+ "sections": [
+ {
+ "name": "Basic Elements",
+ "slots": ["Red", "Purple", "Yellow", "Green", "Black"],
+ "words": ["Strawberry", "Eggplant", "Banana", "Kiwi", "Blackberry"]
+ },
+ {
+ "name": "Fruits",
+ "slots": ["Orange", "Blue", "Purple", "White", "Brown"],
+ "words": ["Apple", "Blueberry", "Grape", "Garlic", "Lettuce"]
+ },
+ {
+ "name": "Vegetables",
+ "slots": ["Fruit", "Vegetable", "Berry", "Vegetable", "Fruit"],
+ "words": ["Sadness", "Money", "Rage", "Potato", "Pumpkin"]
+ },
+ {
+ "name": "Animals",
+ "slots": ["Flower", "Plant", "Animal", "Bird", "Mammal"],
+ "words": ["Rose", "Lemon", "Dog", "River", "Snake"]
+ },
+ {
+ "name": "Plants",
+ "slots": ["Orange", "Blue", "Purple", "White", "Brown"],
+ "words": ["Apple", "Blueberry", "Grape", "Garlic", "Lettuce"]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/store/gameSlice.ts b/src/store/gameSlice.ts
index 15e1d5f..976a13a 100644
--- a/src/store/gameSlice.ts
+++ b/src/store/gameSlice.ts
@@ -1,220 +1,198 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
-import { GameState, Word } from './types';
-import { initialGameState } from './initialState';
+import gameData from '../data/gameData.json';
+import { Word, GameState, Section, Level, Slot, RawGameData } from './types';
+
+function generateLevelId(levelIndex: number): string {
+ return `level_${levelIndex + 1}`;
+}
+
+function generateSectionId(levelIndex: number, sectionIndex: number): string {
+ return `section_${levelIndex + 1}_${sectionIndex + 1}`;
+}
+
+function generateSlotId(levelIndex: number, sectionIndex: number, slotIndex: number): string {
+ return `slot_${levelIndex + 1}_${sectionIndex + 1}_${slotIndex + 1}`;
+}
+
+function generateWordId(levelIndex: number, sectionIndex: number, wordIndex: number): string {
+ return `word_${levelIndex + 1}_${sectionIndex + 1}_${wordIndex + 1}`;
+}
+
+function transformGameData(data: RawGameData): Level[] {
+ return data.levels.map((level, levelIndex) => ({
+ id: generateLevelId(levelIndex),
+ name: level.name,
+ sections: level.sections.map((section, sectionIndex) => ({
+ id: generateSectionId(levelIndex, sectionIndex),
+ name: section.name,
+ slots: section.slots.map((hintId, slotIndex) => ({
+ id: generateSlotId(levelIndex, sectionIndex, slotIndex),
+ hintId,
+ currentWord: null
+ })),
+ availableWords: section.words.map((word, wordIndex) => ({
+ id: generateWordId(levelIndex, sectionIndex, wordIndex),
+ text: word
+ })),
+ isComplete: false,
+ // Only first section of first level is unlocked initially
+ isUnlocked: levelIndex === 0 && sectionIndex === 0
+ })),
+ isComplete: false,
+ inventory: []
+ }));
+}
+
+const initialState: GameState = {
+ levels: transformGameData(gameData as RawGameData),
+ currentLevel: null,
+ currentSection: null,
+ hints: gameData.hints,
+ inventory: []
+};
const gameSlice = createSlice({
name: 'game',
- initialState: initialGameState,
+ initialState,
reducers: {
- setCurrentWorld: (state, action: PayloadAction) => {
- state.currentWorld = action.payload;
- state.currentLevel = null;
- },
- setCurrentLevel: (state, action: PayloadAction) => {
+ setCurrentLevel: (state, action: PayloadAction) => {
state.currentLevel = action.payload;
},
- addToInventory: (state, action: PayloadAction<{
- worldId: string,
- levelId: string,
- word: Word,
- sourceWorldId?: string,
- sourceLevelId?: string
- }>) => {
- const { worldId, levelId, word, sourceWorldId, sourceLevelId } = action.payload;
- const world = state.worlds.find(w => w.id === worldId);
- const level = world?.levels.find(l => l.id === levelId);
-
- if (level) {
- // Clean up source location if provided
- if (sourceWorldId && sourceLevelId) {
- const sourceWorld = state.worlds.find(w => w.id === sourceWorldId);
- const sourceLevel = sourceWorld?.levels.find(l => l.id === sourceLevelId);
- if (sourceLevel) {
- // Clean up from slots
- sourceLevel.slots.forEach(slot => {
- if (slot.currentWord?.id === word.id) {
- slot.currentWord = null;
- }
- });
- // Clean up from available words
- sourceLevel.availableWords = sourceLevel.availableWords.filter(w => w.id !== word.id);
- }
- }
-
- // Remove word from available words
- level.availableWords = level.availableWords.filter(w => w.id !== word.id);
- // Add to inventory if not already there
- if (!state.inventory.some(w => w.id === word.id)) {
- state.inventory.push(word);
- }
- }
- },
- removeFromInventory: (state, action: PayloadAction) => {
- state.inventory = state.inventory.filter(word => word.id !== action.payload);
+ setCurrentSection: (state, action: PayloadAction) => {
+ state.currentSection = action.payload;
},
placeWord: (state, action: PayloadAction<{
- worldId: string,
- levelId: string,
- slotId: string,
- word: Word,
- sourceWorldId?: string,
- sourceLevelId?: string
+ levelId: string;
+ sectionId: string;
+ slotId: string;
+ word: Word;
+ sourceLevelId: string;
+ sourceSectionId: string;
}>) => {
- const { worldId, levelId, slotId, word, sourceWorldId, sourceLevelId } = action.payload;
+ const { levelId, sectionId, slotId, word, sourceLevelId, sourceSectionId } = action.payload;
- const world = state.worlds.find(w => w.id === worldId);
- const level = world?.levels.find(l => l.id === levelId);
-
- if (!level) return;
+ // Remove from source location first
+ const sourceLevel = state.levels.find(w => w.id === sourceLevelId);
+ const sourceSection = sourceLevel?.sections.find(l => l.id === sourceSectionId);
- // Clean up source location
- if (sourceWorldId && sourceLevelId) {
- const sourceWorld = state.worlds.find(w => w.id === sourceWorldId);
- const sourceLevel = sourceWorld?.levels.find(l => l.id === sourceLevelId);
- if (sourceLevel) {
- // Clean up from slots
- sourceLevel.slots.forEach(slot => {
- if (slot.currentWord?.id === word.id) {
- slot.currentWord = null;
- }
- });
- // Clean up from available words
- sourceLevel.availableWords = sourceLevel.availableWords.filter(w => w.id !== word.id);
- }
+ // Remove from level inventory if it was there
+ if (sourceLevel) {
+ sourceLevel.inventory = sourceLevel.inventory.filter(w => w.id !== word.id);
+ }
+
+ // Remove from source section if applicable
+ if (sourceSection) {
+ // Remove from slots if it was in a slot
+ sourceSection.slots = sourceSection.slots.map(slot => ({
+ ...slot,
+ currentWord: slot.currentWord?.id === word.id ? null : slot.currentWord
+ }));
+ // Remove from available words if it was there
+ sourceSection.availableWords = sourceSection.availableWords.filter(w => w.id !== word.id);
}
-
- // Remove from available words if it's there
- level.availableWords = level.availableWords.filter(w => w.id !== word.id);
-
- // Remove from inventory if it's there
- state.inventory = state.inventory.filter(w => w.id !== word.id);
-
- // Remove from any slot in the target level
- level.slots.forEach(slot => {
- if (slot.currentWord?.id === word.id) {
- slot.currentWord = null;
- }
- });
- // Place word in new location
+ // Handle moving to inventory
if (slotId === 'inventory') {
- if (!state.inventory.some(w => w.id === word.id)) {
- state.inventory.push(word);
- }
- } else {
- const slot = level.slots.find(s => s.id === slotId);
- if (slot) {
- if (slot.currentWord) {
- state.inventory.push(slot.currentWord);
- }
- slot.currentWord = word;
+ const targetLevel = state.levels.find(w => w.id === levelId);
+ if (targetLevel && !targetLevel.inventory.some(w => w.id === word.id)) {
+ targetLevel.inventory.push(word);
}
+ return;
+ }
+
+ // Handle placing in slot
+ const targetLevel = state.levels.find(w => w.id === levelId);
+ const targetSection = targetLevel?.sections.find(l => l.id === sectionId);
+ if (targetSection) {
+ // Place in new slot
+ targetSection.slots = targetSection.slots.map(slot => ({
+ ...slot,
+ currentWord: slot.id === slotId ? word : slot.currentWord
+ }));
}
},
- checkSolution: (state) => {
- const world = state.worlds.find(w => w.id === state.currentWorld);
- const level = world?.levels.find(l => l.id === state.currentLevel);
-
- if (!level || !world) return;
+ addToInventory: (state, action: PayloadAction<{
+ levelId: string;
+ sectionId: string;
+ word: Word;
+ sourceLevelId: string;
+ sourceSectionId: string;
+ }>) => {
+ const { word, sourceLevelId, sourceSectionId, levelId } = action.payload;
- const levelIndex = world.levels.findIndex(l => l.id === level.id);
+ // Add to target level's inventory if not already there
+ const targetLevel = state.levels.find(w => w.id === levelId);
+ if (targetLevel && !targetLevel.inventory.some(w => w.id === word.id)) {
+ targetLevel.inventory.push(word);
+ }
- // Check if current level is completed
- const isCurrentLevelComplete = level.slots.every(slot =>
- slot.currentWord && slot.acceptedWords.includes(slot.currentWord.text)
- );
-
- if (isCurrentLevelComplete) {
- // Mark current level as completed
- level.isCompleted = true;
-
- // Check if all previous levels are completed
- const allPreviousLevelsCompleted = world.levels
- .slice(0, levelIndex + 1)
- .every(level =>
- level.slots.every(slot =>
- slot.currentWord && slot.acceptedWords.includes(slot.currentWord.text)
- )
- );
-
- if (allPreviousLevelsCompleted) {
- // Unlock next level if exists
- if (levelIndex >= 0 && levelIndex < world.levels.length - 1) {
- world.levels[levelIndex + 1].isUnlocked = true;
- }
-
- // Check if all levels in world are completed
- const allLevelsCompleted = world.levels.every(l =>
- l.slots.every(slot =>
- slot.currentWord && slot.acceptedWords.includes(slot.currentWord.text)
- )
- );
-
- if (allLevelsCompleted) {
- world.isCompleted = true;
-
- // Find and unlock next world if exists
- const worldIndex = state.worlds.findIndex(w => w.id === world.id);
- if (worldIndex >= 0 && worldIndex < state.worlds.length - 1) {
- state.worlds[worldIndex + 1].isUnlocked = true;
- }
- }
-
- // Save progress to localStorage
- const gameState = {
- completedLevels: world.levels
- .filter(l => l.isCompleted)
- .map(l => ({ worldId: world.id, levelId: l.id })),
- unlockedLevels: world.levels
- .filter(l => l.isUnlocked)
- .map(l => ({ worldId: world.id, levelId: l.id }))
- };
- localStorage.setItem('gameProgress', JSON.stringify(gameState));
- }
+ // Remove from source section's available words
+ const sourceLevel = state.levels.find(w => w.id === sourceLevelId);
+ const sourceSection = sourceLevel?.sections.find(l => l.id === sourceSectionId);
+ if (sourceSection) {
+ sourceSection.availableWords = sourceSection.availableWords.filter(w => w.id !== word.id);
}
},
- goBack: (state) => {
- if (state.currentLevel) {
- state.currentLevel = null;
- } else if (state.currentWorld) {
- state.currentWorld = null;
+ removeFromInventory: (state, action: PayloadAction<{
+ word: Word;
+ targetLevelId: string;
+ targetSectionId: string;
+ }>) => {
+ const { word, targetLevelId, targetSectionId } = action.payload;
+
+ // Remove from level inventory
+ const level = state.levels.find(w => w.id === targetLevelId);
+ if (level) {
+ level.inventory = level.inventory.filter(w => w.id !== word.id);
+ }
+
+ // Add back to target section's available words
+ const targetSection = level?.sections.find(l => l.id === targetSectionId);
+ if (targetSection && !targetSection.availableWords.some(w => w.id === word.id)) {
+ targetSection.availableWords.push(word);
}
},
- loadSavedProgress: (state) => {
- const savedProgress = localStorage.getItem('gameProgress');
- if (savedProgress) {
- const { completedLevels, unlockedLevels } = JSON.parse(savedProgress);
-
- // Restore completed and unlocked states
- completedLevels.forEach(({ worldId, levelId }: { worldId: string, levelId: string }) => {
- const world = state.worlds.find(w => w.id === worldId);
- const level = world?.levels.find(l => l.id === levelId);
- if (level) {
- level.isCompleted = true;
- }
- });
+ checkSolution: (state) => {
+ // Solution checking is now handled in the component
+ },
+ markSectionComplete: (state, action: PayloadAction<{
+ levelId: string;
+ sectionId: string;
+ }>) => {
+ const { levelId, sectionId } = action.payload;
+ const level = state.levels.find(w => w.id === levelId);
+ if (!level) return;
+
+ const section = level.sections.find(l => l.id === sectionId);
+ if (!section) return;
- unlockedLevels.forEach(({ worldId, levelId }: { worldId: string, levelId: string }) => {
- const world = state.worlds.find(w => w.id === worldId);
- const level = world?.levels.find(l => l.id === levelId);
- if (level) {
- level.isUnlocked = true;
- }
- });
+ section.isComplete = true;
+
+ // Unlock next section in the same level if it exists
+ const sectionIndex = level.sections.findIndex(l => l.id === sectionId);
+ if (sectionIndex < level.sections.length - 1) {
+ level.sections[sectionIndex + 1].isUnlocked = true;
+ } else {
+ // If this was the last section in the level
+ level.isComplete = true;
+ // Find and unlock first section of next level if it exists
+ const levelIndex = state.levels.findIndex(w => w.id === levelId);
+ if (levelIndex < state.levels.length - 1) {
+ state.levels[levelIndex + 1].sections[0].isUnlocked = true;
+ }
}
- },
+ }
}
});
export const {
- setCurrentWorld,
setCurrentLevel,
- addToInventory,
+ setCurrentSection,
+ placeWord,
+ addToInventory,
removeFromInventory,
- placeWord,
checkSolution,
- goBack,
- loadSavedProgress,
+ markSectionComplete
} = gameSlice.actions;
export default gameSlice.reducer;
\ No newline at end of file
diff --git a/src/store/initialState.ts b/src/store/initialState.ts
index 8532e46..32e23ce 100644
--- a/src/store/initialState.ts
+++ b/src/store/initialState.ts
@@ -1,134 +1,4 @@
import { GameState } from './types';
+import { parseGameData } from '../utils/gameDataParser';
-export const initialGameState: GameState = {
- worlds: [
- {
- id: 'world1',
- name: 'Elements',
- isUnlocked: true,
- isCompleted: false,
- levels: [
- {
- id: 'level1',
- name: 'Basic Elements',
- isUnlocked: true,
- isCompleted: false,
- slots: [
- { id: 'slot111', acceptedWords: ['Strawberry', 'Apple', 'Rage'], currentWord: null, hintWord: 'Red' },
- { id: 'slot112', acceptedWords: ['Eggplant', 'Potato'], currentWord: null, hintWord: 'Purple' },
- { id: 'slot113', acceptedWords: ['Banana', 'Garlic', 'Potato', 'Lemon'], currentWord: null, hintWord: 'Yellow' },
- { id: 'slot114', acceptedWords: ['Lettuce', 'Kiwi', 'Strawberry', 'Money'], currentWord: null, hintWord: 'Green' },
- { id: 'slot115', acceptedWords: ['Blackberry'], currentWord: null, hintWord: 'Black' },
- ],
- availableWords: [
- { id: 'w111', text: 'Strawberry' },
- { id: 'w112', text: 'Eggplant' },
- { id: 'w113', text: 'Banana' },
- { id: 'w114', text: 'Kiwi' },
- { id: 'w115', text: 'Blackberry' },
-
- ]
- },
- {
- id: 'level2',
- name: 'Fruits',
- isUnlocked: false,
- isCompleted: false,
- slots: [
- { id: 'slot121', acceptedWords: ['Apple', 'Pumpkin'], currentWord: null, hintWord: 'Orange' },
- { id: 'slot122', acceptedWords: ['Blueberry', 'Sadness'], currentWord: null, hintWord: 'Blue' },
- { id: 'slot123', acceptedWords: ['Grape', 'Blueberry', 'Blackberry', 'Eggplant'], currentWord: null, hintWord: 'Purple' },
- { id: 'slot124', acceptedWords: ['Garlic', 'Strawberry', 'Potato'], currentWord: null, hintWord: 'White' },
- { id: 'slot125', acceptedWords: ['Kiwi', 'Potato', 'Banana'], currentWord: null, hintWord: 'Brown' }
- ],
- availableWords: [
- { id: 'w121', text: 'Apple' },
- { id: 'w122', text: 'Blueberry' },
- { id: 'w123', text: 'Grape' },
- { id: 'w124', text: 'Garlic' },
- { id: 'w125', text: 'Lettuce' },
- ]
- },
- {
- id: 'level3',
- name: 'Vegetables',
- isUnlocked: false,
- isCompleted: false,
- slots: [
- { id: 'slot131', acceptedWords: ['Apple', 'Banana', 'Grape', 'Kiwi', 'Blackberry', 'Blueberry', 'Eggplant', 'Strawberry', 'Lemon'], currentWord: null, hintWord: 'Fruit' },
- { id: 'slot132', acceptedWords: ['Lettuce', 'Garlic', 'Eggplant', 'Potato', 'Pumpkin'], currentWord: null, hintWord: 'Vegetable' },
- { id: 'slot133', acceptedWords: ['Strawberry', 'Blackberry', 'Kiwi', 'Blueberry'], currentWord: null, hintWord: 'Berry' },
- { id: 'slot134', acceptedWords: ['Lettuce', 'Garlic', 'Eggplant', 'Pumpkin', 'Potato'], currentWord: null, hintWord: 'Vegetable' },
- { id: 'slot135', acceptedWords: ['Apple', 'Banana', 'Grape', 'Kiwi', 'Blackberry', 'Blueberry', 'Eggplant', 'Strawberry', 'Lemon'], currentWord: null, hintWord: 'Fruit' }
- ],
- availableWords: [
- { id: 'w131', text: 'Sadness' }, // blue = sad synonym
- { id: 'w132', text: 'Money' }, // green = envious synonym
- { id: 'w133', text: 'Rage' }, // red = rage synonym
- { id: 'w134', text: 'Potato' },
- { id: 'w135', text: 'Pumpkin' },
- ]
- },
- {
- id: 'level4',
- name: 'Animals',
- isUnlocked: false,
- isCompleted: false,
- slots: [
- { id: 'slot141', acceptedWords: ['Rose', 'River'], currentWord: null, hintWord: 'Flower' },
- { id: 'slot142', acceptedWords: [
- 'Strawberry', 'Kiwi', 'Garlic', 'Potato', 'Pumpkin',
- 'Eggplant', 'Apple', 'Blueberry', 'Grape', 'Banana',
- 'Blackberry', 'Rose', 'Lemon'
- ], currentWord: null, hintWord: 'Plant' },
- { id: 'slot143', acceptedWords: ['Dog', 'Kiwi', 'Snake'], currentWord: null, hintWord: 'Animal' },
- { id: 'slot144', acceptedWords: ['Garlic', 'Kiwi'], currentWord: null, hintWord: 'Bird' },
- { id: 'slot145', acceptedWords: ['Dog'], currentWord: null, hintWord: 'Mammel' }
- ],
- availableWords: [
- { id: 'w141', text: 'Rose' },
- { id: 'w142', text: 'Lemon' },
- { id: 'w143', text: 'Dog' },
- { id: 'w144', text: 'River' },
- { id: 'w145', text: 'Snake' },
- ]
- },
- {
- id: 'level5',
- name: 'Plants',
- isUnlocked: false,
- isCompleted: false,
- slots: [
- { id: 'slot151', acceptedWords: ['Apple'], currentWord: null, hintWord: 'Orange' },
- { id: 'slot152', acceptedWords: ['Blueberry'], currentWord: null, hintWord: 'Blue' },
- { id: 'slot153', acceptedWords: ['Grape', 'Blueberry', 'Blackberry'], currentWord: null, hintWord: 'Purple' },
- { id: 'slot154', acceptedWords: ['Garlic', 'Strawberry'], currentWord: null, hintWord: 'White' },
- { id: 'slot155', acceptedWords: ['Kiwi'], currentWord: null, hintWord: 'Brown' }
- ],
- availableWords: [
- { id: 'w151', text: 'Apple' },
- { id: 'w152', text: 'Blueberry' },
- { id: 'w153', text: 'Grape' },
- { id: 'w154', text: 'Garlic' },
- { id: 'w155', text: 'Lettuce' },
- ]
- },
- ]
- }
- ],
- currentWorld: null,
- currentLevel: null,
- inventory: []
-};
-
-// wind
-// flower
-// runner
-// fire
-// plant
-// spring
-// scale
-// bat
-// match
-
-//
\ No newline at end of file
+export const initialGameState: GameState = parseGameData();
\ No newline at end of file
diff --git a/src/store/types.ts b/src/store/types.ts
index 92c0b87..0072964 100644
--- a/src/store/types.ts
+++ b/src/store/types.ts
@@ -3,33 +3,62 @@ export interface Word {
text: string;
}
+export interface Hint {
+ accepts: string[];
+ emojis?: { [word: string]: string };
+}
+
+export interface HintDictionary {
+ [key: string]: Hint;
+}
+
export interface Slot {
id: string;
- acceptedWords: string[];
+ hintId: string;
currentWord: Word | null;
- hintWord: string;
}
-export interface Level {
+export interface Section {
id: string;
name: string;
- isUnlocked: boolean;
- isCompleted: boolean;
slots: Slot[];
availableWords: Word[];
+ isComplete?: boolean;
+ isUnlocked?: boolean;
}
-export interface World {
+export interface Level {
id: string;
name: string;
- isUnlocked: boolean;
- isCompleted: boolean;
- levels: Level[];
+ sections: Section[];
+ isComplete?: boolean;
+ inventory: Word[];
}
export interface GameState {
- worlds: World[];
- currentWorld: string | null;
+ levels: Level[];
currentLevel: string | null;
+ currentSection: string | null;
inventory: Word[];
+ hints: HintDictionary;
+}
+
+// Raw data interfaces (before transformation)
+export type RawSlot = string;
+
+export interface RawSection {
+ name: string;
+ slots: RawSlot[];
+ words: string[];
+}
+
+export interface RawLevel {
+ name: string;
+ sections: RawSection[];
+}
+
+export interface RawGameData {
+ hints: HintDictionary;
+ levels: RawLevel[];
+ wordEmojis: { [word: string]: string };
}
\ No newline at end of file
diff --git a/src/styles/GameBoard.css b/src/styles/GameBoard.css
new file mode 100644
index 0000000..71ad36c
--- /dev/null
+++ b/src/styles/GameBoard.css
@@ -0,0 +1,50 @@
+.game-board-container {
+ min-height: calc(100vh - var(--navbar-height));
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+ padding: 1rem;
+ display: flex;
+ justify-content: center;
+ align-items: flex-start;
+ position: relative;
+ overflow: hidden;
+}
+
+.game-board {
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 24px;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ padding: 2rem;
+ width: 100%;
+ max-width: 1200px;
+ margin: 0 auto;
+ position: relative;
+ z-index: 1;
+}
+
+.level-content {
+ padding: 0.5rem;
+}
+
+.hint-word {
+ font-size: 2rem;
+ font-weight: 500;
+ margin-bottom: 0.5rem;
+ color: #424242;
+}
+
+/* Responsive adjustments */
+@media (max-width: 768px) {
+ .game-board-container {
+ padding: 1rem;
+ }
+
+ .game-board {
+ padding: 1rem;
+ }
+
+ .level-content {
+ padding: 0.5rem;
+ }
+}
\ No newline at end of file
diff --git a/src/styles/Home.css b/src/styles/Home.css
new file mode 100644
index 0000000..659a571
--- /dev/null
+++ b/src/styles/Home.css
@@ -0,0 +1,166 @@
+.home-container {
+ min-height: calc(100vh - var(--navbar-height));
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
+ overflow: hidden;
+}
+
+.hero-section {
+ text-align: center;
+ padding: 3rem 2rem 2rem;
+ max-width: 800px;
+ margin: 1rem;
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 24px;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ position: relative;
+ z-index: 1;
+}
+
+.title {
+ font-family: 'Outfit', sans-serif;
+ font-size: 3.5rem;
+ font-weight: 700;
+ color: #1a237e;
+ margin-bottom: 1.5rem;
+ text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.subtitle {
+ font-size: 1.2rem;
+ color: #424242;
+ margin-bottom: 2rem;
+ line-height: 1.8;
+}
+
+.word-line {
+ margin: 1.5rem 0;
+ line-height: 2.2;
+}
+
+.word-line:first-child {
+ margin-top: 0;
+}
+
+.game-explanation {
+ margin-top: 2rem;
+ color: #666;
+ font-size: 1.1rem;
+}
+
+.cta-buttons {
+ display: flex;
+ gap: 1rem;
+ justify-content: center;
+ margin-top: 2rem;
+ margin-bottom: 0;
+}
+
+.play-button,
+.leaderboard-button {
+ padding: 1rem 2rem;
+ font-size: 1.1rem;
+ border: none;
+ border-radius: 12px;
+ cursor: pointer;
+ font-weight: 600;
+ transition: all 0.3s ease;
+}
+
+.play-button {
+ background: #2196f3;
+ color: white;
+ box-shadow: 0 4px 6px rgba(33, 150, 243, 0.3);
+}
+
+.play-button:hover {
+ background: #1976d2;
+ transform: translateY(-2px);
+ box-shadow: 0 6px 8px rgba(33, 150, 243, 0.4);
+}
+
+.leaderboard-button {
+ background: rgba(255, 255, 255, 0.9);
+ color: #2196f3;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+}
+
+.leaderboard-button:hover {
+ background: white;
+ transform: translateY(-2px);
+ box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15);
+}
+
+.features-section {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+ gap: 2rem;
+ padding: 2rem;
+ max-width: 1200px;
+ margin: 0 auto;
+}
+
+.feature-card {
+ background: rgba(255, 255, 255, 0.9);
+ padding: 2rem;
+ border-radius: 16px;
+ text-align: center;
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
+ transition: transform 0.3s ease;
+}
+
+.feature-card:hover {
+ transform: translateY(-5px);
+}
+
+.feature-icon {
+ font-size: 2.5rem;
+ margin-bottom: 1rem;
+}
+
+.feature-card h3 {
+ color: #1a237e;
+ margin-bottom: 0.5rem;
+ font-size: 1.3rem;
+}
+
+.feature-card p {
+ color: #666;
+ font-size: 1rem;
+ line-height: 1.5;
+}
+
+@media (max-width: 768px) {
+ .title {
+ font-size: 2.5rem;
+ }
+
+ .cta-buttons {
+ flex-direction: column;
+ }
+
+ .features-section {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* Add falling words animation styles */
+@keyframes fall {
+ from {
+ transform: translateY(-100%);
+ }
+ to {
+ transform: translateY(100vh);
+ }
+}
+
+.falling-word {
+ position: absolute;
+ animation: fall linear infinite;
+ pointer-events: none;
+}
\ No newline at end of file
diff --git a/src/styles/Navbar.css b/src/styles/Navbar.css
new file mode 100644
index 0000000..77760cf
--- /dev/null
+++ b/src/styles/Navbar.css
@@ -0,0 +1,29 @@
+.custom-navbar {
+ backdrop-filter: blur(10px);
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.brand-link {
+ color: #1a237e !important;
+ text-decoration: none;
+ transition: color 0.3s ease;
+ font-family: 'Outfit', sans-serif;
+ font-weight: 600;
+ font-size: 1.4rem;
+ padding: 0.5rem 0;
+}
+
+.brand-link:hover {
+ color: #151b60 !important;
+}
+
+/* Mobile responsiveness */
+@media (max-width: 768px) {
+ .custom-navbar {
+ padding: 0.75rem;
+ }
+
+ .brand-link {
+ font-size: 1.2rem;
+ }
+}
\ No newline at end of file
diff --git a/src/styles/WorldSelect.css b/src/styles/WorldSelect.css
new file mode 100644
index 0000000..6af3179
--- /dev/null
+++ b/src/styles/WorldSelect.css
@@ -0,0 +1,74 @@
+.world-select-container {
+ padding-top: 6rem;
+ min-height: 100vh;
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+}
+
+.world-select-title {
+ text-align: center;
+ color: #1a237e;
+ margin-bottom: 3rem;
+ font-weight: bold;
+ text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.worlds-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
+ gap: 2rem;
+ padding: 1rem;
+ max-width: 1200px;
+ margin: 0 auto;
+}
+
+.world-card {
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
+ cursor: pointer;
+ background: white;
+}
+
+.world-card:hover:not(.disabled) {
+ transform: translateY(-5px);
+ box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1) !important;
+}
+
+.world-card.disabled {
+ opacity: 0.7;
+ cursor: not-allowed;
+ background: #f8f9fa;
+}
+
+.world-icon-wrapper {
+ width: 64px;
+ height: 64px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 50%;
+ background: #2196f3;
+ color: white;
+}
+
+.world-icon-wrapper.disabled {
+ background: #adb5bd;
+}
+
+.container {
+ min-height: 100vh;
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+ padding-top: 5rem !important;
+}
+
+.card-title {
+ text-align: center;
+ font-size: 1.5rem;
+ margin-bottom: 1rem;
+ color: #1a237e;
+}
+
+.card-text {
+ text-align: center;
+ color: #666;
+ font-size: 1rem;
+ line-height: 1.5;
+}
\ No newline at end of file
diff --git a/src/utils/gameDataParser.ts b/src/utils/gameDataParser.ts
new file mode 100644
index 0000000..52e7157
--- /dev/null
+++ b/src/utils/gameDataParser.ts
@@ -0,0 +1,50 @@
+import { GameState, RawGameData, Level, Section, Slot, Word } from '../store/types';
+import gameData from '../data/gameData.json';
+
+function generateLevelId(levelIndex: number): string {
+ return `level_${levelIndex + 1}`;
+}
+
+function generateSectionId(levelIndex: number, sectionIndex: number): string {
+ return `section_${levelIndex + 1}_${sectionIndex + 1}`;
+}
+
+function generateSlotId(levelIndex: number, sectionIndex: number, slotIndex: number): string {
+ return `slot_${levelIndex + 1}_${sectionIndex + 1}_${slotIndex + 1}`;
+}
+
+function generateWordId(levelIndex: number, sectionIndex: number, wordIndex: number): string {
+ return `word_${levelIndex + 1}_${sectionIndex + 1}_${wordIndex + 1}`;
+}
+
+export function parseGameData(): GameState {
+ const rawData = gameData as RawGameData;
+
+ return {
+ levels: rawData.levels.map((level, levelIndex) => ({
+ id: generateLevelId(levelIndex),
+ name: level.name,
+ isComplete: false,
+ sections: level.sections.map((section, sectionIndex) => ({
+ id: generateSectionId(levelIndex, sectionIndex),
+ name: section.name,
+ isUnlocked: levelIndex === 0 && sectionIndex === 0, // First section of first level is unlocked by default
+ isComplete: false,
+ slots: section.slots.map((hintId, slotIndex) => ({
+ id: generateSlotId(levelIndex, sectionIndex, slotIndex),
+ hintId,
+ currentWord: null
+ })),
+ availableWords: section.words.map((word, wordIndex) => ({
+ id: generateWordId(levelIndex, sectionIndex, wordIndex),
+ text: word
+ }))
+ })),
+ inventory: []
+ })),
+ currentLevel: null,
+ currentSection: null,
+ inventory: [],
+ hints: rawData.hints
+ };
+}
\ No newline at end of file
diff --git a/test_output.txt b/test_output.txt
new file mode 100644
index 0000000..8b0babe
Binary files /dev/null and b/test_output.txt differ
diff --git a/tsconfig.dev.json b/tsconfig.dev.json
new file mode 100644
index 0000000..72c1d9f
--- /dev/null
+++ b/tsconfig.dev.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "skipLibCheck": true,
+ "noEmit": false,
+ "incremental": true,
+ "tsBuildInfoFile": "./node_modules/.cache/tsbuildinfo"
+ }
+}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index a273b0c..4bbd793 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -18,7 +18,9 @@
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
- "jsx": "react-jsx"
+ "jsx": "react-jsx",
+ "incremental": true,
+ "noImplicitAny": false
},
"include": [
"src"
diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo
new file mode 100644
index 0000000..b0dd8f7
--- /dev/null
+++ b/tsconfig.tsbuildinfo
@@ -0,0 +1 @@
+{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/@types/react/ts5.0/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/ts5.0/index.d.ts","./node_modules/@types/react/ts5.0/jsx-runtime.d.ts","./node_modules/@remix-run/router/dist/history.d.ts","./node_modules/@remix-run/router/dist/utils.d.ts","./node_modules/@remix-run/router/dist/router.d.ts","./node_modules/@remix-run/router/dist/index.d.ts","./node_modules/react-router/dist/lib/context.d.ts","./node_modules/react-router/dist/lib/components.d.ts","./node_modules/react-router/dist/lib/hooks.d.ts","./node_modules/react-router/dist/lib/deprecations.d.ts","./node_modules/react-router/dist/index.d.ts","./node_modules/react-router-dom/dist/dom.d.ts","./node_modules/react-router-dom/dist/index.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/react-redux/es/utils/reactBatchedUpdates.d.ts","./node_modules/redux/index.d.ts","./node_modules/react-redux/es/utils/Subscription.d.ts","./node_modules/@types/hoist-non-react-statics/index.d.ts","./node_modules/react-redux/es/connect/selectorFactory.d.ts","./node_modules/@types/use-sync-external-store/index.d.ts","./node_modules/@types/use-sync-external-store/with-selector.d.ts","./node_modules/react-redux/es/utils/useSyncExternalStore.d.ts","./node_modules/react-redux/es/components/connect.d.ts","./node_modules/react-redux/es/types.d.ts","./node_modules/react-redux/es/hooks/useSelector.d.ts","./node_modules/react-redux/es/components/Context.d.ts","./node_modules/react-redux/es/components/Provider.d.ts","./node_modules/react-redux/es/hooks/useDispatch.d.ts","./node_modules/react-redux/es/hooks/useStore.d.ts","./node_modules/react-redux/es/utils/shallowEqual.d.ts","./node_modules/react-redux/es/exports.d.ts","./node_modules/react-redux/es/index.d.ts","./node_modules/immer/dist/utils/env.d.ts","./node_modules/immer/dist/utils/errors.d.ts","./node_modules/immer/dist/types/types-external.d.ts","./node_modules/immer/dist/types/types-internal.d.ts","./node_modules/immer/dist/utils/common.d.ts","./node_modules/immer/dist/utils/plugins.d.ts","./node_modules/immer/dist/core/scope.d.ts","./node_modules/immer/dist/core/finalize.d.ts","./node_modules/immer/dist/core/proxy.d.ts","./node_modules/immer/dist/core/immerClass.d.ts","./node_modules/immer/dist/core/current.d.ts","./node_modules/immer/dist/internal.d.ts","./node_modules/immer/dist/plugins/es5.d.ts","./node_modules/immer/dist/plugins/patches.d.ts","./node_modules/immer/dist/plugins/mapset.d.ts","./node_modules/immer/dist/plugins/all.d.ts","./node_modules/immer/dist/immer.d.ts","./node_modules/reselect/es/versionedTypes/ts47-mergeParameters.d.ts","./node_modules/reselect/es/types.d.ts","./node_modules/reselect/es/defaultMemoize.d.ts","./node_modules/reselect/es/index.d.ts","./node_modules/@reduxjs/toolkit/dist/createDraftSafeSelector.d.ts","./node_modules/redux-thunk/es/types.d.ts","./node_modules/redux-thunk/es/index.d.ts","./node_modules/@reduxjs/toolkit/dist/devtoolsExtension.d.ts","./node_modules/@reduxjs/toolkit/dist/actionCreatorInvariantMiddleware.d.ts","./node_modules/@reduxjs/toolkit/dist/immutableStateInvariantMiddleware.d.ts","./node_modules/@reduxjs/toolkit/dist/serializableStateInvariantMiddleware.d.ts","./node_modules/@reduxjs/toolkit/dist/utils.d.ts","./node_modules/@reduxjs/toolkit/dist/tsHelpers.d.ts","./node_modules/@reduxjs/toolkit/dist/getDefaultMiddleware.d.ts","./node_modules/@reduxjs/toolkit/dist/configureStore.d.ts","./node_modules/@reduxjs/toolkit/dist/createAction.d.ts","./node_modules/@reduxjs/toolkit/dist/mapBuilders.d.ts","./node_modules/@reduxjs/toolkit/dist/createReducer.d.ts","./node_modules/@reduxjs/toolkit/dist/createSlice.d.ts","./node_modules/@reduxjs/toolkit/dist/entities/models.d.ts","./node_modules/@reduxjs/toolkit/dist/entities/create_adapter.d.ts","./node_modules/@reduxjs/toolkit/dist/createAsyncThunk.d.ts","./node_modules/@reduxjs/toolkit/dist/matchers.d.ts","./node_modules/@reduxjs/toolkit/dist/nanoid.d.ts","./node_modules/@reduxjs/toolkit/dist/isPlainObject.d.ts","./node_modules/@reduxjs/toolkit/dist/listenerMiddleware/exceptions.d.ts","./node_modules/@reduxjs/toolkit/dist/listenerMiddleware/types.d.ts","./node_modules/@reduxjs/toolkit/dist/listenerMiddleware/index.d.ts","./node_modules/@reduxjs/toolkit/dist/autoBatchEnhancer.d.ts","./node_modules/@reduxjs/toolkit/dist/index.d.ts","./src/data/gameData.json","./src/store/types.ts","./src/store/gameSlice.ts","./src/store/store.ts","./node_modules/react-bootstrap/esm/AccordionContext.d.ts","./node_modules/@restart/ui/esm/types.d.ts","./node_modules/react-bootstrap/esm/helpers.d.ts","./node_modules/react-bootstrap/esm/AccordionButton.d.ts","./node_modules/@types/react-transition-group/Transition.d.ts","./node_modules/react-bootstrap/esm/Collapse.d.ts","./node_modules/react-bootstrap/esm/AccordionCollapse.d.ts","./node_modules/react-bootstrap/esm/AccordionItem.d.ts","./node_modules/react-bootstrap/esm/AccordionHeader.d.ts","./node_modules/react-bootstrap/esm/AccordionBody.d.ts","./node_modules/react-bootstrap/esm/Accordion.d.ts","./node_modules/react-bootstrap/esm/CloseButton.d.ts","./node_modules/@popperjs/core/lib/enums.d.ts","./node_modules/@popperjs/core/lib/modifiers/popperOffsets.d.ts","./node_modules/@popperjs/core/lib/modifiers/flip.d.ts","./node_modules/@popperjs/core/lib/modifiers/hide.d.ts","./node_modules/@popperjs/core/lib/modifiers/offset.d.ts","./node_modules/@popperjs/core/lib/modifiers/eventListeners.d.ts","./node_modules/@popperjs/core/lib/modifiers/computeStyles.d.ts","./node_modules/@popperjs/core/lib/modifiers/arrow.d.ts","./node_modules/@popperjs/core/lib/modifiers/preventOverflow.d.ts","./node_modules/@popperjs/core/lib/modifiers/applyStyles.d.ts","./node_modules/@popperjs/core/lib/types.d.ts","./node_modules/@popperjs/core/lib/modifiers/index.d.ts","./node_modules/@popperjs/core/lib/utils/detectOverflow.d.ts","./node_modules/@popperjs/core/lib/createPopper.d.ts","./node_modules/@popperjs/core/lib/popper-lite.d.ts","./node_modules/@popperjs/core/lib/popper.d.ts","./node_modules/@popperjs/core/lib/index.d.ts","./node_modules/@popperjs/core/index.d.ts","./node_modules/@restart/ui/esm/usePopper.d.ts","./node_modules/react-bootstrap/esm/types.d.ts","./node_modules/react-bootstrap/esm/AlertLink.d.ts","./node_modules/react-bootstrap/esm/AlertHeading.d.ts","./node_modules/react-bootstrap/esm/Alert.d.ts","./node_modules/@restart/ui/esm/Anchor.d.ts","./node_modules/react-bootstrap/esm/Anchor.d.ts","./node_modules/react-bootstrap/esm/Badge.d.ts","./node_modules/react-bootstrap/esm/BreadcrumbItem.d.ts","./node_modules/react-bootstrap/esm/Breadcrumb.d.ts","./node_modules/@restart/ui/esm/Button.d.ts","./node_modules/react-bootstrap/esm/Button.d.ts","./node_modules/react-bootstrap/esm/ButtonGroup.d.ts","./node_modules/react-bootstrap/esm/ButtonToolbar.d.ts","./node_modules/react-bootstrap/esm/CardImg.d.ts","./node_modules/react-bootstrap/esm/CardTitle.d.ts","./node_modules/react-bootstrap/esm/CardSubtitle.d.ts","./node_modules/react-bootstrap/esm/CardBody.d.ts","./node_modules/react-bootstrap/esm/CardLink.d.ts","./node_modules/react-bootstrap/esm/CardText.d.ts","./node_modules/react-bootstrap/esm/CardHeader.d.ts","./node_modules/react-bootstrap/esm/CardFooter.d.ts","./node_modules/react-bootstrap/esm/CardImgOverlay.d.ts","./node_modules/react-bootstrap/esm/Card.d.ts","./node_modules/react-bootstrap/esm/CardGroup.d.ts","./node_modules/react-bootstrap/esm/CarouselCaption.d.ts","./node_modules/react-bootstrap/esm/CarouselItem.d.ts","./node_modules/react-bootstrap/esm/Carousel.d.ts","./node_modules/react-bootstrap/esm/Col.d.ts","./node_modules/react-bootstrap/esm/Container.d.ts","./node_modules/@restart/ui/esm/DropdownContext.d.ts","./node_modules/@restart/ui/esm/useClickOutside.d.ts","./node_modules/@restart/ui/esm/DropdownMenu.d.ts","./node_modules/@restart/ui/esm/DropdownToggle.d.ts","./node_modules/@restart/ui/esm/DropdownItem.d.ts","./node_modules/@restart/ui/esm/Dropdown.d.ts","./node_modules/react-bootstrap/esm/DropdownContext.d.ts","./node_modules/react-bootstrap/esm/DropdownToggle.d.ts","./node_modules/react-bootstrap/esm/DropdownMenu.d.ts","./node_modules/react-bootstrap/esm/DropdownItem.d.ts","./node_modules/react-bootstrap/esm/DropdownItemText.d.ts","./node_modules/react-bootstrap/esm/DropdownDivider.d.ts","./node_modules/react-bootstrap/esm/DropdownHeader.d.ts","./node_modules/react-bootstrap/esm/Dropdown.d.ts","./node_modules/react-bootstrap/esm/DropdownButton.d.ts","./node_modules/react-bootstrap/esm/Fade.d.ts","./node_modules/react-bootstrap/esm/Image.d.ts","./node_modules/react-bootstrap/esm/FigureCaption.d.ts","./node_modules/react-bootstrap/esm/Figure.d.ts","./node_modules/react-bootstrap/esm/FigureImage.d.ts","./node_modules/react-bootstrap/esm/FormGroup.d.ts","./node_modules/react-bootstrap/esm/Feedback.d.ts","./node_modules/react-bootstrap/esm/FormControl.d.ts","./node_modules/react-bootstrap/esm/FormFloating.d.ts","./node_modules/react-bootstrap/esm/FormCheckInput.d.ts","./node_modules/react-bootstrap/esm/FormCheckLabel.d.ts","./node_modules/react-bootstrap/esm/FormCheck.d.ts","./node_modules/react-bootstrap/esm/FormLabel.d.ts","./node_modules/react-bootstrap/esm/FormText.d.ts","./node_modules/react-bootstrap/esm/FormRange.d.ts","./node_modules/react-bootstrap/esm/FormSelect.d.ts","./node_modules/react-bootstrap/esm/FloatingLabel.d.ts","./node_modules/react-bootstrap/esm/Form.d.ts","./node_modules/react-bootstrap/esm/InputGroupText.d.ts","./node_modules/react-bootstrap/esm/InputGroup.d.ts","./node_modules/@restart/ui/esm/NavItem.d.ts","./node_modules/@restart/ui/esm/Nav.d.ts","./node_modules/react-bootstrap/esm/ListGroupItem.d.ts","./node_modules/react-bootstrap/esm/ListGroup.d.ts","./node_modules/@restart/ui/esm/ModalManager.d.ts","./node_modules/@restart/ui/esm/useWaitForDOMRef.d.ts","./node_modules/@restart/ui/esm/ImperativeTransition.d.ts","./node_modules/@restart/ui/esm/Modal.d.ts","./node_modules/react-bootstrap/esm/ModalBody.d.ts","./node_modules/react-bootstrap/esm/AbstractModalHeader.d.ts","./node_modules/react-bootstrap/esm/ModalHeader.d.ts","./node_modules/react-bootstrap/esm/ModalTitle.d.ts","./node_modules/react-bootstrap/esm/ModalFooter.d.ts","./node_modules/react-bootstrap/esm/ModalDialog.d.ts","./node_modules/react-bootstrap/esm/Modal.d.ts","./node_modules/react-bootstrap/esm/NavItem.d.ts","./node_modules/react-bootstrap/esm/NavLink.d.ts","./node_modules/react-bootstrap/esm/Nav.d.ts","./node_modules/react-bootstrap/esm/NavbarBrand.d.ts","./node_modules/react-bootstrap/esm/NavbarCollapse.d.ts","./node_modules/react-bootstrap/esm/OffcanvasBody.d.ts","./node_modules/react-bootstrap/esm/OffcanvasHeader.d.ts","./node_modules/react-bootstrap/esm/OffcanvasTitle.d.ts","./node_modules/react-bootstrap/esm/Offcanvas.d.ts","./node_modules/react-bootstrap/esm/NavbarOffcanvas.d.ts","./node_modules/react-bootstrap/esm/NavbarText.d.ts","./node_modules/react-bootstrap/esm/NavbarToggle.d.ts","./node_modules/react-bootstrap/esm/Navbar.d.ts","./node_modules/react-bootstrap/esm/NavDropdown.d.ts","./node_modules/react-bootstrap/esm/OffcanvasToggling.d.ts","./node_modules/@restart/ui/esm/useRootClose.d.ts","./node_modules/@restart/ui/esm/Overlay.d.ts","./node_modules/react-bootstrap/esm/Overlay.d.ts","./node_modules/react-bootstrap/esm/OverlayTrigger.d.ts","./node_modules/react-bootstrap/esm/PageItem.d.ts","./node_modules/react-bootstrap/esm/Pagination.d.ts","./node_modules/react-bootstrap/esm/usePlaceholder.d.ts","./node_modules/react-bootstrap/esm/PlaceholderButton.d.ts","./node_modules/react-bootstrap/esm/Placeholder.d.ts","./node_modules/react-bootstrap/esm/PopoverHeader.d.ts","./node_modules/react-bootstrap/esm/PopoverBody.d.ts","./node_modules/react-bootstrap/esm/Popover.d.ts","./node_modules/react-bootstrap/esm/ProgressBar.d.ts","./node_modules/react-bootstrap/esm/Ratio.d.ts","./node_modules/react-bootstrap/esm/Row.d.ts","./node_modules/react-bootstrap/esm/Spinner.d.ts","./node_modules/react-bootstrap/esm/SplitButton.d.ts","./node_modules/@react-aria/ssr/dist/types.d.ts","./node_modules/@restart/ui/esm/ssr.d.ts","./node_modules/react-bootstrap/esm/SSRProvider.d.ts","./node_modules/react-bootstrap/esm/createUtilityClasses.d.ts","./node_modules/react-bootstrap/esm/Stack.d.ts","./node_modules/react-bootstrap/esm/TabPane.d.ts","./node_modules/@restart/ui/esm/TabPanel.d.ts","./node_modules/@restart/ui/esm/Tabs.d.ts","./node_modules/react-bootstrap/esm/TabContainer.d.ts","./node_modules/react-bootstrap/esm/TabContent.d.ts","./node_modules/react-bootstrap/esm/Tab.d.ts","./node_modules/react-bootstrap/esm/Table.d.ts","./node_modules/react-bootstrap/esm/Tabs.d.ts","./node_modules/react-bootstrap/esm/ThemeProvider.d.ts","./node_modules/react-bootstrap/esm/ToastBody.d.ts","./node_modules/react-bootstrap/esm/ToastHeader.d.ts","./node_modules/react-bootstrap/esm/Toast.d.ts","./node_modules/react-bootstrap/esm/ToastContainer.d.ts","./node_modules/react-bootstrap/esm/ToggleButton.d.ts","./node_modules/react-bootstrap/esm/ToggleButtonGroup.d.ts","./node_modules/react-bootstrap/esm/Tooltip.d.ts","./node_modules/react-bootstrap/esm/index.d.ts","./node_modules/react-icons/lib/cjs/iconsManifest.d.ts","./node_modules/react-icons/lib/cjs/iconBase.d.ts","./node_modules/react-icons/lib/cjs/iconContext.d.ts","./node_modules/react-icons/lib/cjs/index.d.ts","./node_modules/react-icons/fa/index.d.ts","./src/components/Navbar.tsx","./src/components/FallingWords.tsx","./src/components/WordTile.tsx","./src/components/Home.tsx","./src/components/LevelSelector.tsx","./src/components/TutorialOverlay.tsx","./src/components/GameBoard.tsx","./src/App.tsx","./src/App.test.tsx","./node_modules/@types/react-dom/client.d.ts","./node_modules/web-vitals/dist/modules/types.d.ts","./node_modules/web-vitals/dist/modules/getCLS.d.ts","./node_modules/web-vitals/dist/modules/getFCP.d.ts","./node_modules/web-vitals/dist/modules/getFID.d.ts","./node_modules/web-vitals/dist/modules/getLCP.d.ts","./node_modules/web-vitals/dist/modules/getTTFB.d.ts","./node_modules/web-vitals/dist/modules/index.d.ts","./src/reportWebVitals.ts","./src/index.tsx","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/ts5.6/globals.typedarray.d.ts","./node_modules/@types/node/ts5.6/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/ts5.6/index.d.ts","./node_modules/react-scripts/lib/react-app.d.ts","./src/react-app-env.d.ts","./src/setupTests.ts","./src/components/Inventory.tsx","./src/components/WorldSelector.tsx","./src/types/game.ts","./src/context/GameContext.tsx","./src/store/initialState.ts","./tsconfig.json","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@types/connect/index.d.ts","./node_modules/@types/body-parser/index.d.ts","./node_modules/@types/bonjour/index.d.ts","./node_modules/@types/mime/index.d.ts","./node_modules/@types/send/index.d.ts","./node_modules/@types/qs/index.d.ts","./node_modules/@types/range-parser/index.d.ts","./node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/connect-history-api-fallback/index.d.ts","./node_modules/@types/eslint/helpers.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/eslint/index.d.ts","./node_modules/@types/eslint-scope/index.d.ts","./node_modules/@types/http-errors/index.d.ts","./node_modules/@types/serve-static/index.d.ts","./node_modules/@types/express/node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/express/index.d.ts","./node_modules/@types/graceful-fs/index.d.ts","./node_modules/@types/history/DOMUtils.d.ts","./node_modules/@types/history/createBrowserHistory.d.ts","./node_modules/@types/history/createHashHistory.d.ts","./node_modules/@types/history/createMemoryHistory.d.ts","./node_modules/@types/history/LocationUtils.d.ts","./node_modules/@types/history/PathUtils.d.ts","./node_modules/@types/history/index.d.ts","./node_modules/@types/html-minifier-terser/index.d.ts","./node_modules/@types/http-proxy/index.d.ts","./node_modules/@types/istanbul-lib-coverage/index.d.ts","./node_modules/@types/istanbul-lib-report/index.d.ts","./node_modules/@types/istanbul-reports/index.d.ts","./node_modules/@types/json5/index.d.ts","./node_modules/@types/node-forge/index.d.ts","./node_modules/@types/parse-json/index.d.ts","./node_modules/@types/prettier/index.d.ts","./node_modules/@types/q/index.d.ts","./node_modules/@types/react-redux/index.d.ts","./node_modules/@types/react-router/index.d.ts","./node_modules/@types/react-router-dom/index.d.ts","./node_modules/@types/react-transition-group/config.d.ts","./node_modules/@types/react-transition-group/CSSTransition.d.ts","./node_modules/@types/react-transition-group/SwitchTransition.d.ts","./node_modules/@types/react-transition-group/TransitionGroup.d.ts","./node_modules/@types/react-transition-group/index.d.ts","./node_modules/@types/resolve/index.d.ts","./node_modules/@types/retry/index.d.ts","./node_modules/@types/semver/classes/semver.d.ts","./node_modules/@types/semver/functions/parse.d.ts","./node_modules/@types/semver/functions/valid.d.ts","./node_modules/@types/semver/functions/clean.d.ts","./node_modules/@types/semver/functions/inc.d.ts","./node_modules/@types/semver/functions/diff.d.ts","./node_modules/@types/semver/functions/major.d.ts","./node_modules/@types/semver/functions/minor.d.ts","./node_modules/@types/semver/functions/patch.d.ts","./node_modules/@types/semver/functions/prerelease.d.ts","./node_modules/@types/semver/functions/compare.d.ts","./node_modules/@types/semver/functions/rcompare.d.ts","./node_modules/@types/semver/functions/compare-loose.d.ts","./node_modules/@types/semver/functions/compare-build.d.ts","./node_modules/@types/semver/functions/sort.d.ts","./node_modules/@types/semver/functions/rsort.d.ts","./node_modules/@types/semver/functions/gt.d.ts","./node_modules/@types/semver/functions/lt.d.ts","./node_modules/@types/semver/functions/eq.d.ts","./node_modules/@types/semver/functions/neq.d.ts","./node_modules/@types/semver/functions/gte.d.ts","./node_modules/@types/semver/functions/lte.d.ts","./node_modules/@types/semver/functions/cmp.d.ts","./node_modules/@types/semver/functions/coerce.d.ts","./node_modules/@types/semver/classes/comparator.d.ts","./node_modules/@types/semver/classes/range.d.ts","./node_modules/@types/semver/functions/satisfies.d.ts","./node_modules/@types/semver/ranges/max-satisfying.d.ts","./node_modules/@types/semver/ranges/min-satisfying.d.ts","./node_modules/@types/semver/ranges/to-comparators.d.ts","./node_modules/@types/semver/ranges/min-version.d.ts","./node_modules/@types/semver/ranges/valid.d.ts","./node_modules/@types/semver/ranges/outside.d.ts","./node_modules/@types/semver/ranges/gtr.d.ts","./node_modules/@types/semver/ranges/ltr.d.ts","./node_modules/@types/semver/ranges/intersects.d.ts","./node_modules/@types/semver/ranges/simplify.d.ts","./node_modules/@types/semver/ranges/subset.d.ts","./node_modules/@types/semver/internals/identifiers.d.ts","./node_modules/@types/semver/index.d.ts","./node_modules/@types/serve-index/index.d.ts","./node_modules/@types/sockjs/index.d.ts","./node_modules/@types/stack-utils/index.d.ts","./node_modules/@types/trusted-types/lib/index.d.ts","./node_modules/@types/trusted-types/index.d.ts","./node_modules/@types/warning/index.d.ts","./node_modules/@types/ws/index.d.ts","./node_modules/@types/yargs-parser/index.d.ts","./node_modules/@types/yargs/index.d.ts","./src/components/SolutionsCounter.tsx","./src/utils/gameDataParser.ts"],"fileInfos":[{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9","746d62152361558ea6d6115cf0da4dd10ede041d14882ede3568bce5dc4b4f1f","d11a03592451da2d1065e09e61f4e2a9bf68f780f4f6623c18b57816a9679d17","aea179452def8a6152f98f63b191b84e7cbd69b0e248c91e61fb2e52328abe8c",{"version":"3aafcb693fe5b5c3bd277bd4c3a617b53db474fe498fc5df067c5603b1eebde7","affectsGlobalScope":true},{"version":"f3d4da15233e593eacb3965cde7960f3fddf5878528d882bcedd5cbaba0193c7","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"6c55633c733c8378db65ac3da7a767c3cf2cf3057f0565a9124a16a3a2019e87","affectsGlobalScope":true},{"version":"fb4416144c1bf0323ccbc9afb0ab289c07312214e8820ad17d709498c865a3fe","affectsGlobalScope":true},{"version":"5b0ca94ec819d68d33da516306c15297acec88efeb0ae9e2b39f71dbd9685ef7","affectsGlobalScope":true},{"version":"34c839eaaa6d78c8674ae2c37af2236dee6831b13db7b4ef4df3ec889a04d4f2","affectsGlobalScope":true},{"version":"34478567f8a80171f88f2f30808beb7da15eac0538ae91282dd33dce928d98ed","affectsGlobalScope":true},{"version":"ab7d58e6161a550ff92e5aff755dc37fe896245348332cd5f1e1203479fe0ed1","affectsGlobalScope":true},{"version":"6bda95ea27a59a276e46043b7065b55bd4b316c25e70e29b572958fa77565d43","affectsGlobalScope":true},{"version":"aedb8de1abb2ff1095c153854a6df7deae4a5709c37297f9d6e9948b6806fa66","affectsGlobalScope":true},{"version":"a4da0551fd39b90ca7ce5f68fb55d4dc0c1396d589b612e1902f68ee090aaada","affectsGlobalScope":true},{"version":"11ffe3c281f375fff9ffdde8bbec7669b4dd671905509079f866f2354a788064","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true},"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee",{"version":"759efc21a5ff1954e060fa54ddb4a739132b090a43ef9ee6fd63c7838bb07743","affectsGlobalScope":true},"016fe1e807dfdb88e8773616dde55bd04c087675662a393f20b1ec213b4a2b74","5af7c35a9c5c4760fd084fedb6ba4c7059ac9598b410093e5312ac10616bf17b","84bab568c7d984207ed4d872820e5b8185f1de19e0f42e906c8dcdb20e029154","3c8c1edb7ed8a842cb14d9f2ba6863183168a9fc8d6aa15dec221ebf8b946393","0a6e1a3f199d6cc3df0410b4df05a914987b1e152c4beacfd0c5142e15302cac","ec3c1376b4f34b271b1815674546fe09a2f449b0773afd381bbce7eb2f96a731","c2a262a3157e868d279327daf428dd629bd485f825800c8e62b001e6c879aff6","f7e84f314f9276b44b707289446303db8ef34a6c2c6d6b08d03a76e168367072","2b493706eb7879d42a8e8009379292b59827d612ab3a275bc476f87e60259c79","5542628b04d7bd4e0cd4871b6791b3b936a917ac6b819dcd20487f040acb01f1","f07b335f87cfac999fc1da00dfbc616837ced55be67bcaa41524d475b7394554",{"version":"938326adb4731184e14e17fc57fca2a3b69c337ef8d6c00c65d73472fe8feca4","affectsGlobalScope":true},"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","ca319b3b4e8c9c09d27bf3f3c4051bd56a4dc76977cc7a4daf5ad697ec9d605e",{"version":"fd624f7d7b264922476685870f08c5e1c6d6a0f05dee2429a9747b41f6b699d4","affectsGlobalScope":true},"abc162795ad6bf4fc3cf77dd02839ecfb12db1e3d81f817802caa1ce2997b233","b2d0630483bf337ef9dac326c3334a245aa4946e9f60f12baf7da5be44beafbb","5511d10f5955ddf1ba0df5be8a868c22c4c9b52ba6c23fef68cdbd25c8531ed5","61f41da9aaa809e5142b1d849d4e70f3e09913a5cb32c629bf6e61ef27967ff7","da0195f35a277ff34bb5577062514ce75b7a1b12f476d6be3d4489e26fcf00d8","0fdd32135a5a990ce5f3c4439249e4635e2d439161cfad2b00d1c88673948b5e","4bf386c871996a1b4da46fc597d3c16a1f3ddae19527c1551edd833239619219","c3ad993d4903afc006893e88e7ad2bae164e7137f7cd2a0ef1648ff4df4a2490","feaf45e9cfacd68dfdf466a0e0c2c6fa148cccf41e14a458c4d0424af7e94dfb","d33bf1137240c5d0b1949f121aed548bc05e644bb77fdc0070bf716d04491eb9","dbc614c36021e3813a771b426f2522a1dd3641d1fc137f99a145cb499da1b8c3","d2194a2e7680ad3c2d9a75391ba0b0179818ca1dc4abed6caac815a7513c7913","601bf048b074ce1238a426bccd1970330b30297b1a5e063b5910750c631994f1","0fc1fb55c2de7daac4f2378f0a5993ad9c369f6e449a9c87c604c2e78f00f12b","7082184f76e40fcf9562beb1c3d74f3441091501bd4bf4469fe6ced570664b09","6be1912935b6e4430e155de14077a6b443254a4e79a0b836484f6b2d510f6ff1","4df0891b133884cd9ed752d31c7d0ec0a09234e9ed5394abffd3c660761598db","b603b62d3dcd31ef757dc7339b4fa8acdbca318b0fb9ac485f9a1351955615f9","e642bd47b75ad6b53cbf0dfd7ddfa0f120bd10193f0c58ec37d87b59bf604aca","be90b24d2ee6f875ce3aaa482e7c41a54278856b03d04212681c4032df62baf9","78f5ff400b3cb37e7b90eef1ff311253ed31c8cb66505e9828fad099bffde021","372c47090e1131305d163469a895ff2938f33fa73aad988df31cd31743f9efb6","71c67dc6987bdbd5599353f90009ff825dd7db0450ef9a0aee5bb0c574d18512","6f12403b5eca6ae7ca8e3efe3eeb9c683b06ce3e3844ccfd04098d83cd7e4957","282c535df88175d64d9df4550d2fd1176fd940c1c6822f1e7584003237f179d3","c3a4752cf103e4c6034d5bd449c8f9d5e7b352d22a5f8f9a41a8efb11646f9c2","11a9e38611ac3c77c74240c58b6bd64a0032128b29354e999650f1de1e034b1c","4ed103ca6fff9cb244f7c4b86d1eb28ce8069c32db720784329946731badb5bb","d738f282842970e058672663311c6875482ee36607c88b98ffb6604fba99cb2a","ec859cd8226aa623e41bbb47c249a55ee16dc1b8647359585244d57d3a5ed0c7","8891c6e959d253a66434ff5dc9ae46058fb3493e84b4ca39f710ef2d350656b1","c4463cf02535444dcbc3e67ecd29f1972490f74e49957d6fd4282a1013796ba6","0cb0a957ff02de0b25fd0f3f37130ca7f22d1e0dea256569c714c1f73c6791f8","09c17c97eea458ebbabe6829c89d2e39e14b0f552e2a0edccd8dfcfb073a9224","344f2a247086a9f0da967f57fb771f1a2bcc53ef198e6f1293ef9c6073eb93e8","86e96c0b147a9bc378c5e3522156e4ad1334443edb6196b6e2c72ec98e9f7802","5ec92337be24b714732dbb7f4fa72008e92c890b0096a876b8481999f58d7c79","97f3c7370f9a2e28c695893b0109df679932a1cde3c1424003d92581f1b8dda7","d50a158fc581be7b1c51253ad33cb29c0a8ce3c42ca38775ffadf104c36376d0","1f2cdbf59d0b7933678a64ac26ae2818c48ff9ebf93249dde775dc3e173e16bf","62d5bea6d7dd2e9753fb9e0e47a6f401a43a51a3a36fe5082a0a5c200588754c","8fcc8b86f321e4c54820f57ccd0dcbeb0290c14bc05192fea8a096b0fc2be220","a4e0582d077bc6d43c39b60ddb23445c90981540240146e78b41cef285ae26c4","d511b029eaee4f1ec172e75357e21295c9d99690e6d834326bccd16d1a7a8527","89d63fe39f7262f62364de0a99c6be23b9b99841d4d22dee3720e7fd9982bb3d","d37b3eade1a85e9f19a397f790c8a6184ae61efafa97371a1ddff09923727ae7","c876fb242f4dc701f441c984a2136bee5faf52f90244cdc83074104a8fa7d89a","7c4ac500234a10250dd2cfa59f4507f27d4dcc0b69551a4310184a165d75c15e","97c3a26c493f08edc5df878a8c6ca53379c320ff1198c2edbb48ab4102ad7559","cd6aac9f28db710970181cfe3031b602afeec8df62067c632306fc3abd967d0f","03fffbdf01b82805127603c17065f0e6cd79d81e055ec2ed44666072e5a39aae","04af3a1ba7fad31f2ba9b421414a37ece8390fd818cc1de7737ccd3ef80f8381","9a72a659fa7e62ce142c585e0cc814004948d103b969e1971c92c3dfaffda46c","5a776b3003be0c9a9787b16cec55ab073c508bbe6ffa8e7c06e5ba145c85d054","5868cb5a3c2ec960f1380e814345287c7237d3cc21f18c3951011505c7cb2a76","2e45f48aa48512f8cd8872cbf6d3bde5d08acb894411287b85f637ddceeac140","3aaaf6f2f5eaf5fd88054937eece8704c261fad2224e687cef68c25c01c2d83e","71ed61999a29f4614f62ce5660cd3e363ae88a7908c70de794363bfc4c1e50eb","23b2cffed3afc85358c44bb5b85e9d59b78a245732fd573633b3df15b6bdcbbb","f9ca07d4177705fc92b1322d756c4b976c00f6e745c198f13b9c5774a6288a9b","f0974cf5c7df952d128503f08d079678023d49efa1b16bc83ccfd5ae22bd402a","72695932ff1704ba58de83ad6e8fa78612d6537245a794d08043b71f338c3878","c7cfa655e06288327e6c5638ac940098cd6e48a6b07f2bd99a57f5f5958532b0",{"version":"b3e4c1b1db15e753b906b7e45cffa9b518ea4ce4ee7e209e0ea51cd82c1af69f","signature":"b4a0eb33b8a6844b9ccec3d734cb396b9046a1b6ea0955266528663a625440bd"},{"version":"1c947432963cfeb99a5b714694494e3d6f30d3e2276c40cf2a9f5f6547e1b181","signature":"4f996e8efee35face6f6f1757b3b34c4fdcacee7f7696e0bb561b100bed87030"},{"version":"1277ff8690c7c5fe68d100588e09dd85f43f6a29247462a62e95af1e9f12aa34","signature":"614fc9b98271a6bcf1f664c4e68d03c0061314610ff80cf35a971aa20770396a"},"3e2dd16a51ccaca9939e8b608093e72245fa57a460bbe3d2e93e7a95d5e809da","905e543f34d5b01a7683c21b7174e86553add789e8e73322574e8986a01320bd","86dc9e9fd130e12f9eec3e6827caba36fca449361d5039b87fd69c1103e9eb9d","95c78cf183c5e9111e91d895a481dbf13ee29a0a95ef1c1d37513e1cfe913735","23e847832c900bd2360edc9a42a056137344f79aa1b43d72fa8ea3ee107aae73","7c52a6d05a6e68269e63bc63fad6e869368a141ad23a20e2350c831dc499c5f2","4fb9e98536b7318332003b303f87c18f82767ee03a5ea45a24d4d5a52c0aa4ce","c99c404f03d8bbeead149064b13d0962f08051c0e89d1aff74c9db14f2278a08","e5b63a24ca97f2f112ad6ee4907c69da2da1bb17d88bc78d661caab7ec752137","d4066357a89663d4c2f3ad413215114fc0913127c92e1f53b18b8fa834f868c6","6b83014e919aa4065dcd1f3979e4a36615515809344e9091e6fac7f8a49806b0","dbc06330145e5a66bf5e581cf5756d8fcc4f1759ceb54a2dc5bac0b5ebfa8d68","b32e93ba638ba1264c051966d9722733dbfedff365d38fdb982ea5bf7c5ed56c","70a29119482d358ab4f28d28ee2dcd05d6cbf8e678068855d016e10a9256ec12","869ac759ae8f304536d609082732cb025a08dcc38237fe619caf3fcdd41dde6f","0ea900fe6565f9133e06bce92e3e9a4b5a69234e83d40b7df2e1752b8d2b5002","e5408f95ca9ac5997c0fea772d68b1bf390e16c2a8cad62858553409f2b12412","3c1332a48695617fc5c8a1aead8f09758c2e73018bd139882283fb5a5b8536a6","9260b03453970e98ce9b1ad851275acd9c7d213c26c7d86bae096e8e9db4e62b","083838d2f5fea0c28f02ce67087101f43bd6e8697c51fd48029261653095080c","969132719f0f5822e669f6da7bd58ea0eb47f7899c1db854f8f06379f753b365","94ca5d43ff6f9dc8b1812b0770b761392e6eac1948d99d2da443dc63c32b2ec1","2cbc88cf54c50e74ee5642c12217e6fd5415e1b35232d5666d53418bae210b3b","ccb226557417c606f8b1bba85d178f4bcea3f8ae67b0e86292709a634a1d389d","5ea98f44cc9de1fe05d037afe4813f3dcd3a8c5de43bdd7db24624a364fad8e6","5260a62a7d326565c7b42293ed427e4186b9d43d6f160f50e134a18385970d02","0b3fc2d2d41ad187962c43cb38117d0aee0d3d515c8a6750aaea467da76b42aa","ed219f328224100dad91505388453a8c24a97367d1bc13dcec82c72ab13012b7","6847b17c96eb44634daa112849db0c9ade344fe23e6ced190b7eeb862beca9f4","d479a5128f27f63b58d57a61e062bd68fa43b684271449a73a4d3e3666a599a7","6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0","f16aba91e2c61a7212ad4168386e272a871a351887e39115a36d25f770eb4c52","897ace290357b8e2460083fea21dc587f8503c787989cd9971cc63733ab88ce1","819cef4173bb37e7e8d523e88154af2329a4a258ccc036720cfcb217791b3868","e7cbe066de1dee3ea5fe58926aea6f1a07b1e71778fd8ff7144d4285574c7ed2","0d04b6c350398090d56a4e5bda575a560c95fdea6106f9744b5cc0905aab2553","e90f8bf88ed262c122d7f30c06e7f67c446e6e5236baed71ebafec7998b3f645","1ee226af7851d92c2fdc09c7ba8f84036d991edbda398a217e173821d62ad379","dd277157cf6aa8e937ad497026495adac453a064d7f9637c63a81b74d70d84e0","b84d5aeda18459510f6da1b821bce917622c51e184d1d58415ee3dc48d6180ef","bbe2b0d328e116df2e8cf8c2de9a078758fd422e6f0e117a3c73ac2e02855a2f","059dfb5dfbcafc00259b223a56c4957414b17d19b3e44b68f945ca02a6d80a02","7837dda0e930b2849976141cd7ad0637703f4cca76ff8539e4c76ac07dd678ca","04008a524815b9509d7d64dda18bf4594311a415dbbb271521d1078cb1c7850b","86c3a40fa2deabd9d08b8d835f12d2e6fb8bc2e572006c4f3302a2b4589ad9db","8f306dabdc2e130f1926f6abd04d233fd84ccf071e3d745a971112dcc87e591b","f41b3bea6012d76f83097c1079d99406054a22d04156afc9eb3955f9b288f8eb","f37d987a6b846dd948d310bf165ab4ac2327bc0d06182323920ef17a1852bec3","16a0a00c9b190a519950aadf21f16a7df1baf2346d64c4c054ad5f7fb71ea8ee","a228c6353575a3d21c2f579a4e860e6542950577f451062fdc578b02c95c22e3","90ed0b14083410a072cbf480a863e7f8ed7202ffb9ba625420a1b2455add33bb","1a75cca03c3c8f71f1a37618b2d3be5649630476761b59137245ec21110bfedf","9751ea85dad9ad6ceeae8fe142daf4d83ea78bede9d5424a326ad0869900ccf7","59cbc2704d281fce3f397e90e823117835deb20535ca8212f153f3bc74d811c6","74c20308aeb6da88368e0418a437d9718d10256ea50b6f428f56e0b982ec3229","21d78bad604829fe443eb962b7f00a17343fe621c2ac57114c7175bec879e17b","a0b27ac9a3c290c7281f922c1dd62afa02f76be63d1fff952f6348ffb019dce3","0b2cf5124c5f89d443dfdd7cae61a6a0b528a8e951ce6a00f3c7ab1ba0d2d534","e012ff0c33485d340ab68fa820d3372296b17efdb6e5cdc29ec99b82a8b159b0","be39c30b631dd7708628c2b40fb8b5164eac615e48de1e78bf02de70cc327283","51057e067bc5db4f55572329981b9ecd0e3d3b96c2b62fdb1dd0ccead1088e43","82f64bdecc73474993d9a44dec8ef0d3c02121580aa02072045bedab11ec882e","b7db045ad68ab5695ea97e40865a5981f146a62aa86f1261ad1aab59dd76e3c0","e90591e0e9e1b3ed53963b26c307bfe74f09131581f5ce6ed76a87f748d99991","52af945810b09a08235b252421270e767303cdf9b932bc5f957b2538f38a02d1","53029155e358b3b324dd5e38332f1809848e601057823892a9e77b6b3a9d140e","313f55101d2baeb5f01dc30f100d136190debad5ffa4453581843efa3219689a","05e638a171f5969fca61933d6d89f30f5acbbc70b74d2539957a688a5292b55c","43dd0f8de489f3111652b6c425cd01bb9259234bef62761440d2a982cb9d958e","0a36bd27b6af811f763d5f1254637ce9300574f02e875f5e1b23110829357e38","3ea0e65a45f7006261c963f7abcac37a91513eadf72aeef909cb2ad7676cc4f1","5637b24d008a13b63ac8e76579e3c0e595db5c4052bc052414a5fc4f57545bf5","909d0a3ae5c7e3aa435f53cbbeaec617a489283076c61f0cc0f73452e0c6232f","e75c93d9068a6664e2e2827a720def5d5bf6532af5952a6b8fe3eee440ca6b5c","9ea6687a30b28ef46c9cb3fb434d22e4f9b7bf1cbb7cca367bc5b2899583737b","f5f29a11cc28ee80696a7210b16e263fd5136ff04a79bf5df55ede3a4e68b3e9","cf3e2bee2220a6805904d14bf54d2c9e0ad3bf6d76add9244535f8ac34b919e4","98d88c8fd633d0054e791714742e9537b74a68d38a7ff81374e6a61242cea221","fcc19e67c9aa935dfd3e3d38d2b3d2b8215ccb28bc6106d159ed1ae65d667f73","e6f249463d9c5f898b1d0511c58dee7c3e3fe521fd6758749bf12be49e4e937f","3cf11201c92c4e7caf2696e144fa3fb524c6cb25157bb253a2beded585f410cf","d3c220e75847aa7bc24784572947bd48b843d094b22ae4899a45788f2ba70a43","818ea1645d3b08a7c3c4b84c32b4a18eb9f217e46dc8860fc751795ed14bdee0","943a5d4c85180884f41e96002f86848bb8c3dab9eb03c57c97aec80569e75957","d85d01cb4e957275b938d81e3cba52cefdda8b9c8bf84bbc5c70723b11aae30c","283b61717cf35dd0e5cea0726939556d12cd2b42317df2c58bebea511af0b2d5","3e612b62fb8e14ddff1770c41973c96eed5b6f9e5f01993f466f59af57f58f61","3923de820ed7c8998bd8170c8adb87721cbbe21637ba02c9c2dcb5e7d95b789b","aa25eafdac0666baec3e57ec29c08f06b9e21a584cff8d02455afb6e87be152d","e01827704d246accce473fe8e52cae498035950d9fa1673969502d65cd009295","a558a5b0db5e2a479a788d428012fd9172b20f51b4002523ca2ed40380ed7f24","5cd0a91bb8dccc1987e7cf77e5329de6388b5b14eb63d128607cc0465047ffe8","ba779307aa6dcbf7212d09d38e9776e923dcb367ed64f829e5b281b60bc658db","de6f929b32073b81e7206b995bd14cdbdd66b327207c3ccadd3b8f693a0eba19","c58f4a7ebfa3c20f5892b2c363072bc78667f6b7ffa218c8e3898f98a0990064","488762d92f8fa40efc1d1dde82b1d34c6603432fba46bcfd595557459858d695","264f4b5c51f7d901df3ee079949634e339b5fe157ae309ceed45192c63f9af8b","9869582ad4db8288b337d2aa1d0f6a44ac1f6d37e72f19f53188c520b652055a","04ef38fa44488af63b6927e529ccd1092532d5d8a17c8edf96d1d288d1897616","b2d00031dbf4cae85311aaac009fbba3d1b0b4f2e72ab690a86526e740427623","1122f8ac0822eeeb7cf7de02886c71109237d940be5234bc878e9f74a314cb47","88e01429eefdd2493f7d59170ec9fb961717339810cabf9147aed68f1a808f97","047719aed544e716b2243212264bc2e14a1da0d1c710fe6209e228981dc82ae4","47a03bf1241779ad40a0cd2982526cf7547557d720d4db2df410ee166c60aa89","922248fee358d198745ea609ed4c2b2d87a49299fb6be7a1d229a184bbf66fd5","4b4cd67fd08f4a39397ad27ea21468efe758b6e58606984db94e49e6c9186b96","223aff866672813df1b2caafd82b5dbbbbbff07e6994bbd5747df7549c75c427","a37a6e239d0aae9d850b48e4cb55b548162fabadb92beb6d7d0579abc61f5bf0","a06aded6e43b0e09545f26957e5c0a5b4514d327f4b962d97828539a1dd5552a","349250884d48cb12c72dbe59a2843affb6904f8429e3f7556d138db40ec8bcd0","65b6cc74c86bf2d5385fb9e10bc4ad5ad09fff05a6d6e872ca4db044bb46fb3a","e2efe68376a25ad9bc5af48ba3888cfb9355d004c561b0b2465c4e661bdee46b","5399098207d4cc8d407f49c932da771ed6ceb4434d7f20e56135bd7015f331ed","ab8287edb8dfcccefd318ad76a5849b3c80c6bf0caed154be12dfe1112cf936c","cd2200fbb1d1271782654fb7fdb6d8dca7db15f7b8db2a38e7143662d491d586","674d7208c85a0d903f7d3f1d2fda966d00bf0886ab3e5cefb96a8f1643540a1a","41ab5f4e8bcaddc43ce23a691011e897b1e50355fdcbafc8cba04b286e6f1c49","38fe031b36c5de94bb3b1b3ad390041f74aefb61df99746de85381c7ecda75f3","47277bb3b4bbda8c0326fe702b9f676e8f51f883b2a90a442f5dbcdabe252ad6","65b02d4c494f394f8988d4a6faa4aaab5347bf963b8792f7a2b2552b78120bab","025a67cb489d57f4363fbeff45ce51ba807884988d0d0aba65c892376be38bfe","897a6a62d6b6a5c0c806a4d5f1c223a9bf41f8c97fe86e648c5b20efa3a3c25c","8d8d909792777b0df3d5c6846e6cac0b300dd4e99ca0cc9e0047f14fd09a8704","1fbe231546cc436cdc016a3fe38342a70fc3c72dc4c868957dfe70e1b948f2a6","d492ab701db274e6005df9202d2a9370df12fa0bd6191885156894407e721f58","a71ecc5545c1ac3fff470887c1a20bb06e3cb0e36676dedffd20d14588578e6a","1e5c3d857b594638715e557a713925d82a462edf7adf912cace8c384ee88688a","b487c070d4da4c0210fc1069f3a7663b504ca85ba8a071568939c2237eab2988","89bc7b5b169ed78edf3e732f70558bbb0b309bdeddfe293dd99fc8a3857fe588","39dd82696ddb6a0a3b64b6dd737cab9ffef6e130ddb96a571daf504e868b7dd4","0cd6916333ffdc9899ba3d87c0b71c341d66c21fde10091188278e8e2dbefecc","927a6bd9f0344c2d3e897b182a685adeab1bbb48c2cc5a134c0ecf2596752282","3930c95340f3e3d08276b14659bafdc9e1d93afa1d4c649a9d353f377e4c83b4","23211a9818220e2fbffbb3c4f53ab2bb2dac9cc3ca998607e56e90c961c134f2","4372899ea8be93b7d1b0a21b487c5b726f91a6c1c0785f9ae7b851738bde88b0","59c1a9f97666d459ebaba5f5dacdb453ae0c671b317467697764c2e0e44bf196","ee72eb60620acd1c765a3c5a6919fdd6786fa1e04193f33c248118d17ad01378","f07d5eb6281efe08966d422297f256990f79ca31aa8bbce41510a8c67e4d9b26","8f33a2e973c015d4fb8ac6d0682adf9412770687912351d6f467b57716d86862","77eb8a1d7d95e8eede94c802d7a85ba12750d68a9b200d3419d836216317277a","92f2155186acb48c1c08fb8a9076e12b24111d660461b077b28b2d43472ee519","3fe4a676fc45b2369d84e7cec5516bfeaeb219e65f074f3dec5c33620cb53ca6","890e772f577db50212f462fb39c10eacc4cd169996d2955adc1676bcbf54520d","2627069d02d4df14d0c7adca350a1928853258d29a127db831cfd617d4e60536","8c1d7fe8d40405e39e8f7d3817b4ae399433bf08adcfb3582ae97618a7138375","3d6ca77f1d7bbf66fc0f967c3186eee8cb30acd4e2f41385193bdfab1d429ca9","fc9f3067d0496769c3426f19e8d901e954033dacc1f988af8196640470e56d7b","30df6f853d3f6f2ebc5b2c7e2bd173f002ae66f51b7fca3949832320b4eae141","203b67e6d33c81b74a8858fdee4f4d0a99e557121db927c96cbb2f305b17111e","29c9c6cb20d54a225e9de60cb924d4d40d29d1edb98c4859d1a2b2e8e8e95950","e20f5d1774ccd75f556033ae1400f0bf228c384f0f4c2c0264fa093e33dc2484","1129dcec54c5f5639eb2d711b3996bf0913dbd26912dc3cc792c0152e6049a9f","a663713aa6a9cc2295d94b0c137e8a80070c96c541fbc9987dd87e7a6dc5e0b2","1057a883b84c774d07e3eac8718fcda847f6ca682d1deaca90cdbb991579c16c","74bdd55516600d729e13503865eb67e94efea6af92851f250bf4586e805e562c","2a047ba3ca898ba8f08d25426b8e386aa783be57fb2c836bb04a30604996d807","01c27c03d5f7f80170d1f43b22af7bd639da27f2b37f5d7d37ff2a1ffce9306c","96642332c1c2c450579775f18df0cc08c373b0f1df69f678cdc95a1ad8813bb4","cd344619cb6fad71c80c120d38cd2ac51ba72975326b1b46e3e88d4c5adc3eb0","3f3823dc063ce069c9bbdc198d981a1e2ea8784c053b297ed3ca9bbbc3a80af5","c9abf080bfa07e56f7da30fbd043cabe4ea4758ae529f8c70c232bbcb17a3aee","6df354f6d3210b77d03ce7c5ab27ad0914fee60568996c570d20c9ad9f324845","35ecf5e5d1d0038c37a259a6bac12687887977afdea7fd5d60982013e4360755","9f7f86921e90060af47419bcafb12f3de4f2251c01de2f152510fa1d4feb972b","7106bf0f55dadff8c02b3ab28e5ff6e007baa02fc26cf58d1994eb6482114588","d04f947114fa00a20ee3c3182bb2863c30869df93293cc673f200defadbd69d9","7d3bc9393e3c86761b6149510712d654bf7bcfdfa4e46139ccce1f13e472cfa2","785926dee839d0b3f5e479615d5653d77f6a9ef8aa4eea5bbdce2703c860b254","66d5c68894bb2975727cd550b53cd6f9d99f7cb77cb0cbecdd4af1c9332b01dd","27606c61707a6d6360b5f84db1aa7040ab82d5ac6269d7cf8b5809dc8909cbfb",{"version":"3603a58a5a095da36fcc8ec23cac37745f1c58053413063296b131ad649a3089","signature":"46ad20a71828211dedb4004393e723a19f6fff976390d221a36f4476c1802c61"},{"version":"9ad0e25ce4702d52cdab6167f45c1940decd334f940fbbf47c75b44d3700d078","signature":"14c00d401cbffe1282df02185194c0493b728aaa685bb2facb743025b0284f1b"},{"version":"821047127ea0f029ec323b7249c575f9fa4e7233c971a510839a8b981bc812da","signature":"9567f6d72a79683534e830aa764b67b74620d2565fe2464f835a98d7f18099d6"},{"version":"b89c474de5d9e8f29b4290d3af9938ab906be7c92adfc05cd975a6981d4c8cb5","signature":"a7803edb44943fa45e0f8679a187d68119c335fde1bdf5b73d083f451669bb94"},{"version":"4ac124fb293b3eb5423a3a9c47bd24576ad24216fdd0c121fc94a6426bf4c8a6","signature":"22b04fa14a4d7554177d67bee80393a308eb1b3b15655aa9a7951374b4bf43c4"},{"version":"ca74a33530bbf228262193d6f3019292679d11716175fdf35fa483755ffc7f61","signature":"5263f2bff98fd40b19e2248c2078c321d657d5d0debe20e08ecc6456c7ebd428"},{"version":"d4f5788b1d632ffc54be13e08d6cf9c6438e73504ab16dba09516cb9e8f3e8d3","signature":"03603da4082e5b47ba34a582066b31dbcaa7dbc68c35e27ced34ae2db4edffc1"},{"version":"51c29e00c993639d8a5e7e79420b106dff934faee00ab7d832b33b43f696b1b6","signature":"254c5ba5fc9385d0fff7b0405838c4228bccb40a21d9b10c8f320f69b7652c21"},"752d80cb03f45b5deead507f19a06d22948781b91b5c43ad1c5bc9fdc14401e3","05321b823dd3781d0b6aac8700bfdc0c9181d56479fe52ba6a40c9196fd661a8",{"version":"6231095d0b356894ceec8856ce4e354a38a773a62067978f3af9c478acbcf2e9","affectsGlobalScope":true},"66754e21a2ac3ffc0eb3fc55cf5c33deb2c115b726fb2c4368b870c5e85106ce","ccd9f8f7c8760d8eb0c0c112c772a9756d59365a61fd5cc102a889fed79d0076","d7ccbcf0e92d0209f499729768c791fbc278ecad02c3f596db5b519eb4f5d496","85542ea0f889f8993e6b4631c541640c17c230bf5cf18d483184de9105536b4d","8cc2eed7caa0e187fae67a1e7fdb4da79079489744c6e5be9e0839d258fd5995","aaf2cc4016c33c836fcca0dbe20d7a97bf17cafeb581a57a62267b1c38930bd4","33adebc44971b6d96bdf9b1f3a7a9e42f40c322b966bd303e62f683874d35281","3406039f2208d02e99c0c41c9e429c5b559df4a32f494b5bbea4ee9c99bb437a",{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true},"2e864ea827318e5f490863a8cd412744d9ddb175acf488dd02a941703dad1e38",{"version":"613b21ccdf3be6329d56e6caa13b258c842edf8377be7bc9f014ed14cdcfc308","affectsGlobalScope":true},{"version":"894dae169f8193e3f07c3fec14149a60592d1f13720907ffdf7b0c05cfb62c38","affectsGlobalScope":true},{"version":"df01885cc27c14632a8c38bdeb053295e69209107bb6c53988b78db5f450cb3c","affectsGlobalScope":true},"38379fa748cc5d259c96da356a849bd290a159ae218e06ec1daa166850e4bf50","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","f51b4042a3ac86f1f707500a9768f88d0b0c1fc3f3e45a73333283dea720cdc6",{"version":"a29bc8aa8cc100d0c09370c03508f1245853efe017bb98699d4c690868371fc7","affectsGlobalScope":true},"6f95830ca11e2c7e82235b73dc149e68a0632b41e671724d12adc83a6750746d","7aa011cda7cf0b9e87c85d128b2eeac9930bda215b0fee265d8bf2cec039fb5f",{"version":"92ec1aeca4e94bdab04083daa6039f807c0fce8f09bc42e8b24bf49fa5cdbbff","affectsGlobalScope":true},"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","8463ab6a156dc96200b3d8b8a52dc8d878f13a6b7404439aa2f911d568132808","6c39d4dbdb372b364442854e42d8c473e2ec67badb226745af17ed5ac41ce6f5","7693b90b3075deaccafd5efb467bf9f2b747a3075be888652ef73e64396d8628","bd01a987f0fcf2344a405e542ee681e420651eaff1222a5a6e0c02fda52343bc","693e50962e90a3548f41bff2c22676e3964212a836022d82e49eca0b20320a38",{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true},"300b0c12998391154d7b9115a85554e91632a3d3e1b66038e98f2b9cb3c1061d",{"version":"d63845babc589445113e4763795cb351fe3ea8b4becaa476be4e534f455bf0d2","affectsGlobalScope":true},"93891e576a698609695e5b8117bb128336e4b7b28772e7d7e38e8075790eb42f","5293d799856f47259146ccf0be9a1cc0a4a5343696182d7206ed25ea67d67920","d7cdb379f1a8febb8ba181b2bba4c89b7f9189c68ce00292253d9f827eb0b2d3","fab49059d6c2026bdb2e53e4e5cde1a39da44e61daff1867c8b3b10b507bfe17","5a551275f85bcc4003e543a1951a5b2f682cfba9b2922f65ae0df40ab71724a5","22d1a3163b9a961dbe78b0aedbd7bcbc071ce1f31efb76eb013b0aee230fef0e",{"version":"c31695696ade4514cfcbb22799997b690d3dca7fb72beab68fb2e73b6ef450dd","affectsGlobalScope":true},"d99ad56d57f2c96daaf4475a8b64344b24dedafdb8f3c32d43552bcc72279a75","a101ef17aece908c1029a1bd3f97132794dcff21b4ca0b997d9a633f962c46aa","511575e18249b64b90d8f884fdb8a383c767d1a7efccd9d66a4e125a4dc5c462",{"version":"6d8001f2c3b86c4f1de1d45ecb3f87f287ed7313d6999f8c8318cec4f50e6323","affectsGlobalScope":true},{"version":"0d09f4b48899d342b5d6cd846f95f969a401933b0dcd375a8a7e45832328bb86","affectsGlobalScope":true},"9c3d1222e6e3d8c35a4293d7a54d4142ebb8f7f70ec4111b8136df07fdc66169","70173c475c6e76ccebc37412b02b2e26f62bf45fc1534c3ebe6d7fa60fb88819","87ced739f77d80886ef2b923a7c52c363c549ad8799ae28eb8cc810892f511ad","863bc4e31de6c75423bb02da16190d582b0a69b8964b61d45920e5b2cb3832dd","849484324695b587f06abee7579641efe061b7338f9694ec410a76f477fe4df3","269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","6e191fea1db6e9e4fa828259cf489e820ec9170effff57fb081a2f3295db4722","49e0da63a2398d2ae88467f60a69b07e594b7777e01120cd9ebcefa1932484cf","0435070b07e646b406b1c9b8b1b1878ea6917c32abc47e6435ec26d71212d513","f71188f97c9f7d309798ec02a56dd3bf50a4e4d079b3480f275ac13719953898",{"version":"c4454589a0aa92c10d684c8c9584574bc404d1db556d72196cd31f8f7651af1a","affectsGlobalScope":true},"b17790866e140a630fa8891d7105c728a1bd60f4e35822e4b345af166a4a728c","c50c75f4360f6fc06c4be29dafe28210e15c50cd6b04ad19c4808fa504efb51a","d4a1f5f7ee89b2afffd3c74282f8ee65b24266c92b7d40398c12a27054ed745c","900b5a9802192bc77eba35a5b87ce770df7b867a6d61772c554058c9ed635386",{"version":"d291d3d16fa252f6d460687491ea2c5c23098c9dc0d3e106b2803fdc98f48f29","affectsGlobalScope":true},{"version":"f43fcf89d75f13d0908a77cd3fa32b9fd28c915deded9b2778b08f2e242d07a7","affectsGlobalScope":true},"9b6fc34aca8b0411b96ba35b2315017236a47709a1a98d5e16aed3b84037b9e8","aebf613f7831125038942eba891005fd25fa5cadcc3e3d13af4768dc7549161f","0faee6b555890a1cb106e2adc5d3ffd89545b1da894d474e9d436596d654998f","247e5c34784d185bc81442e8b1a371a36c4a5307a766a3725454c0a191b5cfad","1c382a6446d63340be549a616ff5142a91653cea45d6d137e25b929130a4f29a","729ad315d8fa8556a1cbf88604ce9bfd73f4cc2459b0b9f6da00f75150c2bf9d",{"version":"9c52d1e0414faa6ee331024f249f9c1ab11a5c432c37370c2c74ba933aee25fc","affectsGlobalScope":true},"ba027b6f18800b0303aa700e73d8cbffeefd5df864df6be460f5bad437fdc61c","22583759d0045fdf8d62c9db0aacba9fd8bddde79c671aa08c97dcfd4e930cc6","993ec9030135202d7027a1a2a2faf6063e72423ed295fa7601c209d5748c3f49","5e935afea0383367e5159fad54d1828bf39e1181e8481a135139ea3c40f4ab8f","160f67b6334e8b9abb05b8c9eae1f66c5feb6cfb617e12ab3da38b595df79d7a","2f1305ab9042c951cbea9cff8d2155fa84c1390f0c814c2428ce86dc929f24a4",{"version":"3e9e453389daa494d4b6b0fbc7de7f80e41ae4a8eaad7918663046eee1248c2c","signature":"9479b73e461e6b226047c75ee4e1f60ee609f3b9f43a305a06c95085e8244a7a"},{"version":"7fb721a3e8fc4ca2b709e73846e977da394182d436b4423f50bd0647fabe5628","signature":"9a0b0df2aa82467b940f6f8fc3d7b5f2be78761a929b1645858446a879ca02ba"},"03f1d83d61696326ea29c8a1c15cbaccf61e92598d53f2ccae06078531f42448","2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","3a9313fe5ace558b8b18e85f931da10b259e738775f411c061e5f15787b138eb","670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","9e0cf651e8e2c5b9bebbabdff2f7c6f8cedd91b1d9afcc0a854cdff053a88f1b","069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","f9e22729fa06ed20f8b1fe60670b7c74933fdfd44d869ddfb1919c15a5cf12fb","d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","f0c3a51c7314523b169d4756b2df6e3e59a3f0d9bc4848248362edaf75b5d315","2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed",{"version":"a899915e1fc41c6130d906ae77067b63ff2d678bb842b4c7a0741dca7f55c218","affectsGlobalScope":true},"689be50b735f145624c6f391042155ae2ff6b90a93bac11ca5712bc866f6010c",{"version":"64d4b35c5456adf258d2cf56c341e203a073253f229ef3208fc0d5020253b241","affectsGlobalScope":true},"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","dd0c1b380ba3437adedef134b2e48869449b1db0b07b2a229069309ce7b9dd39","1f68ab0e055994eb337b67aa87d2a15e0200951e9664959b3866ee6f6b11a0fe","b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a",{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true},"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","afe73051ff6a03a9565cbd8ebb0e956ee3df5e913ad5c1ded64218aabfa3dcb5",{"version":"271cde49dfd9b398ccc91bb3aaa43854cf76f4d14e10fed91cbac649aa6cbc63","affectsGlobalScope":true},"2bcecd31f1b4281710c666843fc55133a0ee25b143e59f35f49c62e168123f4b","a6273756fa05f794b64fe1aff45f4371d444f51ed0257f9364a8b25f3501915d","9c4e644fe9bf08d93c93bd892705842189fe345163f8896849d5964d21b56b78","25d91fb9ed77a828cc6c7a863236fb712dafcd52f816eec481bd0c1f589f4404","4cd14cea22eed1bfb0dc76183e56989f897ac5b14c0e2a819e5162eafdcfe243","8d32432f68ca4ce93ad717823976f2db2add94c70c19602bf87ee67fe51df48b","ee65fe452abe1309389c5f50710f24114e08a302d40708101c4aa950a2a7d044","f9649058dc6542f821894390c2358cd71c9350bae97478eff06d9a39c8b082a4","035a5df183489c2e22f3cf59fc1ed2b043d27f357eecc0eb8d8e840059d44245","a4809f4d92317535e6b22b01019437030077a76fec1d93b9881c9ed4738fcc54","5f53fa0bd22096d2a78533f94e02c899143b8f0f9891a46965294ee8b91a9434","c5a14bdeb170e0e67fb4200c54e0e02fd0ec94aca894c212c9d43c2916891542","8b5402ae709d042c3530ed3506c135a967159f42aed3221267e70c5b7240b577","916be7d770b0ae0406be9486ac12eb9825f21514961dd050594c4b250617d5a8","d88a5e779faf033be3d52142a04fbe1cb96009868e3bbdd296b2bc6c59e06c0e","8b677e0b88f3c4501c6f3ec44d3ccad1c2ba08efd8faf714b9b631b5dba1421b","7233cac35711f43b7493061d2fe7636deb6d14f8cb58e4b3ff248be46f0b543d","1d4bc73751d6ec6285331d1ca378904f55d9e5e8aeaa69bc45b675c3df83e778","8017277c3843df85296d8730f9edf097d68d7d5f9bc9d8124fcacf17ecfd487e","960a68ced7820108787135bdae5265d2cc4b511b7dcfd5b8f213432a8483daf1","2e7ebdc7d8af978c263890bbde991e88d6aa31cc29d46735c9c5f45f0a41243b","b57fd1c0a680d220e714b76d83eff51a08670f56efcc5d68abc82f5a2684f0c0","8cf121e98669f724256d06bebafec912b92bb042a06d4944f7fb27a56c545109","1084565c68b2aed5d6d5cea394799bd688afdf4dc99f4e3615957857c15bb231","8a19491eba2108d5c333c249699f40aff05ad312c04a17504573b27d91f0aede","199f9ead0daf25ae4c5632e3d1f42570af59685294a38123eef457407e13f365","cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","7d8ddf0f021c53099e34ee831a06c394d50371816caa98684812f089b4c6b3d4","ddef25f825320de051dcb0e62ffce621b41c67712b5b4105740c32fd83f4c449","1b3dffaa4ca8e38ac434856843505af767a614d187fb3a5ef4fcebb023c355aa","ab82804a14454734010dcdcd43f564ff7b0389bee4c5692eec76ff5b30d4cf66","15fe687c59d62741b4494d5e623d497d55eb38966ecf5bea7f36e48fc3fbe15e",{"version":"2c3b8be03577c98530ef9cb1a76e2c812636a871f367e9edf4c5f3ce702b77f8","affectsGlobalScope":true},"f05afa17cfc95a95923f48614bf3eb5ab2598850ee27a7c29f1b116a71090c5d","eb15edfcef078300657e1d5d678e1944b3518c2dd8f26792fdba2fe29f73d32b","bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","c3e5b75e1af87b8e67e12e21332e708f7eccee6aac6261cfe98ca36652cdcb53"],"options":{"allowSyntheticDefaultImports":true,"declarationMap":false,"esModuleInterop":true,"inlineSourceMap":false,"jsx":4,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitAny":false,"skipLibCheck":true,"sourceMap":false,"strict":true,"target":1},"fileIdsList":[[335,340,397],[335,340],[171,335,340],[165,167,335,340],[155,165,166,168,169,170,335,340],[165,335,340],[155,165,335,340],[156,157,158,159,160,161,162,163,164,335,340],[156,160,161,164,165,168,335,340],[156,157,158,159,160,161,162,163,164,165,166,168,169,335,340],[155,156,157,158,159,160,161,162,163,164,335,340],[60,335,340],[75,335,340],[75,116,120,121,122,335,340],[75,121,335,340],[75,115,121,124,335,340],[112,335,340],[75,108,121,125,335,340],[75,121,124,125,126,335,340],[128,335,340],[121,124,335,340],[75,115,117,118,119,120,121,335,340],[75,108,112,113,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137,335,340],[138,335,340],[75,115,124,134,135,335,340],[75,115,124,134,335,340],[75,121,126,335,340],[121,130,335,340],[75,120,335,340],[62,63,64,335,340],[62,63,335,340],[62,335,340],[60,144,173,183,205,206,207,335,340],[60,173,335,340],[60,144,183,335,340],[60,173,203,204,335,340],[60,203,335,340],[60,144,335,340],[60,144,242,243,244,335,340],[60,144,183,238,335,340],[60,144,173,243,244,268,335,340],[60,144,291,335,340],[285,335,340],[172,335,340],[60,204,335,340],[60,172,173,335,340],[335,340,397,398,399,400,401],[335,340,397,399],[335,340,355,387,403],[335,340,346,387],[335,340,380,387,410],[335,340,355,387],[335,340,413,415],[335,340,412,413,414],[335,340,352,355,387,407,408,409],[335,340,404,408,410,418,419],[335,340,353,387],[335,340,428],[335,340,422,428],[335,340,423,424,425,426,427],[335,340,352,355,357,360,369,380,387],[335,340,431],[335,340,432],[335,340,387],[335,337,340],[335,339,340],[335,340,345,372],[335,340,341,352,353,360,369,380],[335,340,341,342,352,360],[331,332,335,340],[335,340,343,381],[335,340,344,345,353,361],[335,340,345,369,377],[335,340,346,348,352,360],[335,340,347],[335,340,348,349],[335,340,352],[335,340,351,352],[335,339,340,352],[335,340,352,353,354,369,380],[335,340,352,353,354,369],[335,340,352,355,360,369,380],[335,340,352,353,355,356,360,369,377,380],[335,340,355,357,369,377,380],[335,340,352,358],[335,340,359,380,385],[335,340,348,352,360,369],[335,340,361],[335,340,362],[335,339,340,363],[335,340,364,379,385],[335,340,365],[335,340,366],[335,340,352,367],[335,340,367,368,381,383],[335,340,352,369,370,371],[335,340,369,371],[335,340,369,370],[335,340,372],[335,340,373],[335,340,352,375,376],[335,340,375,376],[335,340,345,360,369,377],[335,340,378],[340],[333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386],[335,340,360,379],[335,340,355,366,380],[335,340,345,381],[335,340,369,382],[335,340,383],[335,340,384],[335,340,345,352,354,363,369,380,383,385],[335,340,369,386],[60,75,77,335,340],[60,70,335,340,428],[60,335,340,428],[60,147,335,340],[147,335,340,442,443,444,445],[57,58,59,335,340],[335,340,449,488],[335,340,449,473,488],[335,340,488],[335,340,449],[335,340,449,474,488],[335,340,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487],[335,340,474,488],[335,340,353,369,387,406],[335,340,353,420],[335,340,355,387,407,417],[335,340,492],[335,340,352,355,357,369,377,380,386,387],[335,340,496],[103,335,340],[103,104,105,106,107,335,340],[92,93,94,95,96,97,98,99,100,101,102,335,340],[60,154,335,340],[60,143,145,146,149,150,151,152,335,340],[60,144,145,335,340],[60,145,335,340],[145,148,335,340],[60,145,154,174,175,176,335,340],[178,335,340],[60,145,174,335,340],[60,145,181,335,340],[145,174,183,335,340],[60,145,174,187,188,189,190,191,192,193,194,195,335,340],[60,145,198,199,335,340],[60,144,147,335,340],[60,145,174,208,209,210,211,212,213,214,215,335,340],[60,145,210,211,216,335,340],[60,174,335,340],[145,207,335,340],[60,145,174,205,209,335,340],[60,145,184,335,340],[60,145,219,220,335,340],[60,219,335,340],[60,145,223,335,340],[60,145,223,224,225,226,227,228,229,230,231,232,233,234,335,340],[60,145,224,227,228,335,340],[60,145,224,335,340],[60,145,201,335,340],[59,60,145,335,340],[60,145,227,236,335,340],[144,145,239,240,335,340],[60,145,174,238,335,340],[60,145,245,246,248,249,250,251,335,340],[60,145,247,335,340],[144,145,239,253,254,335,340],[60,145,211,212,213,214,215,216,335,340],[145,238,335,340],[60,144,145,256,257,262,263,264,335,340],[60,145,148,335,340],[60,261,335,340],[60,145,245,258,259,260,335,340],[60,144,145,147,335,340],[60,145,174,269,335,340],[60,174,270,335,340],[60,145,272,335,340],[145,274,275,335,340],[145,174,274,335,340],[60,145,174,269,277,278,335,340],[286,335,340],[60,145,183,210,216,335,340],[60,145,174,288,335,340],[59,60,145,290,293,294,335,340],[59,60,145,292,335,340],[59,60,145,255,292,335,340],[60,144,145,174,299,300,335,340],[60,145,154,335,340],[60,184,335,340],[60,145,185,303,335,340],[59,335,340],[143,146,148,149,150,151,152,153,154,175,176,177,179,180,181,182,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,229,230,231,233,234,235,237,240,241,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,270,271,272,273,275,276,277,278,279,280,281,282,283,284,287,289,290,293,294,295,296,297,298,299,300,301,302,303,304,305,335,340],[59,173,335,340],[174,201,335,340],[310,335,340],[307,308,309,335,340],[60,75,76,84,335,340],[60,75,84,85,335,340],[75,78,81,83,85,335,340],[60,75,83,335,340],[76,78,82,83,84,85,86,87,88,89,335,340],[60,75,85,335,340],[60,75,81,83,85,335,340],[74,90,335,340],[60,75,77,82,84,335,340],[73,335,340],[79,80,335,340],[65,335,340],[60,65,70,71,335,340],[65,66,67,68,69,335,340],[60,65,66,335,340],[60,65,335,340],[65,67,335,340],[60,73,335,340,387],[75,114,335,340],[110,335,340],[110,111,335,340],[109,335,340],[322,335,340],[322,323,324,325,326,327,335,340],[60,61,319,335,340],[60,61,72,91,142,312,315,316,318,335,340],[60,61,139,335,340],[60,61,72,91,139,140,141,142,306,314,317,335,340],[60,61,72,91,142,313,314,335,340],[60,61,91,140,141,142,306,335,340],[60,61,72,91,142,306,311,335,340],[60,61,72,91,306,311,335,340],[60,61,335,340],[60,61,91,140,141,142,306,318,335,340],[60,61,335,340,393],[61,335,340],[60,61,319,321,329,335,340],[335,340,388],[61,328,335,340],[61,138,139,140,335,340],[61,140,335,340],[61,138,141,335,340],[61],[60],[75,138,140],[140]],"referencedMap":[[399,1],[397,2],[172,3],[168,4],[155,2],[171,5],[164,6],[162,7],[161,7],[160,6],[157,7],[158,6],[166,8],[159,7],[156,6],[163,7],[169,9],[170,10],[165,11],[167,7],[285,12],[117,13],[137,13],[123,14],[124,15],[130,16],[113,17],[126,18],[127,19],[116,13],[129,20],[128,21],[122,22],[118,13],[138,23],[133,2],[134,24],[136,25],[135,26],[125,27],[131,28],[132,2],[119,13],[121,29],[120,13],[62,2],[65,30],[64,31],[63,32],[178,12],[183,12],[208,33],[203,34],[207,35],[205,36],[206,37],[244,38],[245,39],[242,2],[239,40],[238,35],[269,41],[291,38],[292,42],[286,43],[144,12],[204,12],[173,44],[268,45],[243,46],[402,47],[398,1],[400,48],[401,1],[404,49],[405,50],[411,51],[403,52],[416,53],[412,2],[415,54],[413,2],[410,55],[420,56],[419,55],[421,57],[422,2],[426,58],[427,58],[423,59],[424,59],[425,59],[428,60],[77,12],[429,2],[417,2],[430,61],[431,2],[432,62],[433,63],[414,2],[434,2],[406,2],[435,64],[337,65],[338,65],[339,66],[340,67],[341,68],[342,69],[333,70],[331,2],[332,2],[343,71],[344,72],[345,73],[346,74],[347,75],[348,76],[349,76],[350,77],[351,78],[352,79],[353,80],[354,81],[336,2],[355,82],[356,83],[357,84],[358,85],[359,86],[360,87],[361,88],[362,89],[363,90],[364,91],[365,92],[366,93],[367,94],[368,95],[369,96],[371,97],[370,98],[372,99],[373,100],[374,2],[375,101],[376,102],[377,103],[378,104],[335,105],[334,2],[387,106],[379,107],[380,108],[381,109],[382,110],[383,111],[384,112],[385,113],[386,114],[436,2],[437,2],[59,2],[438,2],[408,2],[409,2],[321,12],[73,12],[439,115],[441,116],[440,117],[443,118],[444,12],[147,12],[445,118],[442,2],[446,119],[57,2],[60,120],[61,12],[447,64],[448,2],[473,121],[474,122],[449,123],[452,123],[471,121],[472,121],[462,121],[461,124],[459,121],[454,121],[467,121],[465,121],[469,121],[453,121],[466,121],[470,121],[455,121],[456,121],[468,121],[450,121],[457,121],[458,121],[460,121],[464,121],[475,125],[463,121],[451,121],[488,126],[487,2],[482,125],[484,127],[483,125],[476,125],[477,125],[479,125],[481,125],[485,127],[486,127],[478,127],[480,127],[407,128],[489,129],[418,130],[490,52],[491,2],[493,131],[492,2],[79,2],[80,2],[494,2],[495,132],[496,2],[497,133],[58,2],[102,2],[99,134],[101,134],[100,134],[98,134],[108,135],[103,136],[107,2],[104,2],[106,2],[105,2],[94,134],[95,134],[96,134],[92,2],[93,2],[97,134],[247,137],[153,138],[152,139],[146,140],[149,141],[143,12],[151,140],[150,140],[177,142],[176,140],[175,140],[179,143],[180,144],[182,145],[181,140],[184,146],[185,140],[186,140],[196,147],[190,140],[194,140],[197,140],[193,140],[187,140],[195,140],[191,140],[189,140],[192,140],[188,140],[200,148],[198,140],[199,140],[154,12],[201,140],[148,149],[202,140],[216,150],[217,151],[209,152],[214,140],[215,140],[212,153],[213,140],[211,154],[210,155],[218,149],[224,140],[221,156],[220,140],[222,157],[234,158],[235,159],[229,160],[227,140],[228,140],[225,161],[226,140],[223,140],[230,162],[232,140],[233,140],[231,140],[219,163],[237,164],[236,140],[241,165],[240,166],[252,167],[246,140],[251,140],[250,140],[248,168],[249,140],[255,169],[266,170],[253,140],[254,171],[265,172],[256,140],[257,173],[262,174],[263,140],[264,140],[261,175],[258,140],[259,168],[260,140],[267,176],[270,177],[271,178],[272,140],[273,179],[276,180],[275,181],[279,182],[278,140],[277,140],[280,140],[281,140],[282,140],[287,183],[283,144],[284,184],[289,185],[295,186],[293,187],[294,140],[290,139],[296,140],[297,188],[298,12],[301,189],[299,140],[302,140],[300,190],[303,191],[304,192],[305,177],[288,193],[145,38],[306,194],[174,195],[274,196],[311,197],[308,12],[309,12],[307,2],[310,198],[85,199],[86,200],[82,201],[78,202],[90,203],[87,204],[84,205],[88,204],[91,206],[83,207],[76,2],[74,208],[89,2],[81,209],[71,210],[72,211],[70,212],[67,213],[66,214],[69,215],[68,213],[388,216],[115,217],[114,13],[75,2],[111,218],[112,219],[110,220],[109,218],[11,2],[12,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[4,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[8,2],[49,2],[46,2],[47,2],[48,2],[50,2],[9,2],[51,2],[52,2],[53,2],[54,2],[55,2],[1,2],[10,2],[56,2],[323,221],[324,221],[325,221],[326,221],[327,221],[328,222],[322,2],[320,223],[319,224],[313,225],[318,226],[315,227],[391,228],[316,229],[312,230],[317,231],[314,225],[392,232],[394,233],[139,234],[330,235],[389,236],[329,237],[390,234],[141,238],[395,239],[142,240],[140,234],[393,234],[396,234]],"exportedModulesMap":[[399,1],[397,2],[172,3],[168,4],[155,2],[171,5],[164,6],[162,7],[161,7],[160,6],[157,7],[158,6],[166,8],[159,7],[156,6],[163,7],[169,9],[170,10],[165,11],[167,7],[285,12],[117,13],[137,13],[123,14],[124,15],[130,16],[113,17],[126,18],[127,19],[116,13],[129,20],[128,21],[122,22],[118,13],[138,23],[133,2],[134,24],[136,25],[135,26],[125,27],[131,28],[132,2],[119,13],[121,29],[120,13],[62,2],[65,30],[64,31],[63,32],[178,12],[183,12],[208,33],[203,34],[207,35],[205,36],[206,37],[244,38],[245,39],[242,2],[239,40],[238,35],[269,41],[291,38],[292,42],[286,43],[144,12],[204,12],[173,44],[268,45],[243,46],[402,47],[398,1],[400,48],[401,1],[404,49],[405,50],[411,51],[403,52],[416,53],[412,2],[415,54],[413,2],[410,55],[420,56],[419,55],[421,57],[422,2],[426,58],[427,58],[423,59],[424,59],[425,59],[428,60],[77,12],[429,2],[417,2],[430,61],[431,2],[432,62],[433,63],[414,2],[434,2],[406,2],[435,64],[337,65],[338,65],[339,66],[340,67],[341,68],[342,69],[333,70],[331,2],[332,2],[343,71],[344,72],[345,73],[346,74],[347,75],[348,76],[349,76],[350,77],[351,78],[352,79],[353,80],[354,81],[336,2],[355,82],[356,83],[357,84],[358,85],[359,86],[360,87],[361,88],[362,89],[363,90],[364,91],[365,92],[366,93],[367,94],[368,95],[369,96],[371,97],[370,98],[372,99],[373,100],[374,2],[375,101],[376,102],[377,103],[378,104],[335,105],[334,2],[387,106],[379,107],[380,108],[381,109],[382,110],[383,111],[384,112],[385,113],[386,114],[436,2],[437,2],[59,2],[438,2],[408,2],[409,2],[321,12],[73,12],[439,115],[441,116],[440,117],[443,118],[444,12],[147,12],[445,118],[442,2],[446,119],[57,2],[60,120],[61,12],[447,64],[448,2],[473,121],[474,122],[449,123],[452,123],[471,121],[472,121],[462,121],[461,124],[459,121],[454,121],[467,121],[465,121],[469,121],[453,121],[466,121],[470,121],[455,121],[456,121],[468,121],[450,121],[457,121],[458,121],[460,121],[464,121],[475,125],[463,121],[451,121],[488,126],[487,2],[482,125],[484,127],[483,125],[476,125],[477,125],[479,125],[481,125],[485,127],[486,127],[478,127],[480,127],[407,128],[489,129],[418,130],[490,52],[491,2],[493,131],[492,2],[79,2],[80,2],[494,2],[495,132],[496,2],[497,133],[58,2],[102,2],[99,134],[101,134],[100,134],[98,134],[108,135],[103,136],[107,2],[104,2],[106,2],[105,2],[94,134],[95,134],[96,134],[92,2],[93,2],[97,134],[247,137],[153,138],[152,139],[146,140],[149,141],[143,12],[151,140],[150,140],[177,142],[176,140],[175,140],[179,143],[180,144],[182,145],[181,140],[184,146],[185,140],[186,140],[196,147],[190,140],[194,140],[197,140],[193,140],[187,140],[195,140],[191,140],[189,140],[192,140],[188,140],[200,148],[198,140],[199,140],[154,12],[201,140],[148,149],[202,140],[216,150],[217,151],[209,152],[214,140],[215,140],[212,153],[213,140],[211,154],[210,155],[218,149],[224,140],[221,156],[220,140],[222,157],[234,158],[235,159],[229,160],[227,140],[228,140],[225,161],[226,140],[223,140],[230,162],[232,140],[233,140],[231,140],[219,163],[237,164],[236,140],[241,165],[240,166],[252,167],[246,140],[251,140],[250,140],[248,168],[249,140],[255,169],[266,170],[253,140],[254,171],[265,172],[256,140],[257,173],[262,174],[263,140],[264,140],[261,175],[258,140],[259,168],[260,140],[267,176],[270,177],[271,178],[272,140],[273,179],[276,180],[275,181],[279,182],[278,140],[277,140],[280,140],[281,140],[282,140],[287,183],[283,144],[284,184],[289,185],[295,186],[293,187],[294,140],[290,139],[296,140],[297,188],[298,12],[301,189],[299,140],[302,140],[300,190],[303,191],[304,192],[305,177],[288,193],[145,38],[306,194],[174,195],[274,196],[311,197],[308,12],[309,12],[307,2],[310,198],[85,199],[86,200],[82,201],[78,202],[90,203],[87,204],[84,205],[88,204],[91,206],[83,207],[76,2],[74,208],[89,2],[81,209],[71,210],[72,211],[70,212],[67,213],[66,214],[69,215],[68,213],[388,216],[115,217],[114,13],[75,2],[111,218],[112,219],[110,220],[109,218],[11,2],[12,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[4,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[8,2],[49,2],[46,2],[47,2],[48,2],[50,2],[9,2],[51,2],[52,2],[53,2],[54,2],[55,2],[1,2],[10,2],[56,2],[323,221],[324,221],[325,221],[326,221],[327,221],[328,222],[322,2],[320,223],[319,241],[313,242],[318,242],[315,242],[391,228],[316,242],[312,242],[317,242],[314,242],[392,232],[394,233],[330,235],[389,236],[329,237],[390,234],[141,243],[395,244],[142,240],[393,234]],"semanticDiagnosticsPerFile":[399,397,172,168,155,171,164,162,161,160,157,158,166,159,156,163,169,170,165,167,285,117,137,123,124,130,113,126,127,116,129,128,122,118,138,133,134,136,135,125,131,132,119,121,120,62,65,64,63,178,183,208,203,207,205,206,244,245,242,239,238,269,291,292,286,144,204,173,268,243,402,398,400,401,404,405,411,403,416,412,415,413,410,420,419,421,422,426,427,423,424,425,428,77,429,417,430,431,432,433,414,434,406,435,337,338,339,340,341,342,333,331,332,343,344,345,346,347,348,349,350,351,352,353,354,336,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,370,372,373,374,375,376,377,378,335,334,387,379,380,381,382,383,384,385,386,436,437,59,438,408,409,321,73,439,441,440,443,444,147,445,442,446,57,60,61,447,448,473,474,449,452,471,472,462,461,459,454,467,465,469,453,466,470,455,456,468,450,457,458,460,464,475,463,451,488,487,482,484,483,476,477,479,481,485,486,478,480,407,489,418,490,491,493,492,79,80,494,495,496,497,58,102,99,101,100,98,108,103,107,104,106,105,94,95,96,92,93,97,247,153,152,146,149,143,151,150,177,176,175,179,180,182,181,184,185,186,196,190,194,197,193,187,195,191,189,192,188,200,198,199,154,201,148,202,216,217,209,214,215,212,213,211,210,218,224,221,220,222,234,235,229,227,228,225,226,223,230,232,233,231,219,237,236,241,240,252,246,251,250,248,249,255,266,253,254,265,256,257,262,263,264,261,258,259,260,267,270,271,272,273,276,275,279,278,277,280,281,282,287,283,284,289,295,293,294,290,296,297,298,301,299,302,300,303,304,305,288,145,306,174,274,311,308,309,307,310,85,86,82,78,90,87,84,88,91,83,76,74,89,81,71,72,70,67,66,69,68,388,115,114,75,111,112,110,109,11,12,14,13,2,15,16,17,18,19,20,21,22,3,4,26,23,24,25,27,28,29,5,30,31,32,33,6,37,34,35,36,38,7,39,44,45,40,41,42,43,8,49,46,47,48,50,9,51,52,53,54,55,1,10,56,323,324,325,326,327,328,322,[320,[{"file":"./src/App.test.tsx","start":59,"length":24,"messageText":"Cannot find module '@testing-library/react' or its corresponding type declarations.","category":1,"code":2307},{"file":"./src/App.test.tsx","start":114,"length":8,"messageText":"Cannot find name 'describe'. Do you need to install type definitions for a test runner? Try `npm i --save-dev @types/jest` or `npm i --save-dev @types/mocha`.","category":1,"code":2582},{"file":"./src/App.test.tsx","start":151,"length":2,"messageText":"Cannot find name 'it'. Do you need to install type definitions for a test runner? Try `npm i --save-dev @types/jest` or `npm i --save-dev @types/mocha`.","category":1,"code":2582}]],319,313,318,315,[391,[{"file":"./src/components/Inventory.tsx","start":495,"length":12,"code":2339,"category":1,"messageText":"Property 'currentWorld' does not exist on type 'GameState'."},{"file":"./src/components/Inventory.tsx","start":1187,"length":21,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ worldId: any; levelId: string; slotId: string; word: Word; }' is not assignable to parameter of type '{ levelId: string; sectionId: string; slotId: string; word: Word; sourceLevelId: string; sourceSectionId: string; }'.","category":1,"code":2345,"next":[{"messageText":"Object literal may only specify known properties, and 'worldId' does not exist in type '{ levelId: string; sectionId: string; slotId: string; word: Word; sourceLevelId: string; sourceSectionId: string; }'.","category":1,"code":2353}]}}]],316,312,[317,[{"file":"./src/components/TutorialOverlay.tsx","start":68,"length":15,"messageText":"Cannot find module 'framer-motion' or its corresponding type declarations.","category":1,"code":2307}]],314,[392,[{"file":"./src/components/WorldSelector.tsx","start":304,"length":15,"messageText":"Module '\"../store/gameSlice\"' has no exported member 'setCurrentWorld'. Did you mean to use 'import setCurrentWorld from \"../store/gameSlice\"' instead?","category":1,"code":2614},{"file":"./src/components/WorldSelector.tsx","start":625,"length":6,"code":2339,"category":1,"messageText":"Property 'worlds' does not exist on type 'GameState'."},{"file":"./src/components/WorldSelector.tsx","start":703,"length":12,"code":2339,"category":1,"messageText":"Property 'currentWorld' does not exist on type 'GameState'."},{"file":"./src/components/WorldSelector.tsx","start":2345,"length":5,"code":2339,"category":1,"messageText":"Property 'slots' does not exist on type 'Level'."},{"file":"./src/components/WorldSelector.tsx","start":3427,"length":10,"code":2339,"category":1,"messageText":"Property 'isUnlocked' does not exist on type 'Level'."},{"file":"./src/components/WorldSelector.tsx","start":3647,"length":10,"code":2339,"category":1,"messageText":"Property 'isUnlocked' does not exist on type 'Level'."},{"file":"./src/components/WorldSelector.tsx","start":3892,"length":10,"code":2339,"category":1,"messageText":"Property 'isUnlocked' does not exist on type 'Level'."},{"file":"./src/components/WorldSelector.tsx","start":4054,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type '{ worldId: any; levelId: string; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'worldId' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}}]],394,139,330,389,329,390,141,[395,[{"file":"./src/store/initialState.ts","start":68,"length":25,"messageText":"Cannot find module '../utils/gameDataParser' or its corresponding type declarations.","category":1,"code":2307}]],142,140,393,396],"affectedFilesPendingEmit":[[399,1],[397,1],[172,1],[168,1],[155,1],[171,1],[164,1],[162,1],[161,1],[160,1],[157,1],[158,1],[166,1],[159,1],[156,1],[163,1],[169,1],[170,1],[165,1],[167,1],[285,1],[117,1],[137,1],[123,1],[124,1],[130,1],[113,1],[126,1],[127,1],[116,1],[129,1],[128,1],[122,1],[118,1],[138,1],[133,1],[134,1],[136,1],[135,1],[125,1],[131,1],[132,1],[119,1],[121,1],[120,1],[62,1],[65,1],[64,1],[63,1],[178,1],[183,1],[208,1],[203,1],[207,1],[205,1],[206,1],[244,1],[245,1],[242,1],[239,1],[238,1],[269,1],[291,1],[292,1],[286,1],[144,1],[204,1],[173,1],[268,1],[243,1],[402,1],[398,1],[400,1],[401,1],[404,1],[405,1],[411,1],[403,1],[416,1],[412,1],[415,1],[413,1],[410,1],[420,1],[419,1],[421,1],[422,1],[426,1],[427,1],[423,1],[424,1],[425,1],[428,1],[77,1],[429,1],[417,1],[430,1],[431,1],[432,1],[433,1],[414,1],[434,1],[406,1],[435,1],[337,1],[338,1],[339,1],[340,1],[341,1],[342,1],[333,1],[331,1],[332,1],[343,1],[344,1],[345,1],[346,1],[347,1],[348,1],[349,1],[350,1],[351,1],[352,1],[353,1],[354,1],[336,1],[355,1],[356,1],[357,1],[358,1],[359,1],[360,1],[361,1],[362,1],[363,1],[364,1],[365,1],[366,1],[367,1],[368,1],[369,1],[371,1],[370,1],[372,1],[373,1],[374,1],[375,1],[376,1],[377,1],[378,1],[335,1],[334,1],[387,1],[379,1],[380,1],[381,1],[382,1],[383,1],[384,1],[385,1],[386,1],[436,1],[437,1],[59,1],[438,1],[408,1],[409,1],[321,1],[73,1],[439,1],[441,1],[440,1],[443,1],[444,1],[147,1],[445,1],[442,1],[446,1],[57,1],[60,1],[61,1],[447,1],[448,1],[473,1],[474,1],[449,1],[452,1],[471,1],[472,1],[462,1],[461,1],[459,1],[454,1],[467,1],[465,1],[469,1],[453,1],[466,1],[470,1],[455,1],[456,1],[468,1],[450,1],[457,1],[458,1],[460,1],[464,1],[475,1],[463,1],[451,1],[488,1],[487,1],[482,1],[484,1],[483,1],[476,1],[477,1],[479,1],[481,1],[485,1],[486,1],[478,1],[480,1],[407,1],[489,1],[418,1],[490,1],[491,1],[493,1],[492,1],[79,1],[80,1],[494,1],[495,1],[496,1],[497,1],[58,1],[102,1],[99,1],[101,1],[100,1],[98,1],[108,1],[103,1],[107,1],[104,1],[106,1],[105,1],[94,1],[95,1],[96,1],[92,1],[93,1],[97,1],[247,1],[153,1],[152,1],[146,1],[149,1],[143,1],[151,1],[150,1],[177,1],[176,1],[175,1],[179,1],[180,1],[182,1],[181,1],[184,1],[185,1],[186,1],[196,1],[190,1],[194,1],[197,1],[193,1],[187,1],[195,1],[191,1],[189,1],[192,1],[188,1],[200,1],[198,1],[199,1],[154,1],[201,1],[148,1],[202,1],[216,1],[217,1],[209,1],[214,1],[215,1],[212,1],[213,1],[211,1],[210,1],[218,1],[224,1],[221,1],[220,1],[222,1],[234,1],[235,1],[229,1],[227,1],[228,1],[225,1],[226,1],[223,1],[230,1],[232,1],[233,1],[231,1],[219,1],[237,1],[236,1],[241,1],[240,1],[252,1],[246,1],[251,1],[250,1],[248,1],[249,1],[255,1],[266,1],[253,1],[254,1],[265,1],[256,1],[257,1],[262,1],[263,1],[264,1],[261,1],[258,1],[259,1],[260,1],[267,1],[270,1],[271,1],[272,1],[273,1],[276,1],[275,1],[279,1],[278,1],[277,1],[280,1],[281,1],[282,1],[287,1],[283,1],[284,1],[289,1],[295,1],[293,1],[294,1],[290,1],[296,1],[297,1],[298,1],[301,1],[299,1],[302,1],[300,1],[303,1],[304,1],[305,1],[288,1],[145,1],[306,1],[174,1],[274,1],[311,1],[308,1],[309,1],[307,1],[310,1],[85,1],[86,1],[82,1],[78,1],[90,1],[87,1],[84,1],[88,1],[91,1],[83,1],[76,1],[74,1],[89,1],[81,1],[71,1],[72,1],[70,1],[67,1],[66,1],[69,1],[68,1],[388,1],[115,1],[114,1],[75,1],[111,1],[112,1],[110,1],[109,1],[2,1],[3,1],[4,1],[5,1],[6,1],[7,1],[8,1],[9,1],[10,1],[323,1],[324,1],[325,1],[326,1],[327,1],[328,1],[322,1],[320,1],[319,1],[313,1],[318,1],[315,1],[391,1],[316,1],[312,1],[498,1],[317,1],[314,1],[392,1],[394,1],[139,1],[330,1],[389,1],[329,1],[390,1],[141,1],[395,1],[142,1],[140,1],[393,1],[499,1],[396,1]]},"version":"4.9.5"}
\ No newline at end of file