diff --git a/.eslintrc b/.eslintrc index 7fc8ba5..ce7b25d 100644 --- a/.eslintrc +++ b/.eslintrc @@ -4,6 +4,8 @@ "env": { "node": true }, "plugins": ["@typescript-eslint"], "extends": [ + "plugin:react/recommended", + "plugin:react-hooks/recommended", "eslint:recommended", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended" diff --git a/.gitignore b/.gitignore index e09a007..cfc723c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,25 @@ -# vscode -.vscode - -# Intellij -*.iml -.idea - -# npm -node_modules - -# Don't include the compiled main.js file in the repo. -# They should be uploaded to GitHub releases instead. -main.js - -# Exclude sourcemaps -*.map - -# obsidian -data.json - -# Exclude macOS Finder (System Explorer) View States -.DS_Store +# vscode +.vscode + +# Intellij +*.iml +.idea + +# npm +node_modules + +# Don't include the compiled main.js file in the repo. +# They should be uploaded to GitHub releases instead. +main.js + +# Exclude sourcemaps +*.map + +# obsidian +data.json + +# Exclude macOS Finder (System Explorer) View States +.DS_Store + +storage/* +!storage/.keep diff --git a/esbuild.config.mjs b/esbuild.config.mjs index b27b44d..9ba3233 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -1,6 +1,6 @@ +import builtins from "builtin-modules"; import esbuild from "esbuild"; import process from "process"; -import builtins from "builtin-modules"; import { renameStyles } from "./rename-styles.mjs"; const banner = `/* diff --git a/package-lock.json b/package-lock.json index 61f40b9..1bcdfba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,8 @@ "dependencies": { "chess.js": "1.0.0-beta.5", "chessground": "8.3.7", + "lucide-react": "^0.216.0", + "nanoid": "^4.0.2", "react": "^18.2.0", "react-dom": "^18.2.0" }, @@ -22,9 +24,12 @@ "@typescript-eslint/parser": "5.59.2", "builtin-modules": "3.3.0", "esbuild": "0.17.18", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", "husky": "^8.0.3", "obsidian": "latest", "prettier": "^2.8.8", + "prettier-plugin-organize-imports": "^3.2.2", "pretty-quick": "^3.1.3", "tslib": "2.5.0", "typescript": "5.0.4" @@ -870,6 +875,19 @@ "dev": true, "peer": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-differ": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", @@ -879,6 +897,25 @@ "node": ">=8" } }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -888,6 +925,37 @@ "node": ">=8" } }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "node_modules/arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", @@ -897,6 +965,18 @@ "node": ">=8" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -937,6 +1017,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1045,6 +1138,22 @@ "dev": true, "peer": true }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1079,6 +1188,94 @@ "once": "^1.4.0" } }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/esbuild": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", @@ -1187,6 +1384,77 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -1315,7 +1583,6 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -1464,6 +1731,15 @@ "dev": true, "peer": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1471,6 +1747,53 @@ "dev": true, "peer": true }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -1486,6 +1809,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1536,6 +1875,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -1556,12 +1910,45 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1571,6 +1958,57 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -1649,6 +2087,101 @@ "dev": true, "peer": true }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1670,6 +2203,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -1679,6 +2224,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -1689,6 +2249,34 @@ "node": ">=8" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -1701,6 +2289,67 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1750,6 +2399,19 @@ "dev": true, "peer": true }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -1810,6 +2472,14 @@ "node": ">=10" } }, + "node_modules/lucide-react": { + "version": "0.216.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.216.0.tgz", + "integrity": "sha512-PGWXs6JXI/08rhfkmj/joji0MAKDCcms44j0LYILO4J36AWqKhgjjaZ6WECRSyZ9TQe5gOrAR0g38O8cKrQngw==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -1899,6 +2569,23 @@ "node": ">=8" } }, + "node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -1924,6 +2611,112 @@ "node": ">=8" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/obsidian": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.2.8.tgz", @@ -2062,6 +2855,12 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -2108,6 +2907,26 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-plugin-organize-imports": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.2.tgz", + "integrity": "sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA==", + "dev": true, + "peerDependencies": { + "@volar/vue-language-plugin-pug": "^1.0.4", + "@volar/vue-typescript": "^1.0.4", + "prettier": ">=2.0", + "typescript": ">=2.9" + }, + "peerDependenciesMeta": { + "@volar/vue-language-plugin-pug": { + "optional": true + }, + "@volar/vue-typescript": { + "optional": true + } + } + }, "node_modules/pretty-quick": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.3.tgz", @@ -2196,6 +3015,17 @@ "node": ">=8" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -2259,6 +3089,46 @@ "react": "^18.2.0" } }, + "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==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2318,6 +3188,20 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -2362,6 +3246,20 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -2377,6 +3275,70 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -2431,6 +3393,18 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -2503,6 +3477,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", @@ -2516,6 +3504,21 @@ "node": ">=12.20" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -2548,6 +3551,42 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/package.json b/package.json index 2df39b6..b85896c 100644 --- a/package.json +++ b/package.json @@ -19,21 +19,26 @@ "dependencies": { "chess.js": "1.0.0-beta.5", "chessground": "8.3.7", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "lucide-react": "0.216.0", + "nanoid": "4.0.2", + "react": "18.2.0", + "react-dom": "18.2.0" }, "devDependencies": { "@types/node": "20.1.0", - "@types/react": "^18.2.6", + "@types/react": "18.2.6", "@types/react-dom": "^18.2.4", "@typescript-eslint/eslint-plugin": "5.59.2", "@typescript-eslint/parser": "5.59.2", "builtin-modules": "3.3.0", "esbuild": "0.17.18", - "husky": "^8.0.3", + "eslint-plugin-react": "7.32.2", + "eslint-plugin-react-hooks": "4.6.0", + "husky": "8.0.3", "obsidian": "latest", - "prettier": "^2.8.8", - "pretty-quick": "^3.1.3", + "prettier": "2.8.8", + "prettier-plugin-organize-imports": "3.2.2", + "pretty-quick": "3.1.3", "tslib": "2.5.0", "typescript": "5.0.4" } diff --git a/reset.css b/reset.css new file mode 100644 index 0000000..58fde3d --- /dev/null +++ b/reset.css @@ -0,0 +1,47 @@ +/* + Josh's Custom CSS Reset + https://www.joshwcomeau.com/css/custom-css-reset/ +*/ +*, +*::before, +*::after { + box-sizing: border-box; +} +* { + margin: 0; +} +html, +body { + height: 100%; +} +body { + line-height: 1.5; + -webkit-font-smoothing: antialiased; +} +img, +picture, +video, +canvas, +svg { + display: block; + max-width: 100%; +} +input, +button, +textarea, +select { + font: inherit; +} +p, +h1, +h2, +h3, +h4, +h5, +h6 { + overflow-wrap: break-word; +} +#root, +#__next { + isolation: isolate; +} diff --git a/src/components/ReactView.tsx b/src/components/ReactView.tsx new file mode 100644 index 0000000..19c6e56 --- /dev/null +++ b/src/components/ReactView.tsx @@ -0,0 +1,46 @@ +import { App, MarkdownRenderChild } from "obsidian"; +import * as React from "react"; +import * as ReactDOM from "react-dom/client"; +import { ChessifyFileData } from "src/utils"; +import { Chessify } from "../components/react/Chessify"; +import { ChessifyPluginSettings } from "./obsidian/SettingsTab"; + +export class ReactView extends MarkdownRenderChild { + root: ReactDOM.Root; + source: string; + app: App; + settings: ChessifyPluginSettings; + data: ChessifyFileData; + + constructor( + containerEL: HTMLElement, + source: string, + app: App, + settings: ChessifyPluginSettings, + data: ChessifyFileData + ) { + super(containerEL); + this.source = source; + this.app = app; + this.settings = settings; + this.data = data; + } + + onload() { + this.root = ReactDOM.createRoot(this.containerEl); + this.root.render( + + + + ); + } + + onunload() { + this.root.unmount(); + } +} diff --git a/src/components/obsidian/PgnModal.ts b/src/components/obsidian/PgnModal.ts new file mode 100644 index 0000000..0b7d93d --- /dev/null +++ b/src/components/obsidian/PgnModal.ts @@ -0,0 +1,42 @@ +import { App, Modal, Setting } from "obsidian"; + +export class PgnModal extends Modal { + pgn: string; + onSubmit: (pgn: string) => void; + + constructor(app: App, onSubmit: (pgn: string) => void) { + super(app); + this.onSubmit = onSubmit; + } + + onOpen() { + const { contentEl } = this; + + contentEl.createEl("h1", { + text: "Paste the full PGN (leave empty for a new game):", + }); + + new Setting(contentEl).setName("PGN").addTextArea((text) => + text + .onChange((value) => { + this.pgn = value; + }) + .inputEl.setCssStyles({ width: "100%", height: "250px" }) + ); + + new Setting(contentEl).addButton((btn) => + btn + .setButtonText("Submit") + .setCta() + .onClick(() => { + this.close(); + this.onSubmit(this.pgn); + }) + ); + } + + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +} diff --git a/src/components/obsidian/SettingsTab.ts b/src/components/obsidian/SettingsTab.ts index 2de8b12..c0b7977 100644 --- a/src/components/obsidian/SettingsTab.ts +++ b/src/components/obsidian/SettingsTab.ts @@ -1,4 +1,4 @@ -import { PluginSettingTab, App, Setting } from "obsidian"; +import { App, PluginSettingTab, Setting } from "obsidian"; import ChessifyPlugin from "src/main"; export interface ChessifyPluginSettings { diff --git a/src/components/react/ChessgroundWrapper/index.tsx b/src/components/react/ChessgroundWrapper/index.tsx index eb4d3d9..b232660 100644 --- a/src/components/react/ChessgroundWrapper/index.tsx +++ b/src/components/react/ChessgroundWrapper/index.tsx @@ -1,70 +1,98 @@ -import * as React from "react"; -import { useEffect, useRef, useState } from "react"; import { Chessground as ChessgroundApi } from "chessground"; +import * as React from "react"; +import { useEffect, useRef } from "react"; +import { Chess, Move } from "chess.js"; import { Api } from "chessground/api"; import { Config } from "chessground/config"; -import { Chess } from "chess.js"; import { playOtherSide, toColor, toDests } from "src/utils"; export interface ChessGroundSettings { + api: Api | null; + setApi: React.Dispatch>; + chessifyId: string; config?: Config; boardColor?: "brown" | "green"; + chess: Chess; + setHistory: React.Dispatch>; + setMoveNumber: React.Dispatch>; + isViewOnly: boolean; } export function ChessgroundWrapper({ + api, + setApi, + chessifyId, boardColor = "green", config = {}, + chess, + setHistory, + setMoveNumber, + isViewOnly, }: ChessGroundSettings) { - const [api, setApi] = useState(null); - const [chess, setChess] = useState(null); - const ref = useRef(null); + //Chessground Init useEffect(() => { if (ref.current && !api) { - const chess = config.fen?.length - ? new Chess(config.fen) - : new Chess(); const chessgroundApi = ChessgroundApi(ref.current, { + fen: chess.fen(), animation: { enabled: true, duration: 100 }, + check: chess.isCheck(), movable: { free: false, color: toColor(chess), dests: toDests(chess), + events: { + //Hook up the Chessground UI changes to our App State + after: (orig, dest, _metadata) => { + const handler = playOtherSide( + chessgroundApi, + chess + ); + + setHistory(handler(orig, dest)); + setMoveNumber((state) => state + 1); + }, + }, }, highlight: { check: true, }, turnColor: toColor(chess), + drawable: { + onChange(shapes) {}, + }, ...config, }); - chessgroundApi.set({ - movable: { - events: { after: playOtherSide(chessgroundApi, chess) }, - }, - }); - + setHistory(chess.history({ verbose: true })); setApi(chessgroundApi); - setChess(chess); + setMoveNumber(chess.history().length - 1); } else if (ref.current && api) { api.set(config); } - }, [ref, chess]); + }, [ + ref, + chess, + api, + chessifyId, + config, + setApi, + setHistory, + setMoveNumber, + ]); + //Sync Is View Only useEffect(() => { - api?.set(config); - if (config.fen?.length) { - chess?.load(config.fen); - } - }, [api, config]); + api?.set({ viewOnly: isViewOnly }); + }, [isViewOnly, api]); return (
diff --git a/src/components/react/Chessify.tsx b/src/components/react/Chessify.tsx index cfa4278..bf99f0f 100644 --- a/src/components/react/Chessify.tsx +++ b/src/components/react/Chessify.tsx @@ -1,8 +1,12 @@ +import { Chess, Move } from "chess.js"; +import { Api } from "chessground/api"; import { App } from "obsidian"; import * as React from "react"; +import { useCallback, useMemo, useState } from "react"; import { ChessifyPluginSettings } from "src/components/obsidian/SettingsTab"; -import { ChessgroundWrapper, ChessGroundSettings } from "./ChessgroundWrapper"; -import { parseUserConfig } from "src/utils"; +import { ChessifyFileData, parseUserConfig } from "src/utils"; +import { ChessGroundSettings, ChessgroundWrapper } from "./ChessgroundWrapper"; +import { PgnViewer } from "./PgnViewer"; export type ChessifyConfig = ChessGroundSettings; @@ -10,21 +14,129 @@ interface AppProps { source: string; app: App; pluginSettings: ChessifyPluginSettings; + chessifyData: ChessifyFileData; } -export const Chessify = ({ source, pluginSettings }: AppProps) => { - const { fen, boardColor, boardOrientation } = parseUserConfig( +export const Chessify = ({ + source, + pluginSettings, + chessifyData, +}: AppProps) => { + // Parse Obsidian / Code Block Settings + const { boardColor, boardOrientation, chessifyId } = parseUserConfig( pluginSettings, source ); + // Setup Chessboard and Chess.js APIs + const [chessView, setChessView] = useState(null); + const chessLogic = useMemo(() => { + const chess = new Chess(); + + chessifyData.moves.forEach((move) => { + chess.move({ + from: move.from, + to: move.to, + promotion: move.promotion, + }); + }); + return chess; + }, [chessifyData.moves]); + + // Track Application State + const [history, setHistory] = useState([]); + const [isViewOnly, setIsViewOnly] = useState(false); + const [currentMove, setCurrentMove] = useState(0); + + //PgnViewer Functions + const onBackButtonClick = useCallback(() => { + if (currentMove >= 0) { + setCurrentMove((currentMove) => { + const move = history[currentMove]; + const tempChess = new Chess(move.before); + chessView?.set({ + fen: move.before, + check: tempChess.isCheck(), + }); + setIsViewOnly(true); + return currentMove - 1; + }); + } + }, [chessView, currentMove, history]); + + const onForwardButtonClick = useCallback(() => { + if (currentMove < history.length - 1) { + setCurrentMove((currentMove) => { + const move = history[currentMove + 1]; + const tempChess = new Chess(move.after); + chessView?.set({ + fen: move.after, + check: tempChess.isCheck(), + }); + if (currentMove + 1 === history.length - 1) + setIsViewOnly(false); + return currentMove + 1; + }); + } + }, [currentMove, chessView, history]); + + const onMoveItemClick = useCallback( + (moveIndex: number) => { + setCurrentMove(() => { + const move = history[moveIndex]; + const tempChess = new Chess(move.after); + chessView?.set({ + fen: move.after, + check: tempChess.isCheck(), + }); + if (moveIndex + 1 !== history.length - 1) { + setIsViewOnly(false); + } else { + setIsViewOnly(true); + } + + return moveIndex; + }); + }, + [chessView, history] + ); + return ( - + > +
+ +
+
+ +
+
); }; diff --git a/src/components/react/PgnViewer/index.tsx b/src/components/react/PgnViewer/index.tsx new file mode 100644 index 0000000..9d25cce --- /dev/null +++ b/src/components/react/PgnViewer/index.tsx @@ -0,0 +1,129 @@ +import { Move } from "chess.js"; +import { ArrowLeft, ArrowRight } from "lucide-react"; +import * as React from "react"; +import { useEffect, useMemo, useRef } from "react"; + +const chunkArray = (array: T[], chunkSize: number) => { + return array.reduce((resultArray, item, index) => { + const chunkIndex = Math.floor(index / chunkSize); + + if (!resultArray[chunkIndex]) { + resultArray[chunkIndex] = []; + } + + resultArray[chunkIndex].push(item); + + return resultArray; + }, [] as T[][]); +}; + +const MoveItem = ({ + isCurrentMove, + san, + onMoveItemClick, +}: { + isCurrentMove: boolean; + san: string; + onMoveItemClick: () => void; +}) => { + const ref = useRef(null); + + useEffect(() => { + if (ref.current && isCurrentMove) { + ref.current?.scrollIntoView({ + behavior: "smooth", + block: "nearest", + inline: "end", + }); + } + }, [isCurrentMove]); + + return ( +

onMoveItemClick()} + > + {san} +

+ ); +}; + +export const PgnViewer = ({ + history, + currentMove, + onBackButtonClick, + onForwardButtonClick, + onMoveItemClick, +}: { + history: Move[]; + currentMove: number; + onBackButtonClick: () => void; + onForwardButtonClick: () => void; + onMoveItemClick: (moveIndex: number) => void; +}) => { + const movePairs = useMemo(() => chunkArray(history, 2), [history]); + + return ( +
+
+
+ {movePairs.map((pair, i) => { + const [wMove, bMove] = pair; + return ( + +

{i + 1}

+ + onMoveItemClick(i * 2) + } + /> + {bMove && ( + + onMoveItemClick(i * 2 + 1) + } + /> + )} +
+ ); + })} +
+
+
+ + +
+
+ ); +}; diff --git a/src/main.css b/src/main.css new file mode 100644 index 0000000..8beca6e --- /dev/null +++ b/src/main.css @@ -0,0 +1,47 @@ +button:active { + transform: translateY(1px); +} + +.vertical-align { + display: flex; + align-items: center; +} + +.center { + display: flex; + align-items: center; + justify-content: center; +} + +.move-item { + padding-left: 8px; + user-select: none; +} + +.move-item:hover { + background-color: hsl( + var(--accent-h), + var(--accent-s), + calc(var(--accent-l)) + ); + color: var(--text-on-accent); + cursor: pointer; +} + +.move-item.active { + background-color: hsl( + var(--accent-h), + var(--accent-s), + calc(var(--accent-l) - 10%) + ); + color: var(--text-on-accent); + font-weight: bold; +} + +.move-indicator { + color: var(--color-base-60); + text-align: center; + background-color: var(--color-base-10); + user-select: none; + cursor: default; +} diff --git a/src/main.tsx b/src/main.tsx index 159d917..fa7e2bc 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,36 +1,116 @@ -import { App, MarkdownRenderChild, Plugin } from "obsidian"; +import { Chess } from "chess.js"; +import { Editor, Notice, Plugin } from "obsidian"; +import { ReactView } from "./components/ReactView"; +import { PgnModal } from "./components/obsidian/PgnModal"; import { ChessifyPluginSettings, DEFAULT_SETTINGS, SettingsTab, } from "./components/obsidian/SettingsTab"; -import * as ReactDOM from "react-dom/client"; -import * as React from "react"; -import { Chessify } from "./components/react/Chessify"; +import { + ChessifyDataAdapter, + ChessifyFileData, + parseUserConfig, +} from "./utils"; // these styles must be imported somewhere +import "assets/board/green.css"; import "chessground/assets/chessground.base.css"; import "chessground/assets/chessground.brown.css"; import "chessground/assets/chessground.cburnett.css"; -import "assets/board/green.css"; +import "../reset.css"; +import "./main.css"; export default class ChessifyPlugin extends Plugin { settings: ChessifyPluginSettings; + dataAdapter: ChessifyDataAdapter; + storagePath = `${this.app.vault.configDir}/plugins/${this.manifest.id}/storage/`; async onload() { - // Load the settings + // Load Settings await this.loadSettings(); + // Register Data Adapter + this.dataAdapter = new ChessifyDataAdapter( + this.app.vault.adapter, + this.storagePath + ); + // Add settings tab this.addSettingTab(new SettingsTab(this.app, this)); + // Add command + this.addCommand({ + id: "insert-chesser", + name: "Insert PGN-Editor at cursor position", + editorCallback: (editor: Editor) => { + const cursorPosition = editor.getCursor(); + + const onSubmit = async (pgn: string) => { + try { + const chess = new Chess(); + + if (pgn) { + //Try to parse the PGN + chess.loadPgn(pgn, { + strict: false, + }); + } + + const chessifyFileData: ChessifyFileData = { + header: { + title: chess.header()["opening"] || null, + }, + moves: chess + .history({ verbose: true }) + .map((move) => ({ + ...move, + subMoves: [], + shapes: [], + })), + }; + + const id = await this.dataAdapter.saveFile( + chessifyFileData + ); + + editor.replaceRange( + `\`\`\`chessify\nchessifyId: ${id}\n\`\`\``, + cursorPosition + ); + } catch (e) { + new Notice("There was an error during PGN parsing.", 0); + } + }; + + new PgnModal(this.app, onSubmit).open(); + }, + }); + // Add chessify code block processor this.registerMarkdownCodeBlockProcessor( "chessify", - (source, el, ctx) => { - ctx.addChild( - new ReactView(el, source, this.app, this.settings) - ); + async (source, el, ctx) => { + const { chessifyId } = parseUserConfig(this.settings, source); + + if (!chessifyId.trim().length) + return new Notice( + "No chessifyId parameter found, please add one manually if the file already exists or add it via the 'Insert PGN-Editor at cursor position' command.", + 0 + ); + + try { + const data = await this.dataAdapter.loadFile(chessifyId); + + ctx.addChild( + new ReactView(el, source, this.app, this.settings, data) + ); + } catch (e) { + new Notice( + `There was an error while trying to load ${chessifyId}.json. You can check the plugin folder if the file exist and if not add one via the 'Insert PGN-Editor at cursor position' command.`, + 0 + ); + } } ); @@ -53,39 +133,3 @@ export default class ChessifyPlugin extends Plugin { await this.saveData(this.settings); } } - -class ReactView extends MarkdownRenderChild { - root: ReactDOM.Root; - source: string; - app: App; - settings: ChessifyPluginSettings; - - constructor( - containerEL: HTMLElement, - source: string, - app: App, - settings: ChessifyPluginSettings - ) { - super(containerEL); - this.source = source; - this.app = app; - this.settings = settings; - } - - onload() { - this.root = ReactDOM.createRoot(this.containerEl); - this.root.render( - - - - ); - } - - onunload() { - this.root.unmount(); - } -} diff --git a/src/utils/index.ts b/src/utils/index.ts index dfe266b..fb2f2e1 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,11 +1,14 @@ -import { parseYaml } from "obsidian"; -import { ChessifyPluginSettings } from "src/components/obsidian/SettingsTab"; -import { Chess, QUEEN, SQUARES, Square } from "chess.js"; +import { Chess, Move, QUEEN, SQUARES, Square } from "chess.js"; import { Api } from "chessground/api"; import { Config } from "chessground/config"; +import { DrawShape } from "chessground/draw"; +import { nanoid } from "nanoid"; +import { DataAdapter, parseYaml } from "obsidian"; +import { ChessifyPluginSettings } from "src/components/obsidian/SettingsTab"; +//Chess Logic type ChessifyAppConfig = ChessifyPluginSettings & { - fen: string; + chessifyId: string; }; export const parseUserConfig = ( @@ -14,7 +17,7 @@ export const parseUserConfig = ( ): ChessifyAppConfig => { const chessifyConfig: ChessifyAppConfig = { ...settings, - fen: "", + chessifyId: "", }; try { @@ -66,5 +69,44 @@ export function playOtherSide(cg: Api, chess: Chess) { } else { cg.set(commonTurnProperties); } + + return chess.history({ verbose: true }); }; } + +//Storage Logic + +interface ChessifyMove extends Move { + subMoves: Move[]; + shapes: DrawShape[]; +} +export interface ChessifyFileData { + header: { title: string | null }; + moves: ChessifyMove[]; +} + +export class ChessifyDataAdapter { + adapter: DataAdapter; + storagePath: string; + + constructor(adapter: DataAdapter, storagePath: string) { + this.adapter = adapter; + this.storagePath = storagePath; + } + + async saveFile(data: ChessifyFileData) { + const id = nanoid(); + await this.adapter.write( + `${this.storagePath}/${id}.json`, + JSON.stringify(data, null, 2), + {} + ); + + return id; + } + + async loadFile(id: string): Promise { + const data = await this.adapter.read(`${this.storagePath}/${id}.json`); + return JSON.parse(data); + } +} diff --git a/storage/.keep b/storage/.keep new file mode 100644 index 0000000..e69de29 diff --git a/styles.css b/styles.css index d606ea7..2b55d8f 100644 --- a/styles.css +++ b/styles.css @@ -1,3 +1,8 @@ +/* assets/board/green.css */ +.green-board cg-board { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICAgIHZpZXdCb3g9IjAgMCA4IDgiIHNoYXBlLXJlbmRlcmluZz0iY3Jpc3BFZGdlcyI+CjxnIGlkPSJhIj4KICA8ZyBpZD0iYiI+CiAgICA8ZyBpZD0iYyI+CiAgICAgIDxnIGlkPSJkIj4KICAgICAgICA8cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSIjZmZmZmRkIiBpZD0iZSIvPgogICAgICAgIDx1c2UgeD0iMSIgeT0iMSIgaHJlZj0iI2UiIHg6aHJlZj0iI2UiLz4KICAgICAgICA8cmVjdCB5PSIxIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSIjODZhNjY2IiBpZD0iZiIvPgogICAgICAgIDx1c2UgeD0iMSIgeT0iLTEiIGhyZWY9IiNmIiB4OmhyZWY9IiNmIi8+CiAgICAgIDwvZz4KICAgICAgPHVzZSB4PSIyIiBocmVmPSIjZCIgeDpocmVmPSIjZCIvPgogICAgPC9nPgogICAgPHVzZSB4PSI0IiBocmVmPSIjYyIgeDpocmVmPSIjYyIvPgogIDwvZz4KICA8dXNlIHk9IjIiIGhyZWY9IiNiIiB4OmhyZWY9IiNiIi8+CjwvZz4KPHVzZSB5PSI0IiBocmVmPSIjYSIgeDpocmVmPSIjYSIvPgo8L3N2Zz4K); +} + /* node_modules/chessground/assets/chessground.base.css */ .cg-wrap { box-sizing: content-box; @@ -256,8 +261,91 @@ cg-board square.current-premove { background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMi41IDExLjYzVjYiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz48cGF0aCBkPSJNMjIuNSAyNXM0LjUtNy41IDMtMTAuNWMwIDAtMS0yLjUtMy0yLjVzLTMgMi41LTMgMi41Yy0xLjUgMyAzIDEwLjUgMyAxMC41IiBmaWxsPSIjMDAwIiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPjxwYXRoIGQ9Ik0xMS41IDM3YzUuNSAzLjUgMTUuNSAzLjUgMjEgMHYtN3M5LTQuNSA2LTEwLjVjLTQtNi41LTEzLjUtMy41LTE2IDRWMjd2LTMuNWMtMy41LTcuNS0xMy0xMC41LTE2LTQtMyA2IDUgMTAgNSAxMFYzN3oiIGZpbGw9IiMwMDAiLz48cGF0aCBkPSJNMjAgOGg1IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+PHBhdGggZD0iTTMyIDI5LjVzOC41LTQgNi4wMy05LjY1QzM0LjE1IDE0IDI1IDE4IDIyLjUgMjQuNWwuMDEgMi4xLS4wMS0yLjFDMjAgMTggOS45MDYgMTQgNi45OTcgMTkuODVjLTIuNDk3IDUuNjUgNC44NTMgOSA0Ljg1MyA5IiBzdHJva2U9IiNlY2VjZWMiLz48cGF0aCBkPSJNMTEuNSAzMGM1LjUtMyAxNS41LTMgMjEgMG0tMjEgMy41YzUuNS0zIDE1LjUtMyAyMSAwbS0yMSAzLjVjNS41LTMgMTUuNS0zIDIxIDAiIHN0cm9rZT0iI2VjZWNlYyIvPjwvZz48L3N2Zz4=); } -/* assets/board/green.css */ -.green-board cg-board { - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICAgIHZpZXdCb3g9IjAgMCA4IDgiIHNoYXBlLXJlbmRlcmluZz0iY3Jpc3BFZGdlcyI+CjxnIGlkPSJhIj4KICA8ZyBpZD0iYiI+CiAgICA8ZyBpZD0iYyI+CiAgICAgIDxnIGlkPSJkIj4KICAgICAgICA8cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSIjZmZmZmRkIiBpZD0iZSIvPgogICAgICAgIDx1c2UgeD0iMSIgeT0iMSIgaHJlZj0iI2UiIHg6aHJlZj0iI2UiLz4KICAgICAgICA8cmVjdCB5PSIxIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSIjODZhNjY2IiBpZD0iZiIvPgogICAgICAgIDx1c2UgeD0iMSIgeT0iLTEiIGhyZWY9IiNmIiB4OmhyZWY9IiNmIi8+CiAgICAgIDwvZz4KICAgICAgPHVzZSB4PSIyIiBocmVmPSIjZCIgeDpocmVmPSIjZCIvPgogICAgPC9nPgogICAgPHVzZSB4PSI0IiBocmVmPSIjYyIgeDpocmVmPSIjYyIvPgogIDwvZz4KICA8dXNlIHk9IjIiIGhyZWY9IiNiIiB4OmhyZWY9IiNiIi8+CjwvZz4KPHVzZSB5PSI0IiBocmVmPSIjYSIgeDpocmVmPSIjYSIvPgo8L3N2Zz4K); +/* reset.css */ +*, +*::before, +*::after { + box-sizing: border-box; } -/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2NoZXNzZ3JvdW5kL2Fzc2V0cy9jaGVzc2dyb3VuZC5iYXNlLmNzcyIsICJub2RlX21vZHVsZXMvY2hlc3Nncm91bmQvYXNzZXRzL2NoZXNzZ3JvdW5kLmJyb3duLmNzcyIsICJub2RlX21vZHVsZXMvY2hlc3Nncm91bmQvYXNzZXRzL2NoZXNzZ3JvdW5kLmNidXJuZXR0LmNzcyIsICJhc3NldHMvYm9hcmQvZ3JlZW4uY3NzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIuY2ctd3JhcCB7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5jZy1jb250YWluZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB0b3A6IDA7XG59XG5cbmNnLWJvYXJkIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGxpbmUtaGVpZ2h0OiAwO1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xufVxuXG4uY2ctd3JhcC5tYW5pcHVsYWJsZSBjZy1ib2FyZCB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuY2ctYm9hcmQgc3F1YXJlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMi41JTtcbiAgaGVpZ2h0OiAxMi41JTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbmNnLWJvYXJkIHNxdWFyZS5tb3ZlLWRlc3Qge1xuICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuY2ctYm9hcmQgc3F1YXJlLmxhc3QtbW92ZSB7XG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07XG59XG5cbi5jZy13cmFwIHBpZWNlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMi41JTtcbiAgaGVpZ2h0OiAxMi41JTtcbiAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcbiAgei1pbmRleDogMjtcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbmNnLWJvYXJkIHBpZWNlLmRyYWdnaW5nIHtcbiAgY3Vyc29yOiBtb3ZlO1xuICAvKiAhaW1wb3J0YW50IHRvIG92ZXJyaWRlIHotaW5kZXggZnJvbSAzRCBwaWVjZSBpbmxpbmUgc3R5bGUgKi9cbiAgei1pbmRleDogMTEgIWltcG9ydGFudDtcbn1cblxucGllY2UuYW5pbSB7XG4gIHotaW5kZXg6IDg7XG59XG5cbnBpZWNlLmZhZGluZyB7XG4gIHotaW5kZXg6IDE7XG4gIG9wYWNpdHk6IDAuNTtcbn1cblxuLmNnLXdyYXAgcGllY2UuZ2hvc3Qge1xuICBvcGFjaXR5OiAwLjM7XG59XG5cbi5jZy13cmFwIHBpZWNlIHN2ZyB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAwcHg7XG4gIGxlZnQ6IDBweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHotaW5kZXg6IDI7XG4gIG9wYWNpdHk6IDAuNjtcbn1cblxuLmNnLXdyYXAgY2ctYXV0by1waWVjZXMsXG4uY2ctd3JhcCAuY2ctc2hhcGVzLFxuLmNnLXdyYXAgLmNnLWN1c3RvbS1zdmdzIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwcHg7XG4gIGxlZnQ6IDBweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5jZy13cmFwIGNnLWF1dG8tcGllY2VzIHtcbiAgei1pbmRleDogMjtcbn1cblxuLmNnLXdyYXAgY2ctYXV0by1waWVjZXMgcGllY2Uge1xuICBvcGFjaXR5OiAwLjM7XG59XG5cbi5jZy13cmFwIC5jZy1zaGFwZXMge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBvcGFjaXR5OiAwLjY7XG4gIHotaW5kZXg6IDI7XG59XG5cbi5jZy13cmFwIC5jZy1jdXN0b20tc3ZncyB7XG4gIC8qIG92ZXIgcGllY2UuYW5pbSA9IDgsIGJ1dCB1bmRlciBwaWVjZS5kcmFnZ2luZyA9IDExICovXG4gIHotaW5kZXg6IDk7XG59XG5cbi5jZy13cmFwIC5jZy1jdXN0b20tc3ZncyBzdmcge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cblxuLmNnLXdyYXAgY29vcmRzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgb3BhY2l0eTogMC44O1xuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiA5cHg7XG59XG5cbi5jZy13cmFwIGNvb3Jkcy5yYW5rcyB7XG4gIGxlZnQ6IDRweDtcbiAgdG9wOiAtMjBweDtcbiAgZmxleC1mbG93OiBjb2x1bW4tcmV2ZXJzZTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTJweDtcbn1cblxuLmNnLXdyYXAgY29vcmRzLnJhbmtzLmJsYWNrIHtcbiAgZmxleC1mbG93OiBjb2x1bW47XG59XG5cbi5jZy13cmFwIGNvb3Jkcy5yYW5rcy5sZWZ0IHtcbiAgbGVmdDogLTE1cHg7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbn1cblxuLmNnLXdyYXAgY29vcmRzLmZpbGVzIHtcbiAgYm90dG9tOiAtNHB4O1xuICBsZWZ0OiAyNHB4O1xuICBmbGV4LWZsb3c6IHJvdztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTZweDtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uY2ctd3JhcCBjb29yZHMuZmlsZXMuYmxhY2sge1xuICBmbGV4LWZsb3c6IHJvdy1yZXZlcnNlO1xufVxuXG4uY2ctd3JhcCBjb29yZHMgY29vcmQge1xuICBmbGV4OiAxIDEgYXV0bztcbn1cblxuLmNnLXdyYXAgY29vcmRzLnJhbmtzIGNvb3JkIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDM5JSk7XG59XG4iLCAiLyoqIENvbG9yZWQgYm9hcmQgc3F1YXJlcyBhcyBhbiBlbWJlZGRlZCBTVkcgKi9cbmNnLWJvYXJkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZDliNTtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlWVlJHTFRnaUlITjBZVzVrWVd4dmJtVTlJbTV2SWo4K0NqeHpkbWNnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUI0Yld4dWN6cDRQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUwzaHNhVzVySWdvZ0lDQWdJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lJSE5vWVhCbExYSmxibVJsY21sdVp6MGlZM0pwYzNCRlpHZGxjeUkrQ2p4bklHbGtQU0poSWo0S0lDQThaeUJwWkQwaVlpSStDaUFnSUNBOFp5QnBaRDBpWXlJK0NpQWdJQ0FnSUR4bklHbGtQU0prSWo0S0lDQWdJQ0FnSUNBOGNtVmpkQ0IzYVdSMGFEMGlNU0lnYUdWcFoyaDBQU0l4SWlCcFpEMGlaU0lnYjNCaFkybDBlVDBpTUNJdlBnb2dJQ0FnSUNBZ0lEeDFjMlVnZUQwaU1TSWdlVDBpTVNJZ2FISmxaajBpSTJVaUlIZzZhSEpsWmowaUkyVWlMejRLSUNBZ0lDQWdJQ0E4Y21WamRDQjVQU0l4SWlCM2FXUjBhRDBpTVNJZ2FHVnBaMmgwUFNJeElpQnBaRDBpWmlJZ2IzQmhZMmwwZVQwaU1DNHlJaTgrQ2lBZ0lDQWdJQ0FnUEhWelpTQjRQU0l4SWlCNVBTSXRNU0lnYUhKbFpqMGlJMllpSUhnNmFISmxaajBpSTJZaUx6NEtJQ0FnSUNBZ1BDOW5QZ29nSUNBZ0lDQThkWE5sSUhnOUlqSWlJR2h5WldZOUlpTmtJaUI0T21oeVpXWTlJaU5rSWk4K0NpQWdJQ0E4TDJjK0NpQWdJQ0E4ZFhObElIZzlJalFpSUdoeVpXWTlJaU5qSWlCNE9taHlaV1k5SWlOaklpOCtDaUFnUEM5blBnb2dJRHgxYzJVZ2VUMGlNaUlnYUhKbFpqMGlJMklpSUhnNmFISmxaajBpSTJJaUx6NEtQQzluUGdvOGRYTmxJSGs5SWpRaUlHaHlaV1k5SWlOaElpQjRPbWh5WldZOUlpTmhJaTgrQ2p3dmMzWm5QZz09Jyk7XG59XG5cbi8qKiBJbnRlcmFjdGl2ZSBib2FyZCBzcXVhcmUgY29sb3JzICovXG5jZy1ib2FyZCBzcXVhcmUubW92ZS1kZXN0IHtcbiAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KHJnYmEoMjAsIDg1LCAzMCwgMC41KSAyMiUsICMyMDg1MzAgMCwgcmdiYSgwLCAwLCAwLCAwLjMpIDAsIHJnYmEoMCwgMCwgMCwgMCkgMCk7XG59XG5jZy1ib2FyZCBzcXVhcmUucHJlbW92ZS1kZXN0IHtcbiAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KHJnYmEoMjAsIDMwLCA4NSwgMC41KSAyMiUsICMyMDMwODUgMCwgcmdiYSgwLCAwLCAwLCAwLjMpIDAsIHJnYmEoMCwgMCwgMCwgMCkgMCk7XG59XG5jZy1ib2FyZCBzcXVhcmUub2MubW92ZS1kZXN0IHtcbiAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KHRyYW5zcGFyZW50IDAlLCB0cmFuc3BhcmVudCA4MCUsIHJnYmEoMjAsIDg1LCAwLCAwLjMpIDgwJSk7XG59XG5jZy1ib2FyZCBzcXVhcmUub2MucHJlbW92ZS1kZXN0IHtcbiAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KHRyYW5zcGFyZW50IDAlLCB0cmFuc3BhcmVudCA4MCUsIHJnYmEoMjAsIDMwLCA4NSwgMC4yKSA4MCUpO1xufVxuY2ctYm9hcmQgc3F1YXJlLm1vdmUtZGVzdDpob3ZlciB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjAsIDg1LCAzMCwgMC4zKTtcbn1cbmNnLWJvYXJkIHNxdWFyZS5wcmVtb3ZlLWRlc3Q6aG92ZXIge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDIwLCAzMCwgODUsIDAuMik7XG59XG5jZy1ib2FyZCBzcXVhcmUubGFzdC1tb3ZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxNTUsIDE5OSwgMCwgMC40MSk7XG59XG5jZy1ib2FyZCBzcXVhcmUuc2VsZWN0ZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIwLCA4NSwgMzAsIDAuNSk7XG59XG5jZy1ib2FyZCBzcXVhcmUuY2hlY2sge1xuICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoXG4gICAgZWxsaXBzZSBhdCBjZW50ZXIsXG4gICAgcmdiYSgyNTUsIDAsIDAsIDEpIDAlLFxuICAgIHJnYmEoMjMxLCAwLCAwLCAxKSAyNSUsXG4gICAgcmdiYSgxNjksIDAsIDAsIDApIDg5JSxcbiAgICByZ2JhKDE1OCwgMCwgMCwgMCkgMTAwJVxuICApO1xufVxuY2ctYm9hcmQgc3F1YXJlLmN1cnJlbnQtcHJlbW92ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjAsIDMwLCA4NSwgMC41KTtcbn1cblxuLyoqIEFsdGVybmF0aW5nIGNvbG9ycyBpbiByYW5rL2ZpbGUgbGFiZWxzICovXG4uY2ctd3JhcC5vcmllbnRhdGlvbi13aGl0ZSBjb29yZHMucmFua3MgY29vcmQ6bnRoLWNoaWxkKDJuKSxcbi5jZy13cmFwLm9yaWVudGF0aW9uLXdoaXRlIGNvb3Jkcy5maWxlcyBjb29yZDpudGgtY2hpbGQoMm4pLFxuLmNnLXdyYXAub3JpZW50YXRpb24tYmxhY2sgY29vcmRzLnJhbmtzIGNvb3JkOm50aC1jaGlsZCgybiArIDEpLFxuLmNnLXdyYXAub3JpZW50YXRpb24tYmxhY2sgY29vcmRzLmZpbGVzIGNvb3JkOm50aC1jaGlsZCgybiArIDEpIHtcbiAgY29sb3I6IHJnYmEoNzIsIDcyLCA3MiwgMC44KTtcbn1cblxuLmNnLXdyYXAub3JpZW50YXRpb24tYmxhY2sgY29vcmRzLnJhbmtzIGNvb3JkOm50aC1jaGlsZCgybiksXG4uY2ctd3JhcC5vcmllbnRhdGlvbi1ibGFjayBjb29yZHMuZmlsZXMgY29vcmQ6bnRoLWNoaWxkKDJuKSxcbi5jZy13cmFwLm9yaWVudGF0aW9uLXdoaXRlIGNvb3Jkcy5yYW5rcyBjb29yZDpudGgtY2hpbGQoMm4gKyAxKSxcbi5jZy13cmFwLm9yaWVudGF0aW9uLXdoaXRlIGNvb3Jkcy5maWxlcyBjb29yZDpudGgtY2hpbGQoMm4gKyAxKSB7XG4gIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7XG59XG4iLCAiLyoqIEVtYmVkZGVkIFNWR3MgZm9yIGFsbCBjaGVzcyBwaWVjZXMgKi9cbi5jZy13cmFwIHBpZWNlLnBhd24ud2hpdGUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJME5TSWdhR1ZwWjJoMFBTSTBOU0krUEhCaGRHZ2daRDBpVFRJeUxqVWdPV010TWk0eU1TQXdMVFFnTVM0M09TMDBJRFFnTUNBdU9Ea3VNamtnTVM0M01TNDNPQ0F5TGpNNFF6RTNMak16SURFMkxqVWdNVFlnTVRndU5Ua2dNVFlnTWpGak1DQXlMakF6TGprMElETXVPRFFnTWk0ME1TQTFMakF6TFRNZ01TNHdOaTAzTGpReElEVXVOVFV0Tnk0ME1TQXhNeTQwTjJneU0yTXdMVGN1T1RJdE5DNDBNUzB4TWk0ME1TMDNMalF4TFRFekxqUTNJREV1TkRjdE1TNHhPU0F5TGpReExUTWdNaTQwTVMwMUxqQXpJREF0TWk0ME1TMHhMak16TFRRdU5TMHpMakk0TFRVdU5qSXVORGt0TGpZM0xqYzRMVEV1TkRrdU56Z3RNaTR6T0NBd0xUSXVNakV0TVM0M09TMDBMVFF0TkhvaUlHWnBiR3c5SWlObVptWWlJSE4wY205clpUMGlJekF3TUNJZ2MzUnliMnRsTFhkcFpIUm9QU0l4TGpVaUlITjBjbTlyWlMxc2FXNWxZMkZ3UFNKeWIzVnVaQ0l2UGp3dmMzWm5QZz09Jyk7XG59XG4uY2ctd3JhcCBwaWVjZS5iaXNob3Aud2hpdGUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJME5TSWdhR1ZwWjJoMFBTSTBOU0krUEdjZ1ptbHNiRDBpYm05dVpTSWdabWxzYkMxeWRXeGxQU0psZG1WdWIyUmtJaUJ6ZEhKdmEyVTlJaU13TURBaUlITjBjbTlyWlMxM2FXUjBhRDBpTVM0MUlpQnpkSEp2YTJVdGJHbHVaV05oY0QwaWNtOTFibVFpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlQanhuSUdacGJHdzlJaU5tWm1ZaUlITjBjbTlyWlMxc2FXNWxZMkZ3UFNKaWRYUjBJajQ4Y0dGMGFDQmtQU0pOT1NBek5tTXpMak01TFM0NU55QXhNQzR4TVM0ME15QXhNeTQxTFRJZ015NHpPU0F5TGpReklERXdMakV4SURFdU1ETWdNVE11TlNBeUlEQWdNQ0F4TGpZMUxqVTBJRE1nTWkwdU5qZ3VPVGN0TVM0Mk5TNDVPUzB6SUM0MUxUTXVNemt0TGprM0xURXdMakV4TGpRMkxURXpMalV0TVMwekxqTTVJREV1TkRZdE1UQXVNVEV1TURNdE1UTXVOU0F4TFRFdU16VTBMalE1TFRJdU16SXpMalEzTFRNdExqVWdNUzR6TlRRdE1TNDVOQ0F6TFRJZ015MHllaUl2UGp4d1lYUm9JR1E5SWsweE5TQXpNbU15TGpVZ01pNDFJREV5TGpVZ01pNDFJREUxSURBZ0xqVXRNUzQxSURBdE1pQXdMVElnTUMweUxqVXRNaTQxTFRRdE1pNDFMVFFnTlM0MUxURXVOU0EyTFRFeExqVXROUzB4TlM0MUxURXhJRFF0TVRBdU5TQXhOQzAxSURFMUxqVWdNQ0F3TFRJdU5TQXhMalV0TWk0MUlEUWdNQ0F3TFM0MUxqVWdNQ0F5ZWlJdlBqeHdZWFJvSUdROUlrMHlOU0E0WVRJdU5TQXlMalVnTUNBeElERXROU0F3SURJdU5TQXlMalVnTUNBeElERWdOU0F3ZWlJdlBqd3ZaejQ4Y0dGMGFDQmtQU0pOTVRjdU5TQXlObWd4TUUweE5TQXpNR2d4TlcwdE55NDFMVEUwTGpWMk5VMHlNQ0F4T0dnMUlpQnpkSEp2YTJVdGJHbHVaV3B2YVc0OUltMXBkR1Z5SWk4K1BDOW5Qand2YzNablBnPT0nKTtcbn1cbi5jZy13cmFwIHBpZWNlLmtuaWdodC53aGl0ZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwTlNJZ2FHVnBaMmgwUFNJME5TSStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTXdNREFpSUhOMGNtOXJaUzEzYVdSMGFEMGlNUzQxSWlCemRISnZhMlV0YkdsdVpXTmhjRDBpY205MWJtUWlJSE4wY205clpTMXNhVzVsYW05cGJqMGljbTkxYm1RaVBqeHdZWFJvSUdROUlrMHlNaUF4TUdNeE1DNDFJREVnTVRZdU5TQTRJREUySURJNVNERTFZekF0T1NBeE1DMDJMalVnT0MweU1TSWdabWxzYkQwaUkyWm1aaUl2UGp4d1lYUm9JR1E5SWsweU5DQXhPR011TXpnZ01pNDVNUzAxTGpVMUlEY3VNemN0T0NBNUxUTWdNaTB5TGpneUlEUXVNelF0TlNBMExURXVNRFF5TFM0NU5DQXhMalF4TFRNdU1EUWdNQzB6TFRFZ01DQXVNVGtnTVM0eU15MHhJREl0TVNBd0xUUXVNREF6SURFdE5DMDBJREF0TWlBMkxURXlJRFl0TVRKek1TNDRPUzB4TGprZ01pMHpMalZqTFM0M015MHVPVGswTFM0MUxUSXRMalV0TXlBeExURWdNeUF5TGpVZ015QXlMalZvTW5NdU56Z3RNUzQ1T1RJZ01pNDFMVE5qTVNBd0lERWdNeUF4SURNaUlHWnBiR3c5SWlObVptWWlMejQ4Y0dGMGFDQmtQU0pOT1M0MUlESTFMalZoTGpVdU5TQXdJREVnTVMweElEQWdMalV1TlNBd0lERWdNU0F4SURCNmJUVXVORE16TFRrdU56VmhMalVnTVM0MUlETXdJREVnTVMwdU9EWTJMUzQxTGpVZ01TNDFJRE13SURFZ01TQXVPRFkyTGpWNklpQm1hV3hzUFNJak1EQXdJaTgrUEM5blBqd3ZjM1puUGc9PScpO1xufVxuLmNnLXdyYXAgcGllY2Uucm9vay53aGl0ZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwTlNJZ2FHVnBaMmgwUFNJME5TSStQR2NnWm1sc2JEMGlJMlptWmlJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTXdNREFpSUhOMGNtOXJaUzEzYVdSMGFEMGlNUzQxSWlCemRISnZhMlV0YkdsdVpXTmhjRDBpY205MWJtUWlJSE4wY205clpTMXNhVzVsYW05cGJqMGljbTkxYm1RaVBqeHdZWFJvSUdROUlrMDVJRE01YURJM2RpMHpTRGwyTTNwdE15MHpkaTAwYURJeGRqUklNVEo2YlMweExUSXlWamxvTkhZeWFEVldPV2cxZGpKb05WWTVhRFIyTlNJZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW1KMWRIUWlMejQ4Y0dGMGFDQmtQU0pOTXpRZ01UUnNMVE1nTTBneE5Hd3RNeTB6SWk4K1BIQmhkR2dnWkQwaVRUTXhJREUzZGpFeUxqVklNVFJXTVRjaUlITjBjbTlyWlMxc2FXNWxZMkZ3UFNKaWRYUjBJaUJ6ZEhKdmEyVXRiR2x1WldwdmFXNDlJbTFwZEdWeUlpOCtQSEJoZEdnZ1pEMGlUVE14SURJNUxqVnNNUzQxSURJdU5XZ3RNakJzTVM0MUxUSXVOU0l2UGp4d1lYUm9JR1E5SWsweE1TQXhOR2d5TXlJZ1ptbHNiRDBpYm05dVpTSWdjM1J5YjJ0bExXeHBibVZxYjJsdVBTSnRhWFJsY2lJdlBqd3ZaejQ4TDNOMlp6ND0nKTtcbn1cbi5jZy13cmFwIHBpZWNlLnF1ZWVuLndoaXRlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTBOU0lnYUdWcFoyaDBQU0kwTlNJK1BHY2dabWxzYkQwaUkyWm1aaUlnWm1sc2JDMXlkV3hsUFNKbGRtVnViMlJrSWlCemRISnZhMlU5SWlNd01EQWlJSE4wY205clpTMTNhV1IwYUQwaU1TNDFJaUJ6ZEhKdmEyVXRiR2x1WldOaGNEMGljbTkxYm1RaUlITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpUGp4d1lYUm9JR1E5SWswNElERXlZVElnTWlBd0lERWdNUzAwSURBZ01pQXlJREFnTVNBeElEUWdNSHB0TVRZdU5TMDBMalZoTWlBeUlEQWdNU0F4TFRRZ01DQXlJRElnTUNBeElERWdOQ0F3ZWswME1TQXhNbUV5SURJZ01DQXhJREV0TkNBd0lESWdNaUF3SURFZ01TQTBJREI2VFRFMklEZ3VOV0V5SURJZ01DQXhJREV0TkNBd0lESWdNaUF3SURFZ01TQTBJREI2VFRNeklEbGhNaUF5SURBZ01TQXhMVFFnTUNBeUlESWdNQ0F4SURFZ05DQXdlaUl2UGp4d1lYUm9JR1E5SWswNUlESTJZemd1TlMweExqVWdNakV0TVM0MUlESTNJREJzTWkweE1pMDNJREV4VmpFeGJDMDFMalVnTVRNdU5TMHpMVEUxTFRNZ01UVXROUzQxTFRFMFZqSTFURGNnTVRSc01pQXhNbm9pSUhOMGNtOXJaUzFzYVc1bFkyRndQU0ppZFhSMElpOCtQSEJoZEdnZ1pEMGlUVGtnTWpaak1DQXlJREV1TlNBeUlESXVOU0EwSURFZ01TNDFJREVnTVNBdU5TQXpMalV0TVM0MUlERXRNUzQxSURJdU5TMHhMalVnTWk0MUxURXVOU0F4TGpVdU5TQXlMalV1TlNBeUxqVWdOaTQxSURFZ01UWXVOU0F4SURJeklEQWdNQ0F3SURFdU5TMHhJREF0TWk0MUlEQWdNQ0F1TlMweExqVXRNUzB5TGpVdExqVXRNaTQxTFM0MUxUSWdMalV0TXk0MUlERXRNaUF5TGpVdE1pQXlMalV0TkMwNExqVXRNUzQxTFRFNExqVXRNUzQxTFRJM0lEQjZJaUJ6ZEhKdmEyVXRiR2x1WldOaGNEMGlZblYwZENJdlBqeHdZWFJvSUdROUlrMHhNUzQxSURNd1l6TXVOUzB4SURFNExqVXRNU0F5TWlBd1RURXlJRE16TGpWak5pMHhJREUxTFRFZ01qRWdNQ0lnWm1sc2JEMGlibTl1WlNJdlBqd3ZaejQ4TDNOMlp6ND0nKTtcbn1cbi5jZy13cmFwIHBpZWNlLmtpbmcud2hpdGUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJME5TSWdhR1ZwWjJoMFBTSTBOU0krUEdjZ1ptbHNiRDBpYm05dVpTSWdabWxzYkMxeWRXeGxQU0psZG1WdWIyUmtJaUJ6ZEhKdmEyVTlJaU13TURBaUlITjBjbTlyWlMxM2FXUjBhRDBpTVM0MUlpQnpkSEp2YTJVdGJHbHVaV05oY0QwaWNtOTFibVFpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlQanh3WVhSb0lHUTlJazB5TWk0MUlERXhMall6VmpaTk1qQWdPR2cxSWlCemRISnZhMlV0YkdsdVpXcHZhVzQ5SW0xcGRHVnlJaTgrUEhCaGRHZ2daRDBpVFRJeUxqVWdNalZ6TkM0MUxUY3VOU0F6TFRFd0xqVmpNQ0F3TFRFdE1pNDFMVE10TWk0MWN5MHpJREl1TlMweklESXVOV010TVM0MUlETWdNeUF4TUM0MUlETWdNVEF1TlNJZ1ptbHNiRDBpSTJabVppSWdjM1J5YjJ0bExXeHBibVZqWVhBOUltSjFkSFFpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpYldsMFpYSWlMejQ4Y0dGMGFDQmtQU0pOTVRFdU5TQXpOMk0xTGpVZ015NDFJREUxTGpVZ015NDFJREl4SURCMkxUZHpPUzAwTGpVZ05pMHhNQzQxWXkwMExUWXVOUzB4TXk0MUxUTXVOUzB4TmlBMFZqSTNkaTB6TGpWakxUTXVOUzAzTGpVdE1UTXRNVEF1TlMweE5pMDBMVE1nTmlBMUlERXdJRFVnTVRCV016ZDZJaUJtYVd4c1BTSWpabVptSWk4K1BIQmhkR2dnWkQwaVRURXhMalVnTXpCak5TNDFMVE1nTVRVdU5TMHpJREl4SURCdExUSXhJRE11TldNMUxqVXRNeUF4TlM0MUxUTWdNakVnTUcwdE1qRWdNeTQxWXpVdU5TMHpJREUxTGpVdE15QXlNU0F3SWk4K1BDOW5Qand2YzNablBnPT0nKTtcbn1cbi5jZy13cmFwIHBpZWNlLnBhd24uYmxhY2sge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJME5TSWdhR1ZwWjJoMFBTSTBOU0krUEhCaGRHZ2daRDBpVFRJeUxqVWdPV010TWk0eU1TQXdMVFFnTVM0M09TMDBJRFFnTUNBdU9Ea3VNamtnTVM0M01TNDNPQ0F5TGpNNFF6RTNMak16SURFMkxqVWdNVFlnTVRndU5Ua2dNVFlnTWpGak1DQXlMakF6TGprMElETXVPRFFnTWk0ME1TQTFMakF6TFRNZ01TNHdOaTAzTGpReElEVXVOVFV0Tnk0ME1TQXhNeTQwTjJneU0yTXdMVGN1T1RJdE5DNDBNUzB4TWk0ME1TMDNMalF4TFRFekxqUTNJREV1TkRjdE1TNHhPU0F5TGpReExUTWdNaTQwTVMwMUxqQXpJREF0TWk0ME1TMHhMak16TFRRdU5TMHpMakk0TFRVdU5qSXVORGt0TGpZM0xqYzRMVEV1TkRrdU56Z3RNaTR6T0NBd0xUSXVNakV0TVM0M09TMDBMVFF0TkhvaUlITjBjbTlyWlQwaUl6QXdNQ0lnYzNSeWIydGxMWGRwWkhSb1BTSXhMalVpSUhOMGNtOXJaUzFzYVc1bFkyRndQU0p5YjNWdVpDSXZQand2YzNablBnPT0nKTtcbn1cbi5jZy13cmFwIHBpZWNlLmJpc2hvcC5ibGFjayB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwTlNJZ2FHVnBaMmgwUFNJME5TSStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTXdNREFpSUhOMGNtOXJaUzEzYVdSMGFEMGlNUzQxSWlCemRISnZhMlV0YkdsdVpXTmhjRDBpY205MWJtUWlJSE4wY205clpTMXNhVzVsYW05cGJqMGljbTkxYm1RaVBqeG5JR1pwYkd3OUlpTXdNREFpSUhOMGNtOXJaUzFzYVc1bFkyRndQU0ppZFhSMElqNDhjR0YwYUNCa1BTSk5PU0F6Tm1NekxqTTVMUzQ1TnlBeE1DNHhNUzQwTXlBeE15NDFMVElnTXk0ek9TQXlMalF6SURFd0xqRXhJREV1TURNZ01UTXVOU0F5SURBZ01DQXhMalkxTGpVMElETWdNaTB1TmpndU9UY3RNUzQyTlM0NU9TMHpJQzQxTFRNdU16a3RMamszTFRFd0xqRXhMalEyTFRFekxqVXRNUzB6TGpNNUlERXVORFl0TVRBdU1URXVNRE10TVRNdU5TQXhMVEV1TXpVMExqUTVMVEl1TXpJekxqUTNMVE10TGpVZ01TNHpOVFF0TVM0NU5DQXpMVElnTXkweWVpSXZQanh3WVhSb0lHUTlJazB4TlNBek1tTXlMalVnTWk0MUlERXlMalVnTWk0MUlERTFJREFnTGpVdE1TNDFJREF0TWlBd0xUSWdNQzB5TGpVdE1pNDFMVFF0TWk0MUxUUWdOUzQxTFRFdU5TQTJMVEV4TGpVdE5TMHhOUzQxTFRFeElEUXRNVEF1TlNBeE5DMDFJREUxTGpVZ01DQXdMVEl1TlNBeExqVXRNaTQxSURRZ01DQXdMUzQxTGpVZ01DQXllaUl2UGp4d1lYUm9JR1E5SWsweU5TQTRZVEl1TlNBeUxqVWdNQ0F4SURFdE5TQXdJREl1TlNBeUxqVWdNQ0F4SURFZ05TQXdlaUl2UGp3dlp6NDhjR0YwYUNCa1BTSk5NVGN1TlNBeU5tZ3hNRTB4TlNBek1HZ3hOVzB0Tnk0MUxURTBMalYyTlUweU1DQXhPR2cxSWlCemRISnZhMlU5SWlObFkyVmpaV01pSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpYldsMFpYSWlMejQ4TDJjK1BDOXpkbWMrJyk7XG59XG4uY2ctd3JhcCBwaWVjZS5rbmlnaHQuYmxhY2sge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJME5TSWdhR1ZwWjJoMFBTSTBOU0krUEdjZ1ptbHNiRDBpYm05dVpTSWdabWxzYkMxeWRXeGxQU0psZG1WdWIyUmtJaUJ6ZEhKdmEyVTlJaU13TURBaUlITjBjbTlyWlMxM2FXUjBhRDBpTVM0MUlpQnpkSEp2YTJVdGJHbHVaV05oY0QwaWNtOTFibVFpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlQanh3WVhSb0lHUTlJazB5TWlBeE1HTXhNQzQxSURFZ01UWXVOU0E0SURFMklESTVTREUxWXpBdE9TQXhNQzAyTGpVZ09DMHlNU0lnWm1sc2JEMGlJekF3TUNJdlBqeHdZWFJvSUdROUlrMHlOQ0F4T0dNdU16Z2dNaTQ1TVMwMUxqVTFJRGN1TXpjdE9DQTVMVE1nTWkweUxqZ3lJRFF1TXpRdE5TQTBMVEV1TURReUxTNDVOQ0F4TGpReExUTXVNRFFnTUMwekxURWdNQ0F1TVRrZ01TNHlNeTB4SURJdE1TQXdMVFF1TURBeklERXROQzAwSURBdE1pQTJMVEV5SURZdE1USnpNUzQ0T1MweExqa2dNaTB6TGpWakxTNDNNeTB1T1RrMExTNDFMVEl0TGpVdE15QXhMVEVnTXlBeUxqVWdNeUF5TGpWb01uTXVOemd0TVM0NU9USWdNaTQxTFROak1TQXdJREVnTXlBeElETWlJR1pwYkd3OUlpTXdNREFpTHo0OGNHRjBhQ0JrUFNKTk9TNDFJREkxTGpWaExqVXVOU0F3SURFZ01TMHhJREFnTGpVdU5TQXdJREVnTVNBeElEQjZiVFV1TkRNekxUa3VOelZoTGpVZ01TNDFJRE13SURFZ01TMHVPRFkyTFM0MUxqVWdNUzQxSURNd0lERWdNU0F1T0RZMkxqVjZJaUJtYVd4c1BTSWpaV05sWTJWaklpQnpkSEp2YTJVOUlpTmxZMlZqWldNaUx6NDhjR0YwYUNCa1BTSk5NalF1TlRVZ01UQXVOR3d0TGpRMUlERXVORFV1TlM0eE5XTXpMakUxSURFZ05TNDJOU0F5TGpRNUlEY3VPU0EyTGpjMVV6TTFMamMxSURJNUxqQTJJRE0xTGpJMUlETTViQzB1TURVdU5XZ3lMakkxYkM0d05TMHVOV011TlMweE1DNHdOaTB1T0RndE1UWXVPRFV0TXk0eU5TMHlNUzR6TkMweUxqTTNMVFF1TkRrdE5TNDNPUzAyTGpZMExUa3VNVGt0Tnk0eE5td3RMalV4TFM0eGVpSWdabWxzYkQwaUkyVmpaV05sWXlJZ2MzUnliMnRsUFNKdWIyNWxJaTgrUEM5blBqd3ZjM1puUGc9PScpO1xufVxuLmNnLXdyYXAgcGllY2Uucm9vay5ibGFjayB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwTlNJZ2FHVnBaMmgwUFNJME5TSStQR2NnWm1sc2JDMXlkV3hsUFNKbGRtVnViMlJrSWlCemRISnZhMlU5SWlNd01EQWlJSE4wY205clpTMTNhV1IwYUQwaU1TNDFJaUJ6ZEhKdmEyVXRiR2x1WldOaGNEMGljbTkxYm1RaUlITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpUGp4d1lYUm9JR1E5SWswNUlETTVhREkzZGkwelNEbDJNM3B0TXk0MUxUZHNNUzQxTFRJdU5XZ3hOMnd4TGpVZ01pNDFhQzB5TUhwdExTNDFJRFIyTFRSb01qRjJORWd4TW5vaUlITjBjbTlyWlMxc2FXNWxZMkZ3UFNKaWRYUjBJaTgrUEhCaGRHZ2daRDBpVFRFMElESTVMalYyTFRFemFERTNkakV6U0RFMGVpSWdjM1J5YjJ0bExXeHBibVZqWVhBOUltSjFkSFFpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpYldsMFpYSWlMejQ4Y0dGMGFDQmtQU0pOTVRRZ01UWXVOVXd4TVNBeE5HZ3lNMnd0TXlBeUxqVklNVFI2VFRFeElERTBWamxvTkhZeWFEVldPV2cxZGpKb05WWTVhRFIyTlVneE1Yb2lJSE4wY205clpTMXNhVzVsWTJGd1BTSmlkWFIwSWk4K1BIQmhkR2dnWkQwaVRURXlJRE0xTGpWb01qRnRMVEl3TFRSb01UbHRMVEU0TFRKb01UZHRMVEUzTFRFemFERTNUVEV4SURFMGFESXpJaUJtYVd4c1BTSnViMjVsSWlCemRISnZhMlU5SWlObFkyVmpaV01pSUhOMGNtOXJaUzEzYVdSMGFEMGlNU0lnYzNSeWIydGxMV3hwYm1WcWIybHVQU0p0YVhSbGNpSXZQand2Wno0OEwzTjJaejQ9Jyk7XG59XG4uY2ctd3JhcCBwaWVjZS5xdWVlbi5ibGFjayB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwTlNJZ2FHVnBaMmgwUFNJME5TSStQR2NnWm1sc2JDMXlkV3hsUFNKbGRtVnViMlJrSWlCemRISnZhMlU5SWlNd01EQWlJSE4wY205clpTMTNhV1IwYUQwaU1TNDFJaUJ6ZEhKdmEyVXRiR2x1WldOaGNEMGljbTkxYm1RaUlITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpUGp4bklITjBjbTlyWlQwaWJtOXVaU0krUEdOcGNtTnNaU0JqZUQwaU5pSWdZM2s5SWpFeUlpQnlQU0l5TGpjMUlpOCtQR05wY21Oc1pTQmplRDBpTVRRaUlHTjVQU0k1SWlCeVBTSXlMamMxSWk4K1BHTnBjbU5zWlNCamVEMGlNakl1TlNJZ1kzazlJamdpSUhJOUlqSXVOelVpTHo0OFkybHlZMnhsSUdONFBTSXpNU0lnWTNrOUlqa2lJSEk5SWpJdU56VWlMejQ4WTJseVkyeGxJR040UFNJek9TSWdZM2s5SWpFeUlpQnlQU0l5TGpjMUlpOCtQQzluUGp4d1lYUm9JR1E5SWswNUlESTJZemd1TlMweExqVWdNakV0TVM0MUlESTNJREJzTWk0MUxURXlMalZNTXpFZ01qVnNMUzR6TFRFMExqRXROUzR5SURFekxqWXRNeTB4TkM0MUxUTWdNVFF1TlMwMUxqSXRNVE11Tmt3eE5DQXlOU0EyTGpVZ01UTXVOU0E1SURJMmVpSWdjM1J5YjJ0bExXeHBibVZqWVhBOUltSjFkSFFpTHo0OGNHRjBhQ0JrUFNKTk9TQXlObU13SURJZ01TNDFJRElnTWk0MUlEUWdNU0F4TGpVZ01TQXhJQzQxSURNdU5TMHhMalVnTVMweExqVWdNaTQxTFRFdU5TQXlMalV0TVM0MUlERXVOUzQxSURJdU5TNDFJREl1TlNBMkxqVWdNU0F4Tmk0MUlERWdNak1nTUNBd0lEQWdNUzQxTFRFZ01DMHlMalVnTUNBd0lDNDFMVEV1TlMweExUSXVOUzB1TlMweUxqVXRMalV0TWlBdU5TMHpMalVnTVMweUlESXVOUzB5SURJdU5TMDBMVGd1TlMweExqVXRNVGd1TlMweExqVXRNamNnTUhvaUlITjBjbTlyWlMxc2FXNWxZMkZ3UFNKaWRYUjBJaTgrUEhCaGRHZ2daRDBpVFRFeElETTRMalZoTXpVZ016VWdNU0F3SURBZ01qTWdNQ0lnWm1sc2JEMGlibTl1WlNJZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW1KMWRIUWlMejQ4Y0dGMGFDQmtQU0pOTVRFZ01qbGhNelVnTXpVZ01TQXdJREVnTWpNZ01HMHRNakV1TlNBeUxqVm9NakJ0TFRJeElETmhNelVnTXpVZ01TQXdJREFnTWpJZ01HMHRNak1nTTJFek5TQXpOU0F4SURBZ01DQXlOQ0F3SWlCbWFXeHNQU0p1YjI1bElpQnpkSEp2YTJVOUlpTmxZMlZqWldNaUx6NDhMMmMrUEM5emRtYysnKTtcbn1cbi5jZy13cmFwIHBpZWNlLmtpbmcuYmxhY2sge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJME5TSWdhR1ZwWjJoMFBTSTBOU0krUEdjZ1ptbHNiRDBpYm05dVpTSWdabWxzYkMxeWRXeGxQU0psZG1WdWIyUmtJaUJ6ZEhKdmEyVTlJaU13TURBaUlITjBjbTlyWlMxM2FXUjBhRDBpTVM0MUlpQnpkSEp2YTJVdGJHbHVaV05oY0QwaWNtOTFibVFpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlQanh3WVhSb0lHUTlJazB5TWk0MUlERXhMall6VmpZaUlITjBjbTlyWlMxc2FXNWxhbTlwYmowaWJXbDBaWElpTHo0OGNHRjBhQ0JrUFNKTk1qSXVOU0F5TlhNMExqVXROeTQxSURNdE1UQXVOV013SURBdE1TMHlMalV0TXkweUxqVnpMVE1nTWk0MUxUTWdNaTQxWXkweExqVWdNeUF6SURFd0xqVWdNeUF4TUM0MUlpQm1hV3hzUFNJak1EQXdJaUJ6ZEhKdmEyVXRiR2x1WldOaGNEMGlZblYwZENJZ2MzUnliMnRsTFd4cGJtVnFiMmx1UFNKdGFYUmxjaUl2UGp4d1lYUm9JR1E5SWsweE1TNDFJRE0zWXpVdU5TQXpMalVnTVRVdU5TQXpMalVnTWpFZ01IWXROM001TFRRdU5TQTJMVEV3TGpWakxUUXROaTQxTFRFekxqVXRNeTQxTFRFMklEUldNamQyTFRNdU5XTXRNeTQxTFRjdU5TMHhNeTB4TUM0MUxURTJMVFF0TXlBMklEVWdNVEFnTlNBeE1GWXpOM29pSUdacGJHdzlJaU13TURBaUx6NDhjR0YwYUNCa1BTSk5NakFnT0dnMUlpQnpkSEp2YTJVdGJHbHVaV3B2YVc0OUltMXBkR1Z5SWk4K1BIQmhkR2dnWkQwaVRUTXlJREk1TGpWek9DNDFMVFFnTmk0d015MDVMalkxUXpNMExqRTFJREUwSURJMUlERTRJREl5TGpVZ01qUXVOV3d1TURFZ01pNHhMUzR3TVMweUxqRkRNakFnTVRnZ09TNDVNRFlnTVRRZ05pNDVPVGNnTVRrdU9EVmpMVEl1TkRrM0lEVXVOalVnTkM0NE5UTWdPU0EwTGpnMU15QTVJaUJ6ZEhKdmEyVTlJaU5sWTJWalpXTWlMejQ4Y0dGMGFDQmtQU0pOTVRFdU5TQXpNR00xTGpVdE15QXhOUzQxTFRNZ01qRWdNRzB0TWpFZ015NDFZelV1TlMweklERTFMalV0TXlBeU1TQXdiUzB5TVNBekxqVmpOUzQxTFRNZ01UVXVOUzB6SURJeElEQWlJSE4wY205clpUMGlJMlZqWldObFl5SXZQand2Wno0OEwzTjJaejQ9Jyk7XG59XG4iLCAiLmdyZWVuLWJvYXJkIGNnLWJvYXJkIHtcblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lJSE4wWVc1a1lXeHZibVU5SW01dklqOCtDanh6ZG1jZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklnb2dJQ0FnSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpSUhOb1lYQmxMWEpsYm1SbGNtbHVaejBpWTNKcGMzQkZaR2RsY3lJK0NqeG5JR2xrUFNKaElqNEtJQ0E4WnlCcFpEMGlZaUkrQ2lBZ0lDQThaeUJwWkQwaVl5SStDaUFnSUNBZ0lEeG5JR2xrUFNKa0lqNEtJQ0FnSUNBZ0lDQThjbVZqZENCM2FXUjBhRDBpTVNJZ2FHVnBaMmgwUFNJeElpQm1hV3hzUFNJalptWm1abVJrSWlCcFpEMGlaU0l2UGdvZ0lDQWdJQ0FnSUR4MWMyVWdlRDBpTVNJZ2VUMGlNU0lnYUhKbFpqMGlJMlVpSUhnNmFISmxaajBpSTJVaUx6NEtJQ0FnSUNBZ0lDQThjbVZqZENCNVBTSXhJaUIzYVdSMGFEMGlNU0lnYUdWcFoyaDBQU0l4SWlCbWFXeHNQU0lqT0RaaE5qWTJJaUJwWkQwaVppSXZQZ29nSUNBZ0lDQWdJRHgxYzJVZ2VEMGlNU0lnZVQwaUxURWlJR2h5WldZOUlpTm1JaUI0T21oeVpXWTlJaU5tSWk4K0NpQWdJQ0FnSUR3dlp6NEtJQ0FnSUNBZ1BIVnpaU0I0UFNJeUlpQm9jbVZtUFNJalpDSWdlRHBvY21WbVBTSWpaQ0l2UGdvZ0lDQWdQQzluUGdvZ0lDQWdQSFZ6WlNCNFBTSTBJaUJvY21WbVBTSWpZeUlnZURwb2NtVm1QU0lqWXlJdlBnb2dJRHd2Wno0S0lDQThkWE5sSUhrOUlqSWlJR2h5WldZOUlpTmlJaUI0T21oeVpXWTlJaU5pSWk4K0Nqd3ZaejRLUEhWelpTQjVQU0kwSWlCb2NtVm1QU0lqWVNJZ2VEcG9jbVZtUFNJallTSXZQZ284TDNOMlp6NEtcIik7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUE7QUFDRTtBQUNBO0FBQ0E7QUFBQTtBQUdGO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0Y7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHRjtBQUNFO0FBQUE7QUFHRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0Y7QUFDRTtBQUFBO0FBR0Y7QUFDRTtBQUFBO0FBR0Y7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdGO0FBQ0U7QUFFQTtBQUFBO0FBR0Y7QUFDRTtBQUFBO0FBR0Y7QUFDRTtBQUNBO0FBQUE7QUFHRjtBQUNFO0FBQUE7QUFHRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0Y7QUFBQTtBQUFBO0FBR0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdGO0FBQ0U7QUFBQTtBQUdGO0FBQ0U7QUFBQTtBQUdGO0FBQ0U7QUFDQTtBQUNBO0FBQUE7QUFHRjtBQUVFO0FBQUE7QUFHRjtBQUNFO0FBQUE7QUFHRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0Y7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHRjtBQUNFO0FBQUE7QUFHRjtBQUNFO0FBQ0E7QUFBQTtBQUdGO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdGO0FBQ0U7QUFBQTtBQUdGO0FBQ0U7QUFBQTtBQUdGO0FBQ0U7QUFBQTs7O0FDM0tGO0FBQ0U7QUFDQTtBQUFBO0FBSUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBUUY7QUFDRTtBQUFBO0FBSUY7QUFBQTtBQUFBO0FBQUE7QUFJRTtBQUFBO0FBR0Y7QUFBQTtBQUFBO0FBQUE7QUFJRTtBQUFBOzs7QUN2REY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBO0FBRUY7QUFDRTtBQUFBOzs7QUNuQ0Y7QUFDQztBQUFBOyIsCiAgIm5hbWVzIjogW10KfQo= */ +* { + margin: 0; +} +html, +body { + height: 100%; +} +body { + line-height: 1.5; + -webkit-font-smoothing: antialiased; +} +img, +picture, +video, +canvas, +svg { + display: block; + max-width: 100%; +} +input, +button, +textarea, +select { + font: inherit; +} +p, +h1, +h2, +h3, +h4, +h5, +h6 { + overflow-wrap: break-word; +} +#root, +#__next { + isolation: isolate; +} + +/* src/main.css */ +button:active { + transform: translateY(1px); +} +.vertical-align { + display: flex; + align-items: center; +} +.center { + display: flex; + align-items: center; + justify-content: center; +} +.move-item { + padding-left: 8px; + user-select: none; +} +.move-item:hover { + background-color: hsl( + var(--accent-h), + var(--accent-s), + calc(var(--accent-l)) + ); + color: var(--text-on-accent); + cursor: pointer; +} +.move-item.active { + background-color: hsl( + var(--accent-h), + var(--accent-s), + calc(var(--accent-l) - 10%) + ); + color: var(--text-on-accent); + font-weight: bold; +} +.move-indicator { + color: var(--color-base-60); + text-align: center; + background-color: var(--color-base-10); + user-select: none; + cursor: default; +} +/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYXNzZXRzL2JvYXJkL2dyZWVuLmNzcyIsICJub2RlX21vZHVsZXMvY2hlc3Nncm91bmQvYXNzZXRzL2NoZXNzZ3JvdW5kLmJhc2UuY3NzIiwgIm5vZGVfbW9kdWxlcy9jaGVzc2dyb3VuZC9hc3NldHMvY2hlc3Nncm91bmQuYnJvd24uY3NzIiwgIm5vZGVfbW9kdWxlcy9jaGVzc2dyb3VuZC9hc3NldHMvY2hlc3Nncm91bmQuY2J1cm5ldHQuY3NzIiwgInJlc2V0LmNzcyIsICJzcmMvbWFpbi5jc3MiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi5ncmVlbi1ib2FyZCBjZy1ib2FyZCB7XG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaVZWUkdMVGdpSUhOMFlXNWtZV3h2Ym1VOUltNXZJajgrQ2p4emRtY2dlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklpQjRiV3h1Y3pwNFBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJZ29nSUNBZ0lIWnBaWGRDYjNnOUlqQWdNQ0E0SURnaUlITm9ZWEJsTFhKbGJtUmxjbWx1WnowaVkzSnBjM0JGWkdkbGN5SStDanhuSUdsa1BTSmhJajRLSUNBOFp5QnBaRDBpWWlJK0NpQWdJQ0E4WnlCcFpEMGlZeUkrQ2lBZ0lDQWdJRHhuSUdsa1BTSmtJajRLSUNBZ0lDQWdJQ0E4Y21WamRDQjNhV1IwYUQwaU1TSWdhR1ZwWjJoMFBTSXhJaUJtYVd4c1BTSWpabVptWm1Sa0lpQnBaRDBpWlNJdlBnb2dJQ0FnSUNBZ0lEeDFjMlVnZUQwaU1TSWdlVDBpTVNJZ2FISmxaajBpSTJVaUlIZzZhSEpsWmowaUkyVWlMejRLSUNBZ0lDQWdJQ0E4Y21WamRDQjVQU0l4SWlCM2FXUjBhRDBpTVNJZ2FHVnBaMmgwUFNJeElpQm1hV3hzUFNJak9EWmhOalkySWlCcFpEMGlaaUl2UGdvZ0lDQWdJQ0FnSUR4MWMyVWdlRDBpTVNJZ2VUMGlMVEVpSUdoeVpXWTlJaU5tSWlCNE9taHlaV1k5SWlObUlpOCtDaUFnSUNBZ0lEd3ZaejRLSUNBZ0lDQWdQSFZ6WlNCNFBTSXlJaUJvY21WbVBTSWpaQ0lnZURwb2NtVm1QU0lqWkNJdlBnb2dJQ0FnUEM5blBnb2dJQ0FnUEhWelpTQjRQU0kwSWlCb2NtVm1QU0lqWXlJZ2VEcG9jbVZtUFNJall5SXZQZ29nSUR3dlp6NEtJQ0E4ZFhObElIazlJaklpSUdoeVpXWTlJaU5pSWlCNE9taHlaV1k5SWlOaUlpOCtDand2Wno0S1BIVnpaU0I1UFNJMElpQm9jbVZtUFNJallTSWdlRHBvY21WbVBTSWpZU0l2UGdvOEwzTjJaejRLXCIpO1xufVxuIiwgIi5jZy13cmFwIHtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbmNnLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHRvcDogMDtcbn1cblxuY2ctYm9hcmQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XG59XG5cbi5jZy13cmFwLm1hbmlwdWxhYmxlIGNnLWJvYXJkIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5jZy1ib2FyZCBzcXVhcmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEyLjUlO1xuICBoZWlnaHQ6IDEyLjUlO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuY2ctYm9hcmQgc3F1YXJlLm1vdmUtZGVzdCB7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuXG5jZy1ib2FyZCBzcXVhcmUubGFzdC1tb3ZlIHtcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcbn1cblxuLmNnLXdyYXAgcGllY2Uge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEyLjUlO1xuICBoZWlnaHQ6IDEyLjUlO1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuICB6LWluZGV4OiAyO1xuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuY2ctYm9hcmQgcGllY2UuZHJhZ2dpbmcge1xuICBjdXJzb3I6IG1vdmU7XG4gIC8qICFpbXBvcnRhbnQgdG8gb3ZlcnJpZGUgei1pbmRleCBmcm9tIDNEIHBpZWNlIGlubGluZSBzdHlsZSAqL1xuICB6LWluZGV4OiAxMSAhaW1wb3J0YW50O1xufVxuXG5waWVjZS5hbmltIHtcbiAgei1pbmRleDogODtcbn1cblxucGllY2UuZmFkaW5nIHtcbiAgei1pbmRleDogMTtcbiAgb3BhY2l0eTogMC41O1xufVxuXG4uY2ctd3JhcCBwaWVjZS5naG9zdCB7XG4gIG9wYWNpdHk6IDAuMztcbn1cblxuLmNnLXdyYXAgcGllY2Ugc3ZnIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IDBweDtcbiAgbGVmdDogMHB4O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgei1pbmRleDogMjtcbiAgb3BhY2l0eTogMC42O1xufVxuXG4uY2ctd3JhcCBjZy1hdXRvLXBpZWNlcyxcbi5jZy13cmFwIC5jZy1zaGFwZXMsXG4uY2ctd3JhcCAuY2ctY3VzdG9tLXN2Z3Mge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDBweDtcbiAgbGVmdDogMHB4O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmNnLXdyYXAgY2ctYXV0by1waWVjZXMge1xuICB6LWluZGV4OiAyO1xufVxuXG4uY2ctd3JhcCBjZy1hdXRvLXBpZWNlcyBwaWVjZSB7XG4gIG9wYWNpdHk6IDAuMztcbn1cblxuLmNnLXdyYXAgLmNnLXNoYXBlcyB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIG9wYWNpdHk6IDAuNjtcbiAgei1pbmRleDogMjtcbn1cblxuLmNnLXdyYXAgLmNnLWN1c3RvbS1zdmdzIHtcbiAgLyogb3ZlciBwaWVjZS5hbmltID0gOCwgYnV0IHVuZGVyIHBpZWNlLmRyYWdnaW5nID0gMTEgKi9cbiAgei1pbmRleDogOTtcbn1cblxuLmNnLXdyYXAgLmNnLWN1c3RvbS1zdmdzIHN2ZyB7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuXG4uY2ctd3JhcCBjb29yZHMge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBvcGFjaXR5OiAwLjg7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDlweDtcbn1cblxuLmNnLXdyYXAgY29vcmRzLnJhbmtzIHtcbiAgbGVmdDogNHB4O1xuICB0b3A6IC0yMHB4O1xuICBmbGV4LWZsb3c6IGNvbHVtbi1yZXZlcnNlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAxMnB4O1xufVxuXG4uY2ctd3JhcCBjb29yZHMucmFua3MuYmxhY2sge1xuICBmbGV4LWZsb3c6IGNvbHVtbjtcbn1cblxuLmNnLXdyYXAgY29vcmRzLnJhbmtzLmxlZnQge1xuICBsZWZ0OiAtMTVweDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xufVxuXG4uY2ctd3JhcCBjb29yZHMuZmlsZXMge1xuICBib3R0b206IC00cHg7XG4gIGxlZnQ6IDI0cHg7XG4gIGZsZXgtZmxvdzogcm93O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxNnB4O1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5jZy13cmFwIGNvb3Jkcy5maWxlcy5ibGFjayB7XG4gIGZsZXgtZmxvdzogcm93LXJldmVyc2U7XG59XG5cbi5jZy13cmFwIGNvb3JkcyBjb29yZCB7XG4gIGZsZXg6IDEgMSBhdXRvO1xufVxuXG4uY2ctd3JhcCBjb29yZHMucmFua3MgY29vcmQge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMzklKTtcbn1cbiIsICIvKiogQ29sb3JlZCBib2FyZCBzcXVhcmVzIGFzIGFuIGVtYmVkZGVkIFNWRyAqL1xuY2ctYm9hcmQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBkOWI1O1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaVZWUkdMVGdpSUhOMFlXNWtZV3h2Ym1VOUltNXZJajgrQ2p4emRtY2dlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklpQjRiV3h1Y3pwNFBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJZ29nSUNBZ0lIWnBaWGRDYjNnOUlqQWdNQ0E0SURnaUlITm9ZWEJsTFhKbGJtUmxjbWx1WnowaVkzSnBjM0JGWkdkbGN5SStDanhuSUdsa1BTSmhJajRLSUNBOFp5QnBaRDBpWWlJK0NpQWdJQ0E4WnlCcFpEMGlZeUkrQ2lBZ0lDQWdJRHhuSUdsa1BTSmtJajRLSUNBZ0lDQWdJQ0E4Y21WamRDQjNhV1IwYUQwaU1TSWdhR1ZwWjJoMFBTSXhJaUJwWkQwaVpTSWdiM0JoWTJsMGVUMGlNQ0l2UGdvZ0lDQWdJQ0FnSUR4MWMyVWdlRDBpTVNJZ2VUMGlNU0lnYUhKbFpqMGlJMlVpSUhnNmFISmxaajBpSTJVaUx6NEtJQ0FnSUNBZ0lDQThjbVZqZENCNVBTSXhJaUIzYVdSMGFEMGlNU0lnYUdWcFoyaDBQU0l4SWlCcFpEMGlaaUlnYjNCaFkybDBlVDBpTUM0eUlpOCtDaUFnSUNBZ0lDQWdQSFZ6WlNCNFBTSXhJaUI1UFNJdE1TSWdhSEpsWmowaUkyWWlJSGc2YUhKbFpqMGlJMllpTHo0S0lDQWdJQ0FnUEM5blBnb2dJQ0FnSUNBOGRYTmxJSGc5SWpJaUlHaHlaV1k5SWlOa0lpQjRPbWh5WldZOUlpTmtJaTgrQ2lBZ0lDQThMMmMrQ2lBZ0lDQThkWE5sSUhnOUlqUWlJR2h5WldZOUlpTmpJaUI0T21oeVpXWTlJaU5qSWk4K0NpQWdQQzluUGdvZ0lEeDFjMlVnZVQwaU1pSWdhSEpsWmowaUkySWlJSGc2YUhKbFpqMGlJMklpTHo0S1BDOW5QZ284ZFhObElIazlJalFpSUdoeVpXWTlJaU5oSWlCNE9taHlaV1k5SWlOaElpOCtDand2YzNablBnPT0nKTtcbn1cblxuLyoqIEludGVyYWN0aXZlIGJvYXJkIHNxdWFyZSBjb2xvcnMgKi9cbmNnLWJvYXJkIHNxdWFyZS5tb3ZlLWRlc3Qge1xuICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQocmdiYSgyMCwgODUsIDMwLCAwLjUpIDIyJSwgIzIwODUzMCAwLCByZ2JhKDAsIDAsIDAsIDAuMykgMCwgcmdiYSgwLCAwLCAwLCAwKSAwKTtcbn1cbmNnLWJvYXJkIHNxdWFyZS5wcmVtb3ZlLWRlc3Qge1xuICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQocmdiYSgyMCwgMzAsIDg1LCAwLjUpIDIyJSwgIzIwMzA4NSAwLCByZ2JhKDAsIDAsIDAsIDAuMykgMCwgcmdiYSgwLCAwLCAwLCAwKSAwKTtcbn1cbmNnLWJvYXJkIHNxdWFyZS5vYy5tb3ZlLWRlc3Qge1xuICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQodHJhbnNwYXJlbnQgMCUsIHRyYW5zcGFyZW50IDgwJSwgcmdiYSgyMCwgODUsIDAsIDAuMykgODAlKTtcbn1cbmNnLWJvYXJkIHNxdWFyZS5vYy5wcmVtb3ZlLWRlc3Qge1xuICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQodHJhbnNwYXJlbnQgMCUsIHRyYW5zcGFyZW50IDgwJSwgcmdiYSgyMCwgMzAsIDg1LCAwLjIpIDgwJSk7XG59XG5jZy1ib2FyZCBzcXVhcmUubW92ZS1kZXN0OmhvdmVyIHtcbiAgYmFja2dyb3VuZDogcmdiYSgyMCwgODUsIDMwLCAwLjMpO1xufVxuY2ctYm9hcmQgc3F1YXJlLnByZW1vdmUtZGVzdDpob3ZlciB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjAsIDMwLCA4NSwgMC4yKTtcbn1cbmNnLWJvYXJkIHNxdWFyZS5sYXN0LW1vdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE1NSwgMTk5LCAwLCAwLjQxKTtcbn1cbmNnLWJvYXJkIHNxdWFyZS5zZWxlY3RlZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjAsIDg1LCAzMCwgMC41KTtcbn1cbmNnLWJvYXJkIHNxdWFyZS5jaGVjayB7XG4gIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudChcbiAgICBlbGxpcHNlIGF0IGNlbnRlcixcbiAgICByZ2JhKDI1NSwgMCwgMCwgMSkgMCUsXG4gICAgcmdiYSgyMzEsIDAsIDAsIDEpIDI1JSxcbiAgICByZ2JhKDE2OSwgMCwgMCwgMCkgODklLFxuICAgIHJnYmEoMTU4LCAwLCAwLCAwKSAxMDAlXG4gICk7XG59XG5jZy1ib2FyZCBzcXVhcmUuY3VycmVudC1wcmVtb3ZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMCwgMzAsIDg1LCAwLjUpO1xufVxuXG4vKiogQWx0ZXJuYXRpbmcgY29sb3JzIGluIHJhbmsvZmlsZSBsYWJlbHMgKi9cbi5jZy13cmFwLm9yaWVudGF0aW9uLXdoaXRlIGNvb3Jkcy5yYW5rcyBjb29yZDpudGgtY2hpbGQoMm4pLFxuLmNnLXdyYXAub3JpZW50YXRpb24td2hpdGUgY29vcmRzLmZpbGVzIGNvb3JkOm50aC1jaGlsZCgybiksXG4uY2ctd3JhcC5vcmllbnRhdGlvbi1ibGFjayBjb29yZHMucmFua3MgY29vcmQ6bnRoLWNoaWxkKDJuICsgMSksXG4uY2ctd3JhcC5vcmllbnRhdGlvbi1ibGFjayBjb29yZHMuZmlsZXMgY29vcmQ6bnRoLWNoaWxkKDJuICsgMSkge1xuICBjb2xvcjogcmdiYSg3MiwgNzIsIDcyLCAwLjgpO1xufVxuXG4uY2ctd3JhcC5vcmllbnRhdGlvbi1ibGFjayBjb29yZHMucmFua3MgY29vcmQ6bnRoLWNoaWxkKDJuKSxcbi5jZy13cmFwLm9yaWVudGF0aW9uLWJsYWNrIGNvb3Jkcy5maWxlcyBjb29yZDpudGgtY2hpbGQoMm4pLFxuLmNnLXdyYXAub3JpZW50YXRpb24td2hpdGUgY29vcmRzLnJhbmtzIGNvb3JkOm50aC1jaGlsZCgybiArIDEpLFxuLmNnLXdyYXAub3JpZW50YXRpb24td2hpdGUgY29vcmRzLmZpbGVzIGNvb3JkOm50aC1jaGlsZCgybiArIDEpIHtcbiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTtcbn1cbiIsICIvKiogRW1iZWRkZWQgU1ZHcyBmb3IgYWxsIGNoZXNzIHBpZWNlcyAqL1xuLmNnLXdyYXAgcGllY2UucGF3bi53aGl0ZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwTlNJZ2FHVnBaMmgwUFNJME5TSStQSEJoZEdnZ1pEMGlUVEl5TGpVZ09XTXRNaTR5TVNBd0xUUWdNUzQzT1MwMElEUWdNQ0F1T0RrdU1qa2dNUzQzTVM0M09DQXlMak00UXpFM0xqTXpJREUyTGpVZ01UWWdNVGd1TlRrZ01UWWdNakZqTUNBeUxqQXpMamswSURNdU9EUWdNaTQwTVNBMUxqQXpMVE1nTVM0d05pMDNMalF4SURVdU5UVXROeTQwTVNBeE15NDBOMmd5TTJNd0xUY3VPVEl0TkM0ME1TMHhNaTQwTVMwM0xqUXhMVEV6TGpRM0lERXVORGN0TVM0eE9TQXlMalF4TFRNZ01pNDBNUzAxTGpBeklEQXRNaTQwTVMweExqTXpMVFF1TlMwekxqSTRMVFV1TmpJdU5Ea3RMalkzTGpjNExURXVORGt1TnpndE1pNHpPQ0F3TFRJdU1qRXRNUzQzT1MwMExUUXROSG9pSUdacGJHdzlJaU5tWm1ZaUlITjBjbTlyWlQwaUl6QXdNQ0lnYzNSeWIydGxMWGRwWkhSb1BTSXhMalVpSUhOMGNtOXJaUzFzYVc1bFkyRndQU0p5YjNWdVpDSXZQand2YzNablBnPT0nKTtcbn1cbi5jZy13cmFwIHBpZWNlLmJpc2hvcC53aGl0ZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwTlNJZ2FHVnBaMmgwUFNJME5TSStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTXdNREFpSUhOMGNtOXJaUzEzYVdSMGFEMGlNUzQxSWlCemRISnZhMlV0YkdsdVpXTmhjRDBpY205MWJtUWlJSE4wY205clpTMXNhVzVsYW05cGJqMGljbTkxYm1RaVBqeG5JR1pwYkd3OUlpTm1abVlpSUhOMGNtOXJaUzFzYVc1bFkyRndQU0ppZFhSMElqNDhjR0YwYUNCa1BTSk5PU0F6Tm1NekxqTTVMUzQ1TnlBeE1DNHhNUzQwTXlBeE15NDFMVElnTXk0ek9TQXlMalF6SURFd0xqRXhJREV1TURNZ01UTXVOU0F5SURBZ01DQXhMalkxTGpVMElETWdNaTB1TmpndU9UY3RNUzQyTlM0NU9TMHpJQzQxTFRNdU16a3RMamszTFRFd0xqRXhMalEyTFRFekxqVXRNUzB6TGpNNUlERXVORFl0TVRBdU1URXVNRE10TVRNdU5TQXhMVEV1TXpVMExqUTVMVEl1TXpJekxqUTNMVE10TGpVZ01TNHpOVFF0TVM0NU5DQXpMVElnTXkweWVpSXZQanh3WVhSb0lHUTlJazB4TlNBek1tTXlMalVnTWk0MUlERXlMalVnTWk0MUlERTFJREFnTGpVdE1TNDFJREF0TWlBd0xUSWdNQzB5TGpVdE1pNDFMVFF0TWk0MUxUUWdOUzQxTFRFdU5TQTJMVEV4TGpVdE5TMHhOUzQxTFRFeElEUXRNVEF1TlNBeE5DMDFJREUxTGpVZ01DQXdMVEl1TlNBeExqVXRNaTQxSURRZ01DQXdMUzQxTGpVZ01DQXllaUl2UGp4d1lYUm9JR1E5SWsweU5TQTRZVEl1TlNBeUxqVWdNQ0F4SURFdE5TQXdJREl1TlNBeUxqVWdNQ0F4SURFZ05TQXdlaUl2UGp3dlp6NDhjR0YwYUNCa1BTSk5NVGN1TlNBeU5tZ3hNRTB4TlNBek1HZ3hOVzB0Tnk0MUxURTBMalYyTlUweU1DQXhPR2cxSWlCemRISnZhMlV0YkdsdVpXcHZhVzQ5SW0xcGRHVnlJaTgrUEM5blBqd3ZjM1puUGc9PScpO1xufVxuLmNnLXdyYXAgcGllY2Uua25pZ2h0LndoaXRlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTBOU0lnYUdWcFoyaDBQU0kwTlNJK1BHY2dabWxzYkQwaWJtOXVaU0lnWm1sc2JDMXlkV3hsUFNKbGRtVnViMlJrSWlCemRISnZhMlU5SWlNd01EQWlJSE4wY205clpTMTNhV1IwYUQwaU1TNDFJaUJ6ZEhKdmEyVXRiR2x1WldOaGNEMGljbTkxYm1RaUlITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpUGp4d1lYUm9JR1E5SWsweU1pQXhNR014TUM0MUlERWdNVFl1TlNBNElERTJJREk1U0RFMVl6QXRPU0F4TUMwMkxqVWdPQzB5TVNJZ1ptbHNiRDBpSTJabVppSXZQanh3WVhSb0lHUTlJazB5TkNBeE9HTXVNemdnTWk0NU1TMDFMalUxSURjdU16Y3RPQ0E1TFRNZ01pMHlMamd5SURRdU16UXROU0EwTFRFdU1EUXlMUzQ1TkNBeExqUXhMVE11TURRZ01DMHpMVEVnTUNBdU1Ua2dNUzR5TXkweElESXRNU0F3TFRRdU1EQXpJREV0TkMwMElEQXRNaUEyTFRFeUlEWXRNVEp6TVM0NE9TMHhMamtnTWkwekxqVmpMUzQzTXkwdU9UazBMUzQxTFRJdExqVXRNeUF4TFRFZ015QXlMalVnTXlBeUxqVm9Nbk11TnpndE1TNDVPVElnTWk0MUxUTmpNU0F3SURFZ015QXhJRE1pSUdacGJHdzlJaU5tWm1ZaUx6NDhjR0YwYUNCa1BTSk5PUzQxSURJMUxqVmhMalV1TlNBd0lERWdNUzB4SURBZ0xqVXVOU0F3SURFZ01TQXhJREI2YlRVdU5ETXpMVGt1TnpWaExqVWdNUzQxSURNd0lERWdNUzB1T0RZMkxTNDFMalVnTVM0MUlETXdJREVnTVNBdU9EWTJMalY2SWlCbWFXeHNQU0lqTURBd0lpOCtQQzluUGp3dmMzWm5QZz09Jyk7XG59XG4uY2ctd3JhcCBwaWVjZS5yb29rLndoaXRlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTBOU0lnYUdWcFoyaDBQU0kwTlNJK1BHY2dabWxzYkQwaUkyWm1aaUlnWm1sc2JDMXlkV3hsUFNKbGRtVnViMlJrSWlCemRISnZhMlU5SWlNd01EQWlJSE4wY205clpTMTNhV1IwYUQwaU1TNDFJaUJ6ZEhKdmEyVXRiR2x1WldOaGNEMGljbTkxYm1RaUlITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpUGp4d1lYUm9JR1E5SWswNUlETTVhREkzZGkwelNEbDJNM3B0TXkwemRpMDBhREl4ZGpSSU1USjZiUzB4TFRJeVZqbG9OSFl5YURWV09XZzFkakpvTlZZNWFEUjJOU0lnYzNSeWIydGxMV3hwYm1WallYQTlJbUoxZEhRaUx6NDhjR0YwYUNCa1BTSk5NelFnTVRSc0xUTWdNMGd4Tkd3dE15MHpJaTgrUEhCaGRHZ2daRDBpVFRNeElERTNkakV5TGpWSU1UUldNVGNpSUhOMGNtOXJaUzFzYVc1bFkyRndQU0ppZFhSMElpQnpkSEp2YTJVdGJHbHVaV3B2YVc0OUltMXBkR1Z5SWk4K1BIQmhkR2dnWkQwaVRUTXhJREk1TGpWc01TNDFJREl1TldndE1qQnNNUzQxTFRJdU5TSXZQanh3WVhSb0lHUTlJazB4TVNBeE5HZ3lNeUlnWm1sc2JEMGlibTl1WlNJZ2MzUnliMnRsTFd4cGJtVnFiMmx1UFNKdGFYUmxjaUl2UGp3dlp6NDhMM04yWno0PScpO1xufVxuLmNnLXdyYXAgcGllY2UucXVlZW4ud2hpdGUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJME5TSWdhR1ZwWjJoMFBTSTBOU0krUEdjZ1ptbHNiRDBpSTJabVppSWdabWxzYkMxeWRXeGxQU0psZG1WdWIyUmtJaUJ6ZEhKdmEyVTlJaU13TURBaUlITjBjbTlyWlMxM2FXUjBhRDBpTVM0MUlpQnpkSEp2YTJVdGJHbHVaV05oY0QwaWNtOTFibVFpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlQanh3WVhSb0lHUTlJazA0SURFeVlUSWdNaUF3SURFZ01TMDBJREFnTWlBeUlEQWdNU0F4SURRZ01IcHRNVFl1TlMwMExqVmhNaUF5SURBZ01TQXhMVFFnTUNBeUlESWdNQ0F4SURFZ05DQXdlazAwTVNBeE1tRXlJRElnTUNBeElERXROQ0F3SURJZ01pQXdJREVnTVNBMElEQjZUVEUySURndU5XRXlJRElnTUNBeElERXROQ0F3SURJZ01pQXdJREVnTVNBMElEQjZUVE16SURsaE1pQXlJREFnTVNBeExUUWdNQ0F5SURJZ01DQXhJREVnTkNBd2VpSXZQanh3WVhSb0lHUTlJazA1SURJMll6Z3VOUzB4TGpVZ01qRXRNUzQxSURJM0lEQnNNaTB4TWkwM0lERXhWakV4YkMwMUxqVWdNVE11TlMwekxURTFMVE1nTVRVdE5TNDFMVEUwVmpJMVREY2dNVFJzTWlBeE1ub2lJSE4wY205clpTMXNhVzVsWTJGd1BTSmlkWFIwSWk4K1BIQmhkR2dnWkQwaVRUa2dNalpqTUNBeUlERXVOU0F5SURJdU5TQTBJREVnTVM0MUlERWdNU0F1TlNBekxqVXRNUzQxSURFdE1TNDFJREl1TlMweExqVWdNaTQxTFRFdU5TQXhMalV1TlNBeUxqVXVOU0F5TGpVZ05pNDFJREVnTVRZdU5TQXhJREl6SURBZ01DQXdJREV1TlMweElEQXRNaTQxSURBZ01DQXVOUzB4TGpVdE1TMHlMalV0TGpVdE1pNDFMUzQxTFRJZ0xqVXRNeTQxSURFdE1pQXlMalV0TWlBeUxqVXROQzA0TGpVdE1TNDFMVEU0TGpVdE1TNDFMVEkzSURCNklpQnpkSEp2YTJVdGJHbHVaV05oY0QwaVluVjBkQ0l2UGp4d1lYUm9JR1E5SWsweE1TNDFJRE13WXpNdU5TMHhJREU0TGpVdE1TQXlNaUF3VFRFeUlETXpMalZqTmkweElERTFMVEVnTWpFZ01DSWdabWxzYkQwaWJtOXVaU0l2UGp3dlp6NDhMM04yWno0PScpO1xufVxuLmNnLXdyYXAgcGllY2Uua2luZy53aGl0ZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwTlNJZ2FHVnBaMmgwUFNJME5TSStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTXdNREFpSUhOMGNtOXJaUzEzYVdSMGFEMGlNUzQxSWlCemRISnZhMlV0YkdsdVpXTmhjRDBpY205MWJtUWlJSE4wY205clpTMXNhVzVsYW05cGJqMGljbTkxYm1RaVBqeHdZWFJvSUdROUlrMHlNaTQxSURFeExqWXpWalpOTWpBZ09HZzFJaUJ6ZEhKdmEyVXRiR2x1WldwdmFXNDlJbTFwZEdWeUlpOCtQSEJoZEdnZ1pEMGlUVEl5TGpVZ01qVnpOQzQxTFRjdU5TQXpMVEV3TGpWak1DQXdMVEV0TWk0MUxUTXRNaTQxY3kweklESXVOUzB6SURJdU5XTXRNUzQxSURNZ015QXhNQzQxSURNZ01UQXVOU0lnWm1sc2JEMGlJMlptWmlJZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW1KMWRIUWlJSE4wY205clpTMXNhVzVsYW05cGJqMGliV2wwWlhJaUx6NDhjR0YwYUNCa1BTSk5NVEV1TlNBek4yTTFMalVnTXk0MUlERTFMalVnTXk0MUlESXhJREIyTFRkek9TMDBMalVnTmkweE1DNDFZeTAwTFRZdU5TMHhNeTQxTFRNdU5TMHhOaUEwVmpJM2RpMHpMalZqTFRNdU5TMDNMalV0TVRNdE1UQXVOUzB4TmkwMExUTWdOaUExSURFd0lEVWdNVEJXTXpkNklpQm1hV3hzUFNJalptWm1JaTgrUEhCaGRHZ2daRDBpVFRFeExqVWdNekJqTlM0MUxUTWdNVFV1TlMweklESXhJREJ0TFRJeElETXVOV00xTGpVdE15QXhOUzQxTFRNZ01qRWdNRzB0TWpFZ015NDFZelV1TlMweklERTFMalV0TXlBeU1TQXdJaTgrUEM5blBqd3ZjM1puUGc9PScpO1xufVxuLmNnLXdyYXAgcGllY2UucGF3bi5ibGFjayB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwTlNJZ2FHVnBaMmgwUFNJME5TSStQSEJoZEdnZ1pEMGlUVEl5TGpVZ09XTXRNaTR5TVNBd0xUUWdNUzQzT1MwMElEUWdNQ0F1T0RrdU1qa2dNUzQzTVM0M09DQXlMak00UXpFM0xqTXpJREUyTGpVZ01UWWdNVGd1TlRrZ01UWWdNakZqTUNBeUxqQXpMamswSURNdU9EUWdNaTQwTVNBMUxqQXpMVE1nTVM0d05pMDNMalF4SURVdU5UVXROeTQwTVNBeE15NDBOMmd5TTJNd0xUY3VPVEl0TkM0ME1TMHhNaTQwTVMwM0xqUXhMVEV6TGpRM0lERXVORGN0TVM0eE9TQXlMalF4TFRNZ01pNDBNUzAxTGpBeklEQXRNaTQwTVMweExqTXpMVFF1TlMwekxqSTRMVFV1TmpJdU5Ea3RMalkzTGpjNExURXVORGt1TnpndE1pNHpPQ0F3TFRJdU1qRXRNUzQzT1MwMExUUXROSG9pSUhOMGNtOXJaVDBpSXpBd01DSWdjM1J5YjJ0bExYZHBaSFJvUFNJeExqVWlJSE4wY205clpTMXNhVzVsWTJGd1BTSnliM1Z1WkNJdlBqd3ZjM1puUGc9PScpO1xufVxuLmNnLXdyYXAgcGllY2UuYmlzaG9wLmJsYWNrIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTBOU0lnYUdWcFoyaDBQU0kwTlNJK1BHY2dabWxzYkQwaWJtOXVaU0lnWm1sc2JDMXlkV3hsUFNKbGRtVnViMlJrSWlCemRISnZhMlU5SWlNd01EQWlJSE4wY205clpTMTNhV1IwYUQwaU1TNDFJaUJ6ZEhKdmEyVXRiR2x1WldOaGNEMGljbTkxYm1RaUlITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpUGp4bklHWnBiR3c5SWlNd01EQWlJSE4wY205clpTMXNhVzVsWTJGd1BTSmlkWFIwSWo0OGNHRjBhQ0JrUFNKTk9TQXpObU16TGpNNUxTNDVOeUF4TUM0eE1TNDBNeUF4TXk0MUxUSWdNeTR6T1NBeUxqUXpJREV3TGpFeElERXVNRE1nTVRNdU5TQXlJREFnTUNBeExqWTFMalUwSURNZ01pMHVOamd1T1RjdE1TNDJOUzQ1T1MweklDNDFMVE11TXprdExqazNMVEV3TGpFeExqUTJMVEV6TGpVdE1TMHpMak01SURFdU5EWXRNVEF1TVRFdU1ETXRNVE11TlNBeExURXVNelUwTGpRNUxUSXVNekl6TGpRM0xUTXRMalVnTVM0ek5UUXRNUzQ1TkNBekxUSWdNeTB5ZWlJdlBqeHdZWFJvSUdROUlrMHhOU0F6TW1NeUxqVWdNaTQxSURFeUxqVWdNaTQxSURFMUlEQWdMalV0TVM0MUlEQXRNaUF3TFRJZ01DMHlMalV0TWk0MUxUUXRNaTQxTFRRZ05TNDFMVEV1TlNBMkxURXhMalV0TlMweE5TNDFMVEV4SURRdE1UQXVOU0F4TkMwMUlERTFMalVnTUNBd0xUSXVOU0F4TGpVdE1pNDFJRFFnTUNBd0xTNDFMalVnTUNBeWVpSXZQanh3WVhSb0lHUTlJazB5TlNBNFlUSXVOU0F5TGpVZ01DQXhJREV0TlNBd0lESXVOU0F5TGpVZ01DQXhJREVnTlNBd2VpSXZQand2Wno0OGNHRjBhQ0JrUFNKTk1UY3VOU0F5Tm1neE1FMHhOU0F6TUdneE5XMHROeTQxTFRFMExqVjJOVTB5TUNBeE9HZzFJaUJ6ZEhKdmEyVTlJaU5sWTJWalpXTWlJSE4wY205clpTMXNhVzVsYW05cGJqMGliV2wwWlhJaUx6NDhMMmMrUEM5emRtYysnKTtcbn1cbi5jZy13cmFwIHBpZWNlLmtuaWdodC5ibGFjayB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwTlNJZ2FHVnBaMmgwUFNJME5TSStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTXdNREFpSUhOMGNtOXJaUzEzYVdSMGFEMGlNUzQxSWlCemRISnZhMlV0YkdsdVpXTmhjRDBpY205MWJtUWlJSE4wY205clpTMXNhVzVsYW05cGJqMGljbTkxYm1RaVBqeHdZWFJvSUdROUlrMHlNaUF4TUdNeE1DNDFJREVnTVRZdU5TQTRJREUySURJNVNERTFZekF0T1NBeE1DMDJMalVnT0MweU1TSWdabWxzYkQwaUl6QXdNQ0l2UGp4d1lYUm9JR1E5SWsweU5DQXhPR011TXpnZ01pNDVNUzAxTGpVMUlEY3VNemN0T0NBNUxUTWdNaTB5TGpneUlEUXVNelF0TlNBMExURXVNRFF5TFM0NU5DQXhMalF4TFRNdU1EUWdNQzB6TFRFZ01DQXVNVGtnTVM0eU15MHhJREl0TVNBd0xUUXVNREF6SURFdE5DMDBJREF0TWlBMkxURXlJRFl0TVRKek1TNDRPUzB4TGprZ01pMHpMalZqTFM0M015MHVPVGswTFM0MUxUSXRMalV0TXlBeExURWdNeUF5TGpVZ015QXlMalZvTW5NdU56Z3RNUzQ1T1RJZ01pNDFMVE5qTVNBd0lERWdNeUF4SURNaUlHWnBiR3c5SWlNd01EQWlMejQ4Y0dGMGFDQmtQU0pOT1M0MUlESTFMalZoTGpVdU5TQXdJREVnTVMweElEQWdMalV1TlNBd0lERWdNU0F4SURCNmJUVXVORE16TFRrdU56VmhMalVnTVM0MUlETXdJREVnTVMwdU9EWTJMUzQxTGpVZ01TNDFJRE13SURFZ01TQXVPRFkyTGpWNklpQm1hV3hzUFNJalpXTmxZMlZqSWlCemRISnZhMlU5SWlObFkyVmpaV01pTHo0OGNHRjBhQ0JrUFNKTk1qUXVOVFVnTVRBdU5Hd3RMalExSURFdU5EVXVOUzR4TldNekxqRTFJREVnTlM0Mk5TQXlMalE1SURjdU9TQTJMamMxVXpNMUxqYzFJREk1TGpBMklETTFMakkxSURNNWJDMHVNRFV1TldneUxqSTFiQzR3TlMwdU5XTXVOUzB4TUM0d05pMHVPRGd0TVRZdU9EVXRNeTR5TlMweU1TNHpOQzB5TGpNM0xUUXVORGt0TlM0M09TMDJMalkwTFRrdU1Ua3ROeTR4Tm13dExqVXhMUzR4ZWlJZ1ptbHNiRDBpSTJWalpXTmxZeUlnYzNSeWIydGxQU0p1YjI1bElpOCtQQzluUGp3dmMzWm5QZz09Jyk7XG59XG4uY2ctd3JhcCBwaWVjZS5yb29rLmJsYWNrIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTBOU0lnYUdWcFoyaDBQU0kwTlNJK1BHY2dabWxzYkMxeWRXeGxQU0psZG1WdWIyUmtJaUJ6ZEhKdmEyVTlJaU13TURBaUlITjBjbTlyWlMxM2FXUjBhRDBpTVM0MUlpQnpkSEp2YTJVdGJHbHVaV05oY0QwaWNtOTFibVFpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlQanh3WVhSb0lHUTlJazA1SURNNWFESTNkaTB6U0RsMk0zcHRNeTQxTFRkc01TNDFMVEl1TldneE4yd3hMalVnTWk0MWFDMHlNSHB0TFM0MUlEUjJMVFJvTWpGMk5FZ3hNbm9pSUhOMGNtOXJaUzFzYVc1bFkyRndQU0ppZFhSMElpOCtQSEJoZEdnZ1pEMGlUVEUwSURJNUxqVjJMVEV6YURFM2RqRXpTREUwZWlJZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW1KMWRIUWlJSE4wY205clpTMXNhVzVsYW05cGJqMGliV2wwWlhJaUx6NDhjR0YwYUNCa1BTSk5NVFFnTVRZdU5Vd3hNU0F4TkdneU0yd3RNeUF5TGpWSU1UUjZUVEV4SURFMFZqbG9OSFl5YURWV09XZzFkakpvTlZZNWFEUjJOVWd4TVhvaUlITjBjbTlyWlMxc2FXNWxZMkZ3UFNKaWRYUjBJaTgrUEhCaGRHZ2daRDBpVFRFeUlETTFMalZvTWpGdExUSXdMVFJvTVRsdExURTRMVEpvTVRkdExURTNMVEV6YURFM1RURXhJREUwYURJeklpQm1hV3hzUFNKdWIyNWxJaUJ6ZEhKdmEyVTlJaU5sWTJWalpXTWlJSE4wY205clpTMTNhV1IwYUQwaU1TSWdjM1J5YjJ0bExXeHBibVZxYjJsdVBTSnRhWFJsY2lJdlBqd3ZaejQ4TDNOMlp6ND0nKTtcbn1cbi5jZy13cmFwIHBpZWNlLnF1ZWVuLmJsYWNrIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTBOU0lnYUdWcFoyaDBQU0kwTlNJK1BHY2dabWxzYkMxeWRXeGxQU0psZG1WdWIyUmtJaUJ6ZEhKdmEyVTlJaU13TURBaUlITjBjbTlyWlMxM2FXUjBhRDBpTVM0MUlpQnpkSEp2YTJVdGJHbHVaV05oY0QwaWNtOTFibVFpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlQanhuSUhOMGNtOXJaVDBpYm05dVpTSStQR05wY21Oc1pTQmplRDBpTmlJZ1kzazlJakV5SWlCeVBTSXlMamMxSWk4K1BHTnBjbU5zWlNCamVEMGlNVFFpSUdONVBTSTVJaUJ5UFNJeUxqYzFJaTgrUEdOcGNtTnNaU0JqZUQwaU1qSXVOU0lnWTNrOUlqZ2lJSEk5SWpJdU56VWlMejQ4WTJseVkyeGxJR040UFNJek1TSWdZM2s5SWpraUlISTlJakl1TnpVaUx6NDhZMmx5WTJ4bElHTjRQU0l6T1NJZ1kzazlJakV5SWlCeVBTSXlMamMxSWk4K1BDOW5Qanh3WVhSb0lHUTlJazA1SURJMll6Z3VOUzB4TGpVZ01qRXRNUzQxSURJM0lEQnNNaTQxTFRFeUxqVk1NekVnTWpWc0xTNHpMVEUwTGpFdE5TNHlJREV6TGpZdE15MHhOQzQxTFRNZ01UUXVOUzAxTGpJdE1UTXVOa3d4TkNBeU5TQTJMalVnTVRNdU5TQTVJREkyZWlJZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW1KMWRIUWlMejQ4Y0dGMGFDQmtQU0pOT1NBeU5tTXdJRElnTVM0MUlESWdNaTQxSURRZ01TQXhMalVnTVNBeElDNDFJRE11TlMweExqVWdNUzB4TGpVZ01pNDFMVEV1TlNBeUxqVXRNUzQxSURFdU5TNDFJREl1TlM0MUlESXVOU0EyTGpVZ01TQXhOaTQxSURFZ01qTWdNQ0F3SURBZ01TNDFMVEVnTUMweUxqVWdNQ0F3SUM0MUxURXVOUzB4TFRJdU5TMHVOUzB5TGpVdExqVXRNaUF1TlMwekxqVWdNUzB5SURJdU5TMHlJREl1TlMwMExUZ3VOUzB4TGpVdE1UZ3VOUzB4TGpVdE1qY2dNSG9pSUhOMGNtOXJaUzFzYVc1bFkyRndQU0ppZFhSMElpOCtQSEJoZEdnZ1pEMGlUVEV4SURNNExqVmhNelVnTXpVZ01TQXdJREFnTWpNZ01DSWdabWxzYkQwaWJtOXVaU0lnYzNSeWIydGxMV3hwYm1WallYQTlJbUoxZEhRaUx6NDhjR0YwYUNCa1BTSk5NVEVnTWpsaE16VWdNelVnTVNBd0lERWdNak1nTUcwdE1qRXVOU0F5TGpWb01qQnRMVEl4SUROaE16VWdNelVnTVNBd0lEQWdNaklnTUcwdE1qTWdNMkV6TlNBek5TQXhJREFnTUNBeU5DQXdJaUJtYVd4c1BTSnViMjVsSWlCemRISnZhMlU5SWlObFkyVmpaV01pTHo0OEwyYytQQzl6ZG1jKycpO1xufVxuLmNnLXdyYXAgcGllY2Uua2luZy5ibGFjayB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwTlNJZ2FHVnBaMmgwUFNJME5TSStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTXdNREFpSUhOMGNtOXJaUzEzYVdSMGFEMGlNUzQxSWlCemRISnZhMlV0YkdsdVpXTmhjRDBpY205MWJtUWlJSE4wY205clpTMXNhVzVsYW05cGJqMGljbTkxYm1RaVBqeHdZWFJvSUdROUlrMHlNaTQxSURFeExqWXpWallpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpYldsMFpYSWlMejQ4Y0dGMGFDQmtQU0pOTWpJdU5TQXlOWE0wTGpVdE55NDFJRE10TVRBdU5XTXdJREF0TVMweUxqVXRNeTB5TGpWekxUTWdNaTQxTFRNZ01pNDFZeTB4TGpVZ015QXpJREV3TGpVZ015QXhNQzQxSWlCbWFXeHNQU0lqTURBd0lpQnpkSEp2YTJVdGJHbHVaV05oY0QwaVluVjBkQ0lnYzNSeWIydGxMV3hwYm1WcWIybHVQU0p0YVhSbGNpSXZQanh3WVhSb0lHUTlJazB4TVM0MUlETTNZelV1TlNBekxqVWdNVFV1TlNBekxqVWdNakVnTUhZdE4zTTVMVFF1TlNBMkxURXdMalZqTFRRdE5pNDFMVEV6TGpVdE15NDFMVEUySURSV01qZDJMVE11TldNdE15NDFMVGN1TlMweE15MHhNQzQxTFRFMkxUUXRNeUEySURVZ01UQWdOU0F4TUZZek4zb2lJR1pwYkd3OUlpTXdNREFpTHo0OGNHRjBhQ0JrUFNKTk1qQWdPR2cxSWlCemRISnZhMlV0YkdsdVpXcHZhVzQ5SW0xcGRHVnlJaTgrUEhCaGRHZ2daRDBpVFRNeUlESTVMalZ6T0M0MUxUUWdOaTR3TXkwNUxqWTFRek0wTGpFMUlERTBJREkxSURFNElESXlMalVnTWpRdU5Xd3VNREVnTWk0eExTNHdNUzB5TGpGRE1qQWdNVGdnT1M0NU1EWWdNVFFnTmk0NU9UY2dNVGt1T0RWakxUSXVORGszSURVdU5qVWdOQzQ0TlRNZ09TQTBMamcxTXlBNUlpQnpkSEp2YTJVOUlpTmxZMlZqWldNaUx6NDhjR0YwYUNCa1BTSk5NVEV1TlNBek1HTTFMalV0TXlBeE5TNDFMVE1nTWpFZ01HMHRNakVnTXk0MVl6VXVOUzB6SURFMUxqVXRNeUF5TVNBd2JTMHlNU0F6TGpWak5TNDFMVE1nTVRVdU5TMHpJREl4SURBaUlITjBjbTlyWlQwaUkyVmpaV05sWXlJdlBqd3ZaejQ4TDNOMlp6ND0nKTtcbn1cbiIsICIvKlxuICBKb3NoJ3MgQ3VzdG9tIENTUyBSZXNldFxuICBodHRwczovL3d3dy5qb3Nod2NvbWVhdS5jb20vY3NzL2N1c3RvbS1jc3MtcmVzZXQvXG4qL1xuKixcbio6OmJlZm9yZSxcbio6OmFmdGVyIHtcblx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbioge1xuXHRtYXJnaW46IDA7XG59XG5odG1sLFxuYm9keSB7XG5cdGhlaWdodDogMTAwJTtcbn1cbmJvZHkge1xuXHRsaW5lLWhlaWdodDogMS41O1xuXHQtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcbn1cbmltZyxcbnBpY3R1cmUsXG52aWRlbyxcbmNhbnZhcyxcbnN2ZyB7XG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRtYXgtd2lkdGg6IDEwMCU7XG59XG5pbnB1dCxcbmJ1dHRvbixcbnRleHRhcmVhLFxuc2VsZWN0IHtcblx0Zm9udDogaW5oZXJpdDtcbn1cbnAsXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuXHRvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xufVxuI3Jvb3QsXG4jX19uZXh0IHtcblx0aXNvbGF0aW9uOiBpc29sYXRlO1xufVxuIiwgImJ1dHRvbjphY3RpdmUge1xuXHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTtcbn1cblxuLnZlcnRpY2FsLWFsaWduIHtcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLmNlbnRlciB7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4ubW92ZS1pdGVtIHtcblx0cGFkZGluZy1sZWZ0OiA4cHg7XG5cdHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4ubW92ZS1pdGVtOmhvdmVyIHtcblx0YmFja2dyb3VuZC1jb2xvcjogaHNsKFxuXHRcdHZhcigtLWFjY2VudC1oKSxcblx0XHR2YXIoLS1hY2NlbnQtcyksXG5cdFx0Y2FsYyh2YXIoLS1hY2NlbnQtbCkpXG5cdCk7XG5cdGNvbG9yOiB2YXIoLS10ZXh0LW9uLWFjY2VudCk7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLm1vdmUtaXRlbS5hY3RpdmUge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiBoc2woXG5cdFx0dmFyKC0tYWNjZW50LWgpLFxuXHRcdHZhcigtLWFjY2VudC1zKSxcblx0XHRjYWxjKHZhcigtLWFjY2VudC1sKSAtIDEwJSlcblx0KTtcblx0Y29sb3I6IHZhcigtLXRleHQtb24tYWNjZW50KTtcblx0Zm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5tb3ZlLWluZGljYXRvciB7XG5cdGNvbG9yOiB2YXIoLS1jb2xvci1iYXNlLTYwKTtcblx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1iYXNlLTEwKTtcblx0dXNlci1zZWxlY3Q6IG5vbmU7XG5cdGN1cnNvcjogZGVmYXVsdDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQTtBQUNDO0FBQUE7OztBQ0REO0FBQ0U7QUFDQTtBQUNBO0FBQUE7QUFHRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdGO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0Y7QUFDRTtBQUFBO0FBR0Y7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdGO0FBQ0U7QUFBQTtBQUdGO0FBQ0U7QUFBQTtBQUdGO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHRjtBQUNFO0FBRUE7QUFBQTtBQUdGO0FBQ0U7QUFBQTtBQUdGO0FBQ0U7QUFDQTtBQUFBO0FBR0Y7QUFDRTtBQUFBO0FBR0Y7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdGO0FBQUE7QUFBQTtBQUdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHRjtBQUNFO0FBQUE7QUFHRjtBQUNFO0FBQUE7QUFHRjtBQUNFO0FBQ0E7QUFDQTtBQUFBO0FBR0Y7QUFFRTtBQUFBO0FBR0Y7QUFDRTtBQUFBO0FBR0Y7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdGO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0Y7QUFDRTtBQUFBO0FBR0Y7QUFDRTtBQUNBO0FBQUE7QUFHRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHRjtBQUNFO0FBQUE7QUFHRjtBQUNFO0FBQUE7QUFHRjtBQUNFO0FBQUE7OztBQzNLRjtBQUNFO0FBQ0E7QUFBQTtBQUlGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQVFGO0FBQ0U7QUFBQTtBQUlGO0FBQUE7QUFBQTtBQUFBO0FBSUU7QUFBQTtBQUdGO0FBQUE7QUFBQTtBQUFBO0FBSUU7QUFBQTs7O0FDdkRGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTtBQUVGO0FBQ0U7QUFBQTs7O0FDL0JGO0FBQUE7QUFBQTtBQUdDO0FBQUE7QUFFRDtBQUNDO0FBQUE7QUFFRDtBQUFBO0FBRUM7QUFBQTtBQUVEO0FBQ0M7QUFDQTtBQUFBO0FBRUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtDO0FBQ0E7QUFBQTtBQUVEO0FBQUE7QUFBQTtBQUFBO0FBSUM7QUFBQTtBQUVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0M7QUFBQTtBQUVEO0FBQUE7QUFFQztBQUFBOzs7QUM3Q0Q7QUFDQztBQUFBO0FBR0Q7QUFDQztBQUNBO0FBQUE7QUFHRDtBQUNDO0FBQ0E7QUFDQTtBQUFBO0FBR0Q7QUFDQztBQUNBO0FBQUE7QUFHRDtBQUNDO0FBS0E7QUFDQTtBQUFBO0FBR0Q7QUFDQztBQUtBO0FBQ0E7QUFBQTtBQUdEO0FBQ0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOyIsCiAgIm5hbWVzIjogW10KfQo= */ diff --git a/tsconfig.json b/tsconfig.json index a4a0bc0..2e6c2e2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,5 +14,6 @@ "jsx": "react", "lib": ["DOM", "ES5", "ES6", "ES7"] }, - "include": ["**/*.ts", "src/main.tsx"] + "include": ["**/*.ts", "src/**/*.tsx"], + "exclude": ["node-modules"] }