From 0a8b14ddd8c4147d452e327e83280b5d17245fb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A1=97=E8=A7=92=E5=B0=8F=E6=9E=97?= <1013335014@qq.com> Date: Fri, 14 Feb 2025 17:45:22 +0800 Subject: [PATCH 1/4] update --- web/package-lock.json | 217 +++++++++++++++++++++++------------------- web/package.json | 1 + web/scripts/ai.js | 81 ++++++++++++++++ web/src/App.vue | 94 +++++++++++++++++- web/vue.config.js | 8 ++ 5 files changed, 303 insertions(+), 98 deletions(-) create mode 100644 web/scripts/ai.js diff --git a/web/package-lock.json b/web/package-lock.json index 0e5e0d2e..e84cb3c7 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -31,6 +31,7 @@ "esbuild": "^0.17.15", "eslint": "^6.7.2", "eslint-plugin-vue": "^6.2.2", + "express": "^4.21.2", "less": "^3.12.2", "less-loader": "^7.1.0", "markdown-it": "^13.0.1", @@ -4161,9 +4162,9 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -4174,7 +4175,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -4200,12 +4201,12 @@ "dev": true }, "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -5240,9 +5241,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "engines": { "node": ">= 0.6" @@ -6623,9 +6624,9 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "engines": { "node": ">= 0.8" @@ -7353,37 +7354,37 @@ "dev": true }, "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -7392,6 +7393,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -7410,12 +7415,12 @@ "dev": true }, "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -7712,13 +7717,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -10253,10 +10258,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-source-map": { "version": "1.1.0", @@ -11572,9 +11580,9 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true }, "node_modules/path-type": { @@ -13295,9 +13303,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "dependencies": { "debug": "2.6.9", @@ -13333,6 +13341,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -13427,15 +13444,15 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -20333,9 +20350,9 @@ "dev": true }, "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "requires": { "bytes": "3.1.2", @@ -20346,7 +20363,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -20368,12 +20385,12 @@ "dev": true }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } } } @@ -21195,9 +21212,9 @@ "dev": true }, "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true }, "cookie-signature": { @@ -22285,9 +22302,9 @@ "dev": true }, "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true }, "end-of-stream": { @@ -22857,37 +22874,37 @@ } }, "express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -22911,12 +22928,12 @@ "dev": true }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } }, "safe-buffer": { @@ -23145,13 +23162,13 @@ } }, "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -25081,9 +25098,9 @@ } }, "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true }, "merge-source-map": { @@ -26137,9 +26154,9 @@ "dev": true }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true }, "path-type": { @@ -27595,9 +27612,9 @@ "dev": true }, "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "requires": { "debug": "2.6.9", @@ -27632,6 +27649,12 @@ } } }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -27718,15 +27741,15 @@ } }, "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" } }, "set-blocking": { diff --git a/web/package.json b/web/package.json index 7a4101e4..0dc19dac 100644 --- a/web/package.json +++ b/web/package.json @@ -34,6 +34,7 @@ "esbuild": "^0.17.15", "eslint": "^6.7.2", "eslint-plugin-vue": "^6.2.2", + "express": "^4.21.2", "less": "^3.12.2", "less-loader": "^7.1.0", "markdown-it": "^13.0.1", diff --git a/web/scripts/ai.js b/web/scripts/ai.js new file mode 100644 index 00000000..6c257f06 --- /dev/null +++ b/web/scripts/ai.js @@ -0,0 +1,81 @@ +const express = require('express') +const http = require('http') + +const port = 3000 +const baseUrl = 'http://ark.cn-beijing.volces.com' + +// 起个服务 +const app = express() +app.use(express.json()) +app.use(express.urlencoded({ extended: true })) + +// 允许跨域 +app.use((req, res, next) => { + res.header('Access-Control-Allow-Origin', '*') // 允许所有来源的跨域请求,或者指定一个域名 + res.header('Access-Control-Allow-Methods', '*') // 允许的方法 + res.header('Access-Control-Allow-Headers', '*') // 允许的头部信息 + next() +}) + +// 监听对话请求 +app.get('/ai/test', (req, res) => { + res.send('/ai/test').end() +}) +app.post('/ai/chat', (req, res) => { + try { + const { a: apiKey, b: model, messages } = req.body + + // res.append('Content-Type', 'text/event-stream') + // res.append('Cache-Control', 'no-cache') + // res.append('Connection', 'keep-alive') + res.send(1).end(200) + } catch (error) { + console.log(error) + } + + // 模拟发送数据 + // const intervalId = setInterval(() => { + // res.send(`data: ${new Date().toISOString()}\n\n`) + // }, 1000) + + // // 监听客户端断开连接 + // req.on('close', () => { + // console.log('Client disconnected.') + // clearInterval(intervalId) + // res.end() + // }) + + // const aiReq = http.request( + // baseUrl + '/api/v3/chat/completions', + // { + // method: 'POST', + // headers: { + // Authorization: 'Bearer ' + apiKey + // } + // }, + // aiRes => { + // aiRes.on('data', chunk => { + // console.log(`BODY: ${chunk}`) + // res.send(chunk) + // }) + // aiRes.on('end', () => { + // console.log('No more data in response.') + // res.end() + // }) + // } + // ) + // const postData = { + // model, + // messages, + // stream: true + // } + // aiReq.write(JSON.stringify(postData)) + // aiReq.end() +}) + +// res.writeHead(404) +// res.end() + +app.listen(port, () => { + console.log(`app listening on port ${port}`) +}) diff --git a/web/src/App.vue b/web/src/App.vue index 77019da9..de7034d4 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -7,7 +7,99 @@ diff --git a/web/vue.config.js b/web/vue.config.js index b624cbc3..cd7b6cca 100644 --- a/web/vue.config.js +++ b/web/vue.config.js @@ -38,5 +38,13 @@ module.exports = { '@': path.resolve(__dirname, './src/') } } + }, + devServer: { + proxy: { + '^/api/v3/': { + target: 'http://ark.cn-beijing.volces.com', + changeOrigin: true + } + } } } From 43c7f0551a05790f74de933732a41d558ed8cf5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A1=97=E8=A7=92=E5=B0=8F=E6=9E=97?= <1013335014@qq.com> Date: Tue, 18 Feb 2025 09:12:55 +0800 Subject: [PATCH 2/4] =?UTF-8?q?Fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E4=BC=A0?= =?UTF-8?q?=E5=85=A5=E7=A9=BA=E6=95=B0=E6=8D=AE=E6=97=B6RichText=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E4=BC=9A=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple-mind-map/src/plugins/RichText.js | 1 + 1 file changed, 1 insertion(+) diff --git a/simple-mind-map/src/plugins/RichText.js b/simple-mind-map/src/plugins/RichText.js index 433d2a71..4f9c690a 100644 --- a/simple-mind-map/src/plugins/RichText.js +++ b/simple-mind-map/src/plugins/RichText.js @@ -820,6 +820,7 @@ class RichText { // 处理导入数据 handleSetData(data) { + if (!data) return // 短期处理,为了兼容老数据,长期会去除 const isOldRichTextVersion = !data.smmVersion || compareVersion(data.smmVersion, '0.13.0') === '<' From 09e393b1741ce794cd7881e73d471a55bcefc5b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A1=97=E8=A7=92=E5=B0=8F=E6=9E=97?= <1013335014@qq.com> Date: Tue, 18 Feb 2025 09:45:44 +0800 Subject: [PATCH 3/4] =?UTF-8?q?Feat=EF=BC=9AcheckNodeOuter=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=96=B9=E6=B3=95=E6=94=AF=E6=8C=81=E4=BC=A0=E9=80=92?= =?UTF-8?q?=E5=86=85=E8=BE=B9=E8=B7=9D=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple-mind-map/src/utils/index.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/simple-mind-map/src/utils/index.js b/simple-mind-map/src/utils/index.js index 94d42aab..b3524ad8 100644 --- a/simple-mind-map/src/utils/index.js +++ b/simple-mind-map/src/utils/index.js @@ -398,7 +398,7 @@ export const nextTick = function (fn, ctx) { } // 检查节点是否超出画布 -export const checkNodeOuter = (mindMap, node) => { +export const checkNodeOuter = (mindMap, node, offsetX = 0, offsetY = 0) => { let elRect = mindMap.elRect let { scaleX, scaleY, translateX, translateY } = mindMap.draw.transform() let { left, top, width, height } = node @@ -408,17 +408,17 @@ export const checkNodeOuter = (mindMap, node) => { top = top * scaleY + translateY let offsetLeft = 0 let offsetTop = 0 - if (left < 0) { - offsetLeft = -left + if (left < 0 + offsetX) { + offsetLeft = -left + offsetX } - if (right > elRect.width) { - offsetLeft = -(right - elRect.width) + if (right > elRect.width - offsetX) { + offsetLeft = -(right - elRect.width) - offsetX } - if (top < 0) { - offsetTop = -top + if (top < 0 + offsetY) { + offsetTop = -top + offsetY } - if (bottom > elRect.height) { - offsetTop = -(bottom - elRect.height) + if (bottom > elRect.height - offsetY) { + offsetTop = -(bottom - elRect.height) - offsetY } return { isOuter: offsetLeft !== 0 || offsetTop !== 0, @@ -508,7 +508,7 @@ export const loadImage = imgFile => { // 移除字符串中的html实体 export const removeHTMLEntities = str => { - ;[[' ', ' ']].forEach(item => { + [[' ', ' ']].forEach(item => { str = str.replace(new RegExp(item[0], 'g'), item[1]) }) return str @@ -1069,7 +1069,7 @@ export const generateColorByContent = str => { // html转义 export const htmlEscape = str => { - ;[ + [ ['&', '&'], ['<', '<'], ['>', '>'] From ad63b4c72c8cc817ba5f121e2506f2cbb89332f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A1=97=E8=A7=92=E5=B0=8F=E6=9E=97?= <1013335014@qq.com> Date: Tue, 18 Feb 2025 17:29:58 +0800 Subject: [PATCH 4/4] =?UTF-8?q?Demo=EF=BC=9A=E5=88=9D=E6=AD=A5=E6=8E=A5?= =?UTF-8?q?=E5=85=A5AI=E7=94=9F=E6=88=90=E6=80=9D=E7=BB=B4=E5=AF=BC?= =?UTF-8?q?=E5=9B=BE=E5=92=8CAI=E5=AF=B9=E8=AF=9D=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/package.json | 3 +- web/scripts/ai.js | 127 ++-- web/src/App.vue | 94 +-- web/src/assets/icon-font/iconfont.css | 10 +- web/src/assets/icon-font/iconfont.ttf | Bin 32124 -> 32488 bytes web/src/assets/icon-font/iconfont.woff | Bin 20128 -> 20356 bytes web/src/assets/icon-font/iconfont.woff2 | Bin 17068 -> 17328 bytes web/src/config/en.js | 5 + web/src/config/zh.js | 5 + web/src/config/zhtw.js | 5 + web/src/lang/en_us.js | 6 +- web/src/lang/zh_cn.js | 9 +- web/src/lang/zh_tw.js | 6 +- web/src/main.js | 1 - web/src/pages/Edit/components/AiChat.vue | 290 ++++++++++ .../pages/Edit/components/AiConfigDialog.vue | 154 +++++ web/src/pages/Edit/components/AiCreate.vue | 546 ++++++++++++++++++ web/src/pages/Edit/components/BaseStyle.vue | 2 - web/src/pages/Edit/components/Contextmenu.vue | 10 + web/src/pages/Edit/components/Count.vue | 2 +- web/src/pages/Edit/components/Edit.vue | 8 +- .../Edit/components/NavigatorToolbar.vue | 7 +- .../pages/Edit/components/SidebarTrigger.vue | 37 +- web/src/pages/Edit/components/Toolbar.vue | 3 +- .../Edit/components/ToolbarNodeBtnList.vue | 17 + web/src/store.js | 24 +- web/src/utils/ai.js | 120 ++++ 27 files changed, 1317 insertions(+), 174 deletions(-) create mode 100644 web/src/pages/Edit/components/AiChat.vue create mode 100644 web/src/pages/Edit/components/AiConfigDialog.vue create mode 100644 web/src/pages/Edit/components/AiCreate.vue create mode 100644 web/src/utils/ai.js diff --git a/web/package.json b/web/package.json index 0dc19dac..c145d173 100644 --- a/web/package.json +++ b/web/package.json @@ -8,7 +8,8 @@ "lint": "vue-cli-service lint", "buildLibrary": "node ./scripts/updateVersion.js && vue-cli-service build --mode library --target lib --name simpleMindMap ../simple-mind-map/full.js --dest ../simple-mind-map/dist && esbuild ../simple-mind-map/full.js --bundle --external:buffer --format=esm --outfile=../simple-mind-map/dist/simpleMindMap.esm.js && esbuild ../simple-mind-map/full.js --bundle --minify --external:buffer --format=esm --outfile=../simple-mind-map/dist/simpleMindMap.esm.min.js", "format": "prettier --write src/* src/*/* src/*/*/* src/*/*/*/*", - "createNodeImageList": "node ./scripts/createNodeImageList.js" + "createNodeImageList": "node ./scripts/createNodeImageList.js", + "ai:serve": "node ./scripts/ai.js" }, "dependencies": { "@toast-ui/editor": "^3.1.5", diff --git a/web/scripts/ai.js b/web/scripts/ai.js index 6c257f06..67eb6f7e 100644 --- a/web/scripts/ai.js +++ b/web/scripts/ai.js @@ -1,8 +1,8 @@ const express = require('express') const http = require('http') +const { pipeline } = require('stream') -const port = 3000 -const baseUrl = 'http://ark.cn-beijing.volces.com' +const port = 3456 // 起个服务 const app = express() @@ -19,63 +19,90 @@ app.use((req, res, next) => { // 监听对话请求 app.get('/ai/test', (req, res) => { - res.send('/ai/test').end() + res + .json({ + code: 0, + data: null, + msg: '连接成功' + }) + .end() }) app.post('/ai/chat', (req, res) => { - try { - const { a: apiKey, b: model, messages } = req.body + // 设置SSE响应头 + res.setHeader('Content-Type', 'text/event-stream') + res.setHeader('Cache-Control', 'no-cache') + res.setHeader('Connection', 'keep-alive') - // res.append('Content-Type', 'text/event-stream') - // res.append('Cache-Control', 'no-cache') - // res.append('Connection', 'keep-alive') - res.send(1).end(200) - } catch (error) { - console.log(error) + const { api, method, headers, data } = req.body + + // 创建代理请求 + const proxyReq = http.request( + api, + { + method: method || 'POST', + headers: { + ...headers + } + }, + proxyRes => { + // 检查目标服务响应状态 + if (proxyRes.statusCode !== 200) { + proxyRes.resume() + return res.status(proxyRes.statusCode).end() + } + + // 使用双向流管道 + const pipelinePromise = new Promise(resolve => { + pipeline(proxyRes, res, err => { + // 过滤客户端主动断开的情况 + if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { + console.error('Pipeline error:', err) + } + resolve() + }) + }) + + // 处理流结束 + proxyRes.on('end', () => { + if (!res.writableEnded) { + res.end() + } + }) + + return pipelinePromise + } + ) + + // 错误处理增强 + const handleError = err => { + if (!res.headersSent) { + res.status(502).end('Bad Gateway') + } + cleanupStreams() } - // 模拟发送数据 - // const intervalId = setInterval(() => { - // res.send(`data: ${new Date().toISOString()}\n\n`) - // }, 1000) + // 流清理函数 + const cleanupStreams = () => { + proxyReq.destroy() + res.destroy() + } - // // 监听客户端断开连接 - // req.on('close', () => { - // console.log('Client disconnected.') - // clearInterval(intervalId) - // res.end() - // }) + // 事件监听器 + proxyReq.on('error', handleError) + res.on('error', handleError) - // const aiReq = http.request( - // baseUrl + '/api/v3/chat/completions', - // { - // method: 'POST', - // headers: { - // Authorization: 'Bearer ' + apiKey - // } - // }, - // aiRes => { - // aiRes.on('data', chunk => { - // console.log(`BODY: ${chunk}`) - // res.send(chunk) - // }) - // aiRes.on('end', () => { - // console.log('No more data in response.') - // res.end() - // }) - // } - // ) - // const postData = { - // model, - // messages, - // stream: true - // } - // aiReq.write(JSON.stringify(postData)) - // aiReq.end() + // 处理客户端提前断开 + req.on('close', () => { + if (!res.writableFinished) { + console.log('Client disconnected prematurely') + cleanupStreams() + } + }) + + proxyReq.write(JSON.stringify(data)) + proxyReq.end() }) -// res.writeHead(404) -// res.end() - app.listen(port, () => { console.log(`app listening on port ${port}`) }) diff --git a/web/src/App.vue b/web/src/App.vue index de7034d4..77019da9 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -7,99 +7,7 @@ diff --git a/web/src/assets/icon-font/iconfont.css b/web/src/assets/icon-font/iconfont.css index 2e741b11..71be3af5 100644 --- a/web/src/assets/icon-font/iconfont.css +++ b/web/src/assets/icon-font/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 2479351 */ - src: url('iconfont.woff2?t=1739152990179') format('woff2'), - url('iconfont.woff?t=1739152990179') format('woff'), - url('iconfont.ttf?t=1739152990179') format('truetype'); + src: url('iconfont.woff2?t=1739843331607') format('woff2'), + url('iconfont.woff?t=1739843331607') format('woff'), + url('iconfont.ttf?t=1739843331607') format('truetype'); } .iconfont { @@ -13,6 +13,10 @@ -moz-osx-font-smoothing: grayscale; } +.iconAIshengcheng:before { + content: "\e6b5"; +} + .iconprinting:before { content: "\ea28"; } diff --git a/web/src/assets/icon-font/iconfont.ttf b/web/src/assets/icon-font/iconfont.ttf index 06a6deeacd2695df540313815b6f663509b91a88..f8154868d5553fc87ed2ce12493fe5cc4b2979e5 100644 GIT binary patch delta 2601 zcmbuA>2Fk37{;G-XX(C8SElW>beR@tp&NUl1?ocGk%~JlOIxIy0ksh2f+!#OK+qD5 zd;wb%2~nehOAKnG(Nsgkg&0i`5#l=|j0qY|ltAlq`l9{;-aEg0?>Xl#=e+OpK6B-= ziC#5(Yu%Cdp8(IxKtfAb&z8==p8sVPka7yxaH4yC$GWQXo8keSC3Cvjk#NbM%Io8# zth;yf;775E2w-Alw5NY<$H_0>IsqhK;`q7Vj==%5&&=mo9^1uz9lh(*M;c!P9y}_>;TSx_uS5Z&J({)xc(x~ zF1F+0*j{e-xq*?8F-L>WAydhxY!95v@JwD+@tnxd@aKHafk8CGhj~NiJk{pSp;Ye{ z9(Q>^aP4!0ID}!mh{N2EOztmp&Brl@FYpykUE9CGfBR{i`Jek)&gm|+x@bomZpH%4 zLj?+PJEkBTSxCbwbYeXo?tNT!&j2oMPO7 z8ics;KCH%aEJZyUFdHk;gFA6OQm__taUbqSD*921I;_q`FEX%#QAj{JZpCc~V;L4A z9qTY30X&3CE&>((=;e*5} z3?zgSvoNHP1jS`^Arys$afT!*j5s7&VeBC(3bO!V0a%z1h;0*Q29mBYN01DK*@6TV z<_(gmFoTdRxc0#EV5d2Z$9FVP!z92nlNhV)IN`Ef5=e!n%Rnr?7$`_baR=h;0*A6=a>l`hpB7 ztTf1`Nf`frUTjrZevoGs79wOwfz`u)g|!JesIW>QBMR#k@}^?lPTo;i!;tqBRx{*% zg>?gkiGKQ4ry3Ec6ycjwo~)MBY~DH;DY8(0LH$q%8CxM43Vh-3U>J+CpDK zbhko>LX_{Z(5n#T!d-iyZ6W%pV*ed}enO#@;R0uCv41ibC@Kr>4Hs4^G&)=uRcLv* z_`E{%!$nTiLK{Sk@3qhn5zAC)jV@w&Y!JF6V%rt^C1N`jIwxXJEA&vrb}4jI{K}76 ztgmuAWc+5(Npz~5J)UlFfp^$@#n!4w%DFIi%f+ZHud)I`ntK3FYp(dx}5SECfk#pTR*ox z*WS0tcp56=LZ-+mZ8CFAhW$`nh8;0gC%tXPG5J|n9pmsfV$VM9EXZqfoRc2McQv!X zI9KBAjsG^yXM@g&v!TpASmyMa5!38R^iD||NJ|Nrz1~j8@pgJEzIKe6$P60OW{l@0 zo}9^^K>pR4ylQju0~5xWVPmc}oLXlbjP`JV4| z{TsR36WQOGc=^O-$T$o+W7ckXV$FqZ@y{UtLulF8vbuRyLud1G;JldBqKTYK@qC?! zxtf-Z+uA=(UrRwGEsk$!UD^ENmZPU2?>pT;zp=S}b0is=qI-jMUA?J!e{Y z+aS7jbL-Y^d82kt-vaGNA=df)@nO?jiRfAJ$K2n4US8PrH@PuQz%Qo@ez-AS`|DaF zUX`&&*V#nFtd8(r>!Hd>B)Kb^b!DKPT%q%ce0#? z3GQYJH#3}a?qv`q^rL`>Sj{RPVLH{?@G^>7%fpOj1nXGLVAe2@akNlMGb^}_d1O(= z9L7>X4jXxtxy)od6PU;YtY-nYlgDFBVhKyhXA?tdWB?mjT*Uo~Y7O(bhgxQF3x%v? zGJScRI{MQ;qJb&50mTK&a9F5Ok_aeNSf-<(VR1*{!?GL&63ccJ zQY^jN^R_G`*SdpU~VSOEC3oCY%H!Q3r zNL1@2{D=tZwE>ROiVbv>V64JXswQl3yumAOFAk^>}5yAiM{4fr16lWdc{6;RJqv4j%pbD#8EY4pE?N@HrC;& z#IY|N6+3p)QQ2cZIWhq3vLh?N{&8dqq;xMJdmvTi$S6q7aAX;z6up4VgVa*xUmfxh zQrba4jza2)BX1$~fg_h8^`j%dp=+um=b=mK3ot{Y!W)nq(e$`$*25oL~FQ>$9uRmE88+6M3)Z^(69l<)12OEBLnX zd{IZ=?S0P_*B9^WH?gF;!J1O;rb~th%9kPxa43_7CY9dSKY@VI4Kmnr$^bwXhCq_F?`NNaNBj&l)?4SMo)#(#;O5?TNN diff --git a/web/src/assets/icon-font/iconfont.woff b/web/src/assets/icon-font/iconfont.woff index b98983ec7cf9b4177a0d0aaea2b890dafdf9a0ab..c9ebb1e312f54a2185ec47bf58f6a4109858c970 100644 GIT binary patch delta 19507 zcmV)FK)=7BodJZO0Tg#nMn(Vu00000PlNyq00000e&~@DOMkln00~5aBp*T002x>0009o000Et7DV4f zlL!HXe@RSLXBfuuKL|LXs8FN>4z#7%mQv|t3o0VEw8a66VhbIm^B{?v#>B+L=)$EY zCag52i-vS-a8U~zP2Dt2({$C8x_Qs>ayBL|OgHxVcv!f1VejDw+WJIepnqh<4tFJhUWD*sjYzokpRf3qd(Vr{I8rf7~$(Hd>h9zD?;1931$ zVl>9$NF0r`aW2lsL|lwZF%wtgdfbZJSxvS+>&kXz!`VbOnN4N0c}G5&kL9QHseC%W zcH>y7rPN&-D$UG|&&?JUMQzbg94}53r*4klxdTDeM`LWz$}RINZ;no_+!uo}9ETQG ze?D{9%9rEHJ+6GxE8mw}nXdQ+zTA@f3)%e z-rxiF)5j}p;Rzbq$AdgT9W@N`2_N&GvanJ4c$Zo};~>xQBwz9lkMJoCZ02(w;v+s} z7rR-)243S?)+tTj@IJ58&2v1@3k>oVe{b%eU3^T$?4)ZAOtmSJ~GoWj*l*ie_ zUYglS2dfz6W!CToE!5LWH9b_Zo;TS+6U%AiVFh+EjMt4^OPdlv2;PSa(2^@%c54v2D7B8Ww%Y!DTuln|Asybx8U|w<+LStCg(-i;N>dVv8dD~TRi<|gy_WWX=rheP zvD-As#2(X36MK#HxA&Rmoai@AJTYLJePYl^U-z5(fH+`k24cw65yU|wWntLV8^nmI zL5M>}dVbVM&yN`?J4b9j^G8jcL!2?v^*(E)ESxhn5^>&0`I<1&IbF20e{aSmBW3)u zsl$k$jdabXjdaasjFguvMtV)Inp%&zZlsLgGSd0oHgzIdjj0{U)|+~gtjpAxWV=k= zNj7Y1QL+h3t&mNcnw4zI)UjlbCSgf2A~J>UK&qrj}=J+|>8X&6=8@qQbNXP}G`s1BwRIzCdx@ z()*#}glVs!IBD87C{CI74{nYd{r>@0SsTazc$}TR2Y?*ac{o1ry=hx!XJ=+-XM3A1 zce{6cW!s%jS9Fq29TlWgMH1=~O%zEKgHAMqDaM#$n!y;yHV{l8lYa#*e}Q369%UJF zjM11pGr%lkwlVveLkz>2wQ31vWTXdzL#Tfg)e3oJ+V4a5AC0Q!H8UgV^pD2WhY@6| z(3DDl!!FOqQGYO3LORinN~2=XY{Q6D3qk@Vu{nzBNTK-zg{Gjc@389-M$teMBMiTf z(*L4;Z_xDQ(l##bG~@Q*=gy{G6ovr?%o zu`b3C4`~c^({%qu7?bH{<}wQz20Eq(<;}EWW_(CjD$s?MH0_;=e}dBeNfgwTG)iak z!zir>_=Z_a>!wnzL%*hL6(Pe1g8lVso^01PYmw$p$0A*k2l5d-7Rf(w;#Ksrz^>t% z$8pMHBn^*gPi}9HZP%nRe0+Paq-haN!>NCWYMV6c0VrrqO-1tg$P{`NrMT4`Z+*yG zrAgoYuB075co2kwA@fe-I*rv~AUVp$0k4bRl0tcDtc8G;^z zE*E*_bWU-ho=6_5(UVILW~^V!F7*v_jtM_JWe#PuuZB$4fBJnA^}6ihK9|e4Uz1kT zw$YCHpi4yg$SP>Rw5oHS4`l|^5kC}eeiaI5hRl_chJKkaY77r;e3-mMCSkstOoLg( zY-Y}aVXQdyEF-(_aoTc18)>(Xhsb=*&I3(v<+0n>$^)>I2mJ+j@FNd9m2w_pSbbOx z+ksVjuN3^Ae<|yxBkcz&w&KI;6hz@xQgafX#7=8Y(hyC(XE}z2dCiaq2%QlE<6&fm z(b9Tafxq^1I~hB1oc>MWF_??+N0{x_1KZIU4WT&TIC-2vHb!9rOq`hqv#9_}BEv&p z*{cD1QZQ>8MMo(N*P1p-B=9YYW6;M4>Ol=y4U|TZfAv3hN!EHg%6LlBmVV{w=66v! zto+#ej}ao|SpnnI*CK&~oTDQwpC=+FYu90cGX)lJ`>{)tP8_!j@0Vgyyz_;8Az!Q38)ayA1M<=gnqH9+59^;62NF?+>?I^a%P0<-gXSE? zywC?PX0YBEfln36keKt)^=3e)^x!-#3553RB)6+jx>n$%Ne?VR5@#aL31jGKs!rHxle?21z!4$@R zJs!@$Pz99FtV^r$Fj};!Gg0IPue`da&#I+i@m2KH$UcE19zWI>brkVIu5YU#4E2dQ zRS`qsj;`MBmBFas4rJ5IQ)N>j*-QEpX_i3yvt6Bw)!@9`qM_kjo+UZc`Y=+`cV)2G ze~7c`C7LG?cE>S`x&Blpn)OSVEq9F!zq;{k!tpLCsLV-clewhZb9!WRqr8X*?l5Nh zhcawwkhO;^V$-k(fQHFT5>|MDDKR}v1y=eHGs?_|^}dW*$(+uthjqUV#&j>N{_~g% zVQepBj>70V1kI*$u#D>t(Q8rfYTiT@f8EsIkqwK+!&eyiWs$M zI7H_vrO}$yJU%w-A7N&`orJe3`)5tHA>=$xCE-*qdYs~hU`&&yC|U^6Y{Yoxhsey7 z<|%M`ZEVIr1749~YRm-mDU++#p{IgQ_t7Olmu|x-w5C5S3y7$UAbUm&IxiF&e{{~5 zVJ)E%lz@4Ud??=t_S5B&2U&v;pp^k1y1*9*_^g|K0c}xrSdlx1T#2N%wy!hq@pX5O zViuuXpTKvAGG28r8|RW8PihjhjMXZYoKMoMW}s5ZdeYwCc?}xu1a$F0Am;MQojFb@ z@a$2ZnCaem{XJ|lfp8-eEns{ae_kymyk5cm44|RNBwxP2qFE<2pKq}j(4-9rQjEXY3-6+7i~S@Ji8oGX`-NbXsLH(66Z<@uiql5|5tN53&re+K+4O;4h- zT#Eb7W#QksGD?)>G7ebX=m#sVW@YwjRuqs+6c_~SV=z6N%z)d9TXtYkfsgRlhMj97GJwe{hlsj&udFczrAo7+k)b7EdJBoqvAmx4a_pzpcFg{kyZ- zezZ5cW5<$6gcdLLbomXx-+=Ov1Il-e1fkoh{5l2l*A(Mt(l8H~!ph#ooDUr99V<7@ zr88y9n(ZN>Ydi-s7iBBJksRp@__$_EH$$Te`QY~88b+gh9|yF zswci3>xmAPNVPOHWPQC7lK04=N;SVHU;Se9qI?x1@U^m0B}QlS=Wf40;Fq4XAO6od z5A5Vj-pr-@6I9CaflLQo2XP|^*baoi z!RUmgGav_Z!bdq$zB<}k!&*bD8+}26@P)qo6qP6lV+$UzP+HQ6^TfAp@`g?CC0_WM zVXt-LW|8NVU{Jh7k}eU0L51VRZqK=%&Z6f$PiH47Q5Sof-*1x45b|Ck zQIvpp^JXz<_<7!Sv19^1p7$F;(R#Ls?(Ot=I;~wrkB4DId+mM`ho)tnWQ$)gT8lPw zttXi+yyUf0Y=TZHoomta%^&+1{>CRh(QG)+mDVL{G^(Qa!w6wRu^v!DAq8z$4C|$Q z{)&7aeNEG}D2G*5Maht2{i~gtP(s$X9Z;Bc9ZW7 zI)8kbl|o()gthASQNiUGT%2d=!FZyXntS82g$w45$UN&&rOMF2@D*oyVxq{-Uw&|I zARL-Aa3*AD19($**ffV1)8NGOr(m>i2E5uEP~;`oot8M1NoFmEBDBG{pjD|@iLC_Sc zHqAGL3JgY_vb-d!G+Mdd?#-aDKjcxpdm^T_T?wIY_(LJT)d(p#qJ+Gvr#I7lEq~K{ zJ)IZ$<6hTf^SMXo7ye;>cgzKhk6@n5bkASb9rsg$kNmNo&q6Z#(-WEAPg#$-JRTS7 zG@}PX$`dfT{zVB5Q#`{iuh%u4>Fv!7!(>Y;p>J(+d0$K>KlQ1J-DMSn)C?N3+tt{) zt7Kpv1`->kPtjyYM?6l>Ci6k6kAJ{QVYq4906k+st0}=Cc1P%@O>y&$nF|M>u!LkK zk*Flms)WJ5nyB8K3LQL{gm+{;Zlu!&`fnpWny4o5$Lz>|X?_P@$dZFbdH{fAp_mFa zx6zDrO@I!5@@et~G7oq!tl3P+ov}3vy9No=N+C06HGlrm;0CYt z|NbP5ZfgwhojZ5$aAVu3Xzigg66n@wvuDF#*OF3c36SAPq^nAUlS>BBSL^F5bN61l zcWz~U9duVKA!&`pr6uc^mQFIQY!EPxjBxT5@^O-85=1?#O}S(j;@*0TLlm%OIqNI0aNH|s0l*i!MGq$+ zMvMeG;Uwe!t>Qk(2wX5CB6xVjl*_LQ=v;KJp!!|3-cN`D(Ru01%K;Pz3KG}CX}AEe|1GZ+fJ1$G*OwztmsPjrn**S7Wrv%I3rk} zn6qz1clU~YhxRS+?q0qR?>>c^J|0c?rXl}?zc;O{s!He38GVjaU8SUZ{Syn;r|oai zM2gHwrB$($;cM0--7EGUYJFkvitcHh8`N@GnR9@nUjRKvd4GW(u=Pvm6JP|vX{G>l z2vS;XpGZ_ZgZ)@E(koJHCn$8;19b1oKzH4-a7Qx4R3YA78e%8W8r!Bp{-Vs~A z`s}TnYK?D>W%K2(;PG^UCF2<$QMR(9Z1xbB5>c-goKY zJv)a-?w*O#0glf?Y6GqH`3!j$`mTc+rq+sFfy%%IhdTmHJ1XGx5vVi(gAiovDTp%B zdOuCFdy{r%9u*n}`SOo=Kd5wGwg{E1I> zbSzl-;Kcln&d!ec6Avz2(9uEoFK51-`VkLh%NLGqfr33fQ1A;YR{*BYyviv&B#!V3 z`oZeyf^EQB`=!j67+b!-moTKngn`!3k+&uH0;1%`K=!17HG~Ew69eG^lo)tl#=ta4fT+VttMim=+KH9l48mK^{plSHJOHq2vdi9XrKu>!7x_{if-lyw6bf?Gf_gK5L{ry>dG+Xgg zgYTU_w}?6^j%W(70FLnjivWjgeH*36tyiln2L205-5~3_jJL}=C>s^Cd52l4nCMcE zzb$_~MV_;HUnkQK64)Z!O8Snmx93CS)P%9uls$X<_c!PdX(Nqz

Hn4aWCL6GhkA8r|^>1+a))jnGxBk^F( ztE0fUJV0J0XTrF|m>lTfb4or#;jDO#z zb@c`>fDA1FPv8Y}1Zf~mSAvEQ84wE+Ti$?(dZPxp3YD5kg}7QCh(m*e5+;QTl$Zh; zE!Ze@ngawpnqRL`MDPKK(*q3~Q3YfU=E{TTjE;|wo^uefZOD2$oz8~x!+gr?qqHZzszS9|*h8-Ef$dK62I!Tw$qx_EeCKL5XDx-yk%q1Es+{Cu+A z{@97x6*y0ES677Mky5N*TeD@wP0b(GZd$SVbgh4@5s8OZR6T}&a?D3YiL!M0*z%g(vKToq6GmuYiSaDNJcAK*Ke25ve*AdlQ9Fv$9AAh%P z%gu$3j>64bwte>$i1HqzyOi6rTND?}+1ar%=rgmO1N$~?9vE^7%THT#!4Wd`&N2?z z^q(!T+>#}y<&qxZd>6|mQ-dR`7oVR@PuqL01l@sWBxW6~fQr$mC~2djm_otif_0k$ z^nsvJs8S=C0Ng5XD`9;#8!DlOQ-6IKwQRn07C8|WTW5d(&l}Wt-)udz;LGFdG^P39 z$$7DSUh~{S2ol`gUAf4;2!wNAV%v>~aH97YreBoP<+GU#d!WaYi!=Un?0OAxUsA7cSbZ2bIbKgYQJCeDu`u|E1K88AAhrg+i&bS z6GMzQQ6|qLgcPslPv*_OiEJd?lD(lH9wwtq24q^swtWLZ#dKJx86Sp|8u1&B3BOU# zb4EdE6h=`JksGb^Ikz{=pKo~tH*$TU3vqnd`}3c>-I5=7eL+Onf0D^Q^;Gt*A8y_H zL!8XL=4N@(`&teQ?uh%zrhnV*6@?>5I8ZgD=98jF(!cZlojbpOd-9oQk}W!Q@^j>) zBmr9T7N7vL9}OP!6{?3 zH|x@E0JVYN)Mhk&htPqP~MYEsQKf!xPEJotFk$h=FHhTiP)bBF_0mIiX z>49?AKT(8F!>?blPrr9nh;-RIV#0I3M_zfHxqw_}~1F$aRE zdo>An+jjCFNE)j~+xaO5&3&)i7V#MO^j>Y4$um{p4x5?%%zstPEzC!m&%^wshG}e@ zMu1+oRDFbaF{C z9W#rdsDemaeC?Fx$%209Pj5;4Ma;2i&0mwd`Pbn-i!Qe(%e>$b6qzee z(yWtZA<~}PZ;_kuA3$yxW%e>31UkXn1j42a1xgF-)oxqL=y({7zB1+!q`)|i5O^;m zN;4AFa$ZK%kZ-FFJgE27Bx+N^deC_!r~t_4g?2vve}B$*Yd;~?+UNJ~n%vM|$(+An z&B_&X=JqQ7YVDpitHu{(t37}Jqc5UQo4IXWsh)rz9F{;J zcTd|27~sVjkjm%Tdwb_FhnUNOGpA>|Frb;XDu3Gz!!~cuP&q)b0Kw0I0jUUvS&)(0 zs3c)PDmrMqqcCV@ApmQywV#&+Mlej%dSGVQv5sw`L05DM>1c)ZlRxO>y4yPvpc zBe}3Sm7kY~ALg>rr@Z-j%}uud!c;W(B+FXvaw5(1fml~>Jm-qU?@cB>o@6RQkT0&3 zNPp<*NMuoLKt&`HwZl($6-uRicQG0tkiWn2o{jJ!8d&S-2VR39@|4$ae~~kl7%l31(OjLV*mb(0fX<&kxn%;dvsr3_bCeMHO&Yaf32;ayo@Tv`PWZ``-))1@`t z!BlGGina~wIWkGE1x>Gq83Kw)%>Y2qeSZk}eFDXiwB@SgdxMs!l{=zZrY96a@1GaRQ`O1jT9bW^d{npvngW-3FWBV{{4Sp31-JZKB+}fI?2e!p+_LPp!qD~j@Bb|Voqxn4gatX=wMW!tB%Ju+ z9+o+AclAL3d3}QemAS*wSS&K~gUQ0&bb7cWo$e^2&JMKoQ00r)9>OoUJ>#80iRUnp zJ+FnEDBPVQdm^$fpEyR{Zz>V^8b*lo20OM2eqFHs(^`R^eEV!mQawo3X23>5;B5|i;%Di!UHHm`-ihR~~C*WCh7yndD6r~5uiy%R2ncx%2- z$H$x7_2Ep+YX+5nxJ%~c&jwtc(0-K@d?JPRsXR1srAOrbzM@Z*IJpwxQI{ckO8GF1 zlqZ_fMYrhn$$mbqvX3{%bRWJH@JgajM3w(WuSTOi_RmWF2_E7#ykC_#!f(D<4r&rd zlkN%1f4cJtS%fNxX4D&taD>(2J-TlPd`o}A=Zfvy7Lo>kSx`q@ZWpVuLuyd$$fP`_ zTv+${INmKto~+BwrI8w?TYI(*ZHoK^)=7q$V0JO@W8P0~6qF>H&JH%UuC^TMV67LN zrJ-`0c>Ihw!$Ar6l@SnrJ1GrQ42Q zcG+=%blPQ?Sx$fjxz9|Ww3Vlf^>2lb070J%$H7ii#i6;QcE5gLe8k$ zdX>Fw9dCs^G0aRY*K)jUI~KOhsB}%&TK)}7$Z=4|za)TZ>r5K#U`c1s6#El%~gcs@RQB!B6<7;0M9sa3xtFmgs?eUF#VE8PIYG^ zDOHsdeOdp7BKpG35vWjq zEMV;;poUln1sBlWSir6ex3&7Vk!?SxtDNL@SdWv)~kfO zrr5<5U8wi+qj6nQWl8Udr^KR+kXMtuQX-H@dC%w@nY(Rxs4tn%j^zv2zTYi)jKkl( z%FBuRk!kzLJp3%k9SiIo1s-Uto^JVn1vwj(X=js?4mL2Yw)d110fLgF4pb2>L(|Bd z&AiGY>jgUBP%uvw{k-+MXE2-SkH`BH*+CET+jH?ha$`C8p$cMEely?vjTVXIqS2=| z2}r=)ywY%q+99%LG2TDa7cXY)h^3>sQI3E_zKK`RL7G1ov1t_DSDMEJm~Li&8?zm> z=9V4xod#}xw&kvE(c=kiB`p9EBh({ugmM+fCyckbgX2Toa7<_QLY_>U!_mo0_V1oM zJUn;z{x|pS85$lQ+OzMD+QLQmEn0XW0sjsxTy*c^g$Lq^MEt9P`K1LNDS;(ekN6SB zT%n^8^dKa#g{;reqN?Ohgggp=FA;o4M<{I==@6MW3-g=wTg~1YMR(wxA3eKPrKsW2J0TQe*AOpOu)K-J&%tFCOnh8?4W&fq;sZDR~7g zqoDO!CGX=nw2b4d&pLmfF0b6OvTO%qai<^z3?ozhi%*g%prj3EA9D-yAoDcyE#}9} zFPS%(lgNV%ltNt$)7FiDT6?vv4O-ilq37OvH_=3CCuhs)910leI;CgAG{QC%v}YfD z$njsA-b~4 z^IS+H-u8GzNfOT$h{v0eBI7FcB@z6gkcx&uG$Mh-l8HXQUR$(eFyb}>?x6Uy5y+!j z9wm%!GW(jzB&C%}m*koT-txLGr??@&9}f6@9rb#L9e&*_zD5&X6TMy$t)w5e{!WyT zSNt%AKP-B!3zfKk0>4N$8xg7Fz6fiCi-EFHof-2yv~qR>N1fN{cmS+VdR4Dx;H{ZH z-RwiC&ul&z40siQ~CD3jpgqVTmC|>V&NK+&yX}j}wtrE|~{n=_R>GCPE zs7AD{xhga)ml9>g2k&ZIXTFd8oa|(iuqGsb*fe=pPQ;gB6O^4s8!s}7zsHh$uqQ$=jx%sE5o8{Y#d%Kh(d z836*O?ep_28HF`ovi(IVgA#oB)De%y2)4CmGHXXSsA~aUP;55m&^MiQS=GXLCkDoU z)v=%heR~?7tmmz2zFyCxZ|CbD=rIcmI;|aSHA`O!aHTxy7%y1W&IJYFwYYOUk6r)- z&0xC-6o1OBvgo4_YxdOhjJ*dAmA?>uik@IVGhFqkbVRl{$3$2y_&9`UgGcP7v$#|A zIQvq+Aoq}{eMV%qhf~WV61~G$l91+q+np1g@WZ_QY<@3MECRKmVYG8$5pzYl!&z+p z37+_u#YFQ@b_Om{w7>U9avc#EKa*k@7vgOzc>_6iav|4pw=5vXl1{E{)_9pufEe{H z=h>{`Z*g3L^YhJ`{lwpZEPR~z^Z1+2a}ZMe0P&EMKBwiAN&E=ofiE*TotkNXDmBos zm0Se^Tv~UMS!cb3AGTh4(PCaKPEHolOIC3b6|I-r`*&Oi(0(72r}d_0PgDQ~4~z_2 zK_{@&OA4T)Jq3Kdz`opkRt$)w`Qi#(41kuY;lbv4BO@Q&czIYw3;zi%RKw^uhmW8+ z=YEx9O$GR;+EkmUE`=l$O1w{fqe*?j&7!UN^{hM-h~^EKO3bJ_=W6<=|@P-`Qp&U zh{uA94YN2M)Uw0PFRsB8{-s`@#QS6xd-p)z4pl9mk{de*Rmde%wwK)d4x2}c2zqT4x8w_4a!2lU*fUf&$5!(9h%#nOPmHX z;>5$4<#(Y=tTF53s|xdSfGt<4Gps!hQF1xVDc$i6vswo^3&R>tB8_tD3_XBT zDIl6^Z}HiKV+-V%W~WRW7Q7G$+DcKr;3HHt0g8=26aHRU4j6%iAl@pdiBeqU{nz>v zIxr9Zr+1%*OXj?P&g?+4zpFdnn?li2HWzbejO_A((Ip9_#uPao46aJX(v4oP^w_-d zLNu;=3=N$hh$>1%E?7_I&4f#qA9>OGU^E)Gujym>zo7p^4%KV-J({^IN6DXk6p9{yh_XK1Iym^aa}=<7IwaiS zQ&nH{5X@;x|9?$VK%X=wPFFh07i#v&B+ws$T2T4FiYgAzf~mv{pdx~-N>F-Urbh~) z!-uTL&^c#}jv{N|x$$Hwl^lN#^(E(j=R5O9(7cL*{T+ID-?od;iGLfJyLSYA5GB*w zQyJ@9CjKpdT6kvL&-0sPiWHz#Ss2rnq1IGd+p`p+%ZZydd{*O=J(Buz>%k7-ZZ!YMIN zeV~Lin<*2Dpp~5oOXXc!9D6wF$Z_|$b@+R-9<=4G$<%Z3vE!OGy z;rhip_YcnXZgy{7jl!P}zl^5B>9mp^UXY2en>;!?TpQfKyY5e%(J?%_w5xCbhZhfD zyuVg|w8!{G=wE7SbOSwydI=`zj;03##Z2Q5SifGl1u>I|*|K-vKI>P6X)>tv2%c(A zAqH{QpR7lynbL0CugD|NXPetPA~jzbK@jNqLVE{2Z=VOUT_4)5hj7&Kq%uJMp(lp= zsB+kHQ50I%E-Gi((h_Da+Ii-{(2{E=W#2>`A?)Tnve(aYWnFTIi?KKtY~*^w@h$-o zS#WuklVL3te+WnjSms@{#zZAKz?Ouq^{lkrTk1vY_{^ZJ!T1 zWtp+xrWF=Pb1-4K_JELuTCzuwI_=Rd2_s0i22IjmR-p$Gp(}?FQeg6+MK2_~yOa2Z zRJW`HJ#AK~;P(P0t!PS=$oe}uzwCl0^SHtjP7?oV1M6~4aoiq^ecTzV&){U=Q- zqIar0h4-YoyHnQPcIiEnOD-oVn^)ZJYPJ3Qvltx>{cFsQqf`k&LO1Ak}wo=KW>uq=PBb^I7 zjp9H8uSpCPjel1!Y~JD0B5u5&k}`?XPxPvjkCwq}vK6F8H3Ws4kI@2l(N8z;bVoE7 zK5(JbDn#iYm67ft|3-Gh?4W+5WvIV>#%9K`tI8}5zLuuvgi%4DBvCLLIJaz>HE(%m z20fkWT)wQBZU)lDVj8=fzrP(lW6i^#y{~e(`8xI=u775X0Ue?l zPkcLFTt=$aOV%&%s~uT(xc2=vkNG2cnD8LEbVHp$ZY)Fh2>P@kmRh6e@#OwddYXXN z)SyNxm~9!dy14^I%m_k>Abw3xMzUe+Lk~%jtTY)d#3rR|M0!ZdqRyZEgq~nJ5lkk7 zCjdfEKNckA!rn>iAGBCZLqn5NB%xDa>^xUntp)HgF1QZ8y?wW z=-0Q?YY~M&}Ra^S8o2BKrHYXUqDnm4+HdwFTfEMU;Ty$1$-wK+WEgNad)41 zgdF~7U!ZwCy6Y1(@)H4BRJ;$%fq?w!fX^kky>0sZG{C@h zR|-^Av`=jcbU%f+CCW0UBIO9N4}(+Zk3yMHe=iZuR)||p9X{&nAsAHX403Hx*t7#c zqcOQK-4QO$$rLAamgf`^VZ?i4iaVg@IFWOKpzQH0tE=fbrARUo9%%Gwepc}L649KJ z?TsQyh>G74JbbiLQX)de%e(!3wUl376RCtsf#$R6?(TU#J=n0Hk{*9eUsTKtmckur zf7ZnX=a~yLkw9-qGK@an%WLsyEMGCpgW;~hOm;LFH4{l)7X?l0h-HkP-J2IH9Ot#Z z4iaZ!?TTcN2YL9xEr;iK=z+_k36JJ_r3@dNSEip#`Qy6R?%RI`I%UF)9-~%Itx;%+ z1(gwe%0le;eC7*{iV>v8q=>!p2=6%Se^pMIm<7YUd*hSn<@3+n)|fMd8av14-#R{T zXEYXz?wmJ%>-=o`?Elx%f%M>4iLA=xcl6k}uX1GU{2f~d1_vA4&b(magUEdZp$7)w z<^080P8W5s$i}~K+!WLi`XN0$)%=b}7d-Avj+Xodd~)zVpS1nJkCO+1_KGmie^bmx zW*a?gp|uUx-8M~iD6o(_1rusE(Ve|lXP#5$t=JQP`YfSi?P+iLIaf{;3@R{a(>HH8 zYXzwNb}g#G4_|A&X>)3chBIKrde)p{&VxV5h4RrcfKGy@dn}pN^ROD$f3O-+kG27fGeai)oFn9syfp?dwBRv_@X?DU03p3o z;`p&+`AG9PD9Z?t16J#3G{-Qo=uUo!yiN{+juN-6;p5C2=)?1vqs$G=oy^B6KXBx0 z+Id3Dx3F%TNChAfxf!Xb)n7Jw7Frf$npZ2s(gQIG*Y<;Ks ze8<2*2cBCP9BkfaQ{1`sRVLOhTc5bsX0-1PlO8%qQSA&(irWJ=&;idgoJdPoeN&Q( z?CQK?D-Z|`gsk7=R$W*?^W0fC z8so7`b>F4SuYN_BFZ%r-4$1nc?n4)QR9!^(`h3T0te>x)TXxMsAmzh8N ze#SZB0;{7vx>SV+Hpru>b57Hwl|d&JkM*q3`XpkZE*`~&dFvUE^+)^TP>WF?x>pQn z9{N39wyyVR0nyq8k=9qy2$VVkwb5I9JC5y1gE|Z`D=EKrj6Sp`ZNC&^w(W>^oMT6P zmpJk+Wzo8yC#y;Lf4$oSNB)OI^aea0c48h*))LK|0YEV)!ukaSn0aT6#k4XfYIf09 z8-GClj`Rcd(_qbRruIJD@~g}|1J6;Vg`QNTzE!r@FI85wcUVx{2bS%P&RO>awLOT* zy_Se7mGxC@YaOzclp?OZ0#RPVbt& zzBRq*!|(!8BL~nIt-1Z{E2vBMcqwUw;NQHSqoOWh@d_5PZ;5hH_`PbqOc8x(lp-9Z zx>Fy;(`TIrc;NRIE&3K@VerY5tviGadIHwIX}~s{)=Yf{5kXX1NMd@~%d}Sp$U848 z;dNAPUKdvIe@k>D;>62jio+b9a)mKM2V9cmvhFYlq(3s%WTqaWdB~&^w!VU=I6qIO zT%vcQDx3`Yp@@qM{FLz9R-_s|e=`PLn)CT1A3vna`h$6*%)~~+c^u7I<_m7p(s`#onS`~JKAgPABR7xmS-Oc)~$2}>J^|+sP z>#tKI+Ux0H%uNon!^w!E86pZq732!({!q}oe`3Sto{Wn_Sc&L}aPEA4&lShrs<&mw z`#O=CyzM&x8V5ACnlFGvZ3_?;x)X{jbZ3BG9YR1sNFdG`7NcRGB@vv>^g>JH*71Pk z#R&9EP$nNl-dIRV1U%>r>~>@8A-7Ixb;#mkqLS&p z8r3}KcuBSHRD%4l!pKbnL+du|ykN&Re~|bFw(YoJ){!n&;BF@_0;&&tg@8ZPwXE0$7|#49MU~B5u?i3b5Fzr&wpwl5 z$k>fz6zG-xJ;V)cj$=Q|a)$)=k32aCFqo_hZ~13dXzLix*<5;d+V9+`Mc@yVf1#RS z0QDHd$D3n_96NE8%xfN>n!;0L?6}1~Po}K17w$c<1pTOu=Na-bz>{DqbU%?ROrO}D z)qVAbt(v~;>D1f|BPqG_hDIVe*w}jJzn;0ZF-U>)C&owXH@TwPiC21iR-XR!=_`AB zrvdba^|CE|WFU0kFt}vdn)BNQe{Bp#u=6Ij7DZ2Pn^leiN82~eweJslka$5?q`L$e zY6Zyk*@slAIxSGGDcIfuld0-Y|Ad+LU9`i+qX#099g$^GYa1~!@Z|5h!mb@I*XT{f z8?9Gv(sy2j|H&$PRn?1Lf^aWL8}~<-L5Ya9jr$i_$M~oV@`s^7=|=12f15^kDx4Zt zl(1^=DZOFy^($eHp21uOv$TD;h7pv}^!Y9ORv+6|Wk=GTI>Brm6KXhTj7E_$eXhtU z53O>nRrbLsJFjNy6j7mOIt~LvlKF@O5LVEpUp16DDL6BJ?AXT7I;Yxg_DW+ zic8aq==KJ)w`}gb@e&lugwQ1(%>%#IixLWvDeM+}=7+X-m+5_Hp2cHwMEQzW_Jw8H z^+|#C8fhP<_eHRxoV{z$MTbWkD-One0=u2?-q?jJQs&CLE>6lKRzeskJ}U})-!E9_9j1Hrhdo+QbK8D~hfv52G3?2v?JsvF%!+x;PUc#=H`($ODx`U*W0ksN z@k`gI&4u(@skA)?hQiz9)JO;I5hy5=Fgz`Po=KZEuZIvRQjsJdennBTiB30*R`H5E z>TBkCU%(@=m}L#wFz_>8uU`UQgO2b%sNZvL#SOo+E)h7+r)k2)ZY7|&tjXCCZqm-| zaw!dWBwR5K5mX1>)tl+)#NUiZdo>OtOoU*%8jTfopPMI$xYR_dc_0?|hd35Go%Jez z#UQ>n*xWAj*hYJqs0Dl+Cth}rTXn3Y;e$VNRDUb6& zH$F?xj?^QW!oDo+FWKt4Y@e%JVDK0ggy=kl;X0yvKwOBr?&ArGg> z9N|2i&*!?@?>!FRph5G}Q!u*EzSOGqYws1O7if{SPJ3LFc*dIIYZamjo~IO7p>EP)0ijaj&Zp+J<2}MM-pj+Rzk@!mf4$ zn}47XzDaU5|3KS@T`sBlM~XHZ+2B0T)z0(1epk~v{cpdMjFb8D_rlUj$ibiF8mCtI z@kAw#1Sk3fVf6s5sMpm=8{4UOCjFA@fEsr0fpFHS&J;lgTgU8UF1GI;YTfbb*r1$? zZ;?66tVd^n9m!8SZ#y=BsWL*Re7&pr_VuyBhBCwZpQ_A0#Lc=lBZ0_^n&EXH*9=2D zp6H7i&GF-IuTd~!eF++g*E>nAxDyx8&iw#Ac=2Mm9F25Gtx|CiPinGNlypr-FZlv5 zo+?O@on&SfEg0kx2xdfCkIc?LW);KTF~E#of+rcww=qjPtDZW4L;el?67*`3?ic7F z6YIikH!@q>nRPkHFfz$EerUZ9UHzobZLOpJYUmNSueX@6)=|GI^hl!Ei>~_N{Rcie z;sQwp$7r}~SG-t^H-ACHU5-t|xhqrzDb!>-=#F)3NegY~Ob+EuSm-*Tnkc=|r0POS z4xw_oTpll%(;iuW4$3m#V6E{7tsm=2kXs+~m;9(xwmxpHK^^Eb_+vEVczHj~7?fW` zkI5*hTR#r^tu?ZYI{hWg%Z?Ol|NjArelPdM=QZP9==x^N#)iQ7kV}On(by{a)_@uj272&OX5#p`d-8lXD^EXuA~Oy1tU;n=a*Cy6Hp) zK@RZxg^<^XO`6-bO@zbdWMuIIgO~ig)LYReqncJQ!P{a@Leu=kU;T12xRe*GV zxi2so)3nCYrO`#6Wwh2n?sBLbw$qN+{CTIp(kpO1duSg<%UjVWq)nYQioc`^chwvEmb zx@SV=U(>!JIOB8=-5#GoL!2(LdvoT7v7>#r?s2r0F2f;Kj>j5R!pMUc%N<=Ea<5mo zOYrvE@Wlb2e=pFR=#2Nr(d7^nh=4N$VIu=&0^X8 zj9bR6yBFS%`0<@rDXOYeCBNdWQs}DS&`_|NBGw(rS}Ijbq5~vVg}6O6k02^O>qyu% z!{~aSivy*@T~jOSRfzMtqye`1j-``khuDD`%TJS8lh5}=It z60*=cHtYgHA=5g6MV)kPAKnq_h0(HJ^a0;Ld9bYy{|f*E15~31iR>mST-^l1)z&t+ z)%s()r)RvU2W@wrR}Ak7gE;S!b&;scDz!rgmdo}X9|1Rqg8LG)a8h7!n~mqY@5GLM z6kYrGf7ZmH%f*X+!PQtF3iq$C+i#*cu&8~P$zJ>o`@Ct*@pIBaeVSp(kdi5 zHnULx$PU-u@*?i$Z}N4F>v^o@>-FZ>uqNyIOeobqBKh+9dPi(tMhocZ7RN;zf4!c! zRtSQTuh$Cb$NBnz4&<_u3bMj!eyvs-jRk@|f6-19v!{VJ(t9XY zFq?o@TxQ?P?Hqdy81$^b3`bv~(r>i*t8-++ake-37J<+G6|ux@-|0St^h#~|u6NCG z^lx$RpiVY4S4GQFUJVj9W#Gq+6ib3CA1yZnIeP!wQW`{~OKY{IHT;o3i?X`^EQ);; zfAGO?tb5c3VkzTMBV`BZ3lQ_Ns`%WVmub|?9=A_XUxrBQr4|whz80xbM34RjG329A zmVR&T+7@8F-uhO`Xs;`099ZC-DifnVftp}Y$4)~4?rsPTqtGazcY*%n^Pj@i&z<=E z-aUJ6jgMD+bB4sO@smu~o+ZBZ8|0;XfAOI?H|z;s{=VS08_39~KHvP<$MB&Id)HgO zaiMETJieqNqCI=$CFfQu=Pr@)`>qb|xpm2sTlWOp_jA2Mj@x&CM{Pc`h~7%A{rR2V z(@c^44{7gm7x;AA6lQFfVP^W8Zu?^SSKmF_O1*nLN#&wrG+~Th$?dpa9{;l_e>C-H zQO+2=NuDC^){V8J%<4b)anHT;_VWK_+mkb=T|_nKcs2T_^~pdq8bBMhSj@VOuq;6v z?eO{LA?mS$Z-B75gGS*SXxLmk*Qa?D52^wCcVQ_SxS!^`KM;M9CHK=D5H!^mN{ymN zA7qL3$u{mUX+G3%ix@A0Y(U3VBem@hpCMyF#d|^5tTP*!&CG|G+n76(3=72@_0f{91U2hTC` z5PhpxwOk0@js%3F2zv#d<3Pg0gcn4YvQccm3cSdM5c)5QfyKNlt$U2MAx|(Va@M&v zVstAe;herYECpmO1ceCM?^S<@&~1nZLGQ!xCy1i5e`zL4m%4HKgXjgP#!~eESYu9{ zRbzOC8spDMN=P%kA;X*1LTX4w5lNR-9if1xrvvIHKyy3dFv|%pQH9bxOH0G6Q#pYU zFZz|FASEp8agGo^sY?+bAQFQfEu%p*MNdA+dwr;d3lV53i{AsI$fI9*RYNnSP{?Zr zLTE;ne{@Yx=`(BO6oB@eLIy8hrGu;RNZ7N3IXxjBdT5r%3?2xB%K0;9S-n zGIIGJZBE6qcmS7T=4-KTh!qMkye-zzJQJ^KKJNUr_c87#|3Y>^ds4QCo9^6)T&bD0!h77P_|Ah< z&XPnwz3sN8x80UIZ`+o7qfy_o?d3Lb-j0ov*W~i~+%=OMpFaiSL7IQ*Z7YzWFvW1|Z8n zL*9XDVCg%vI-s>+Df9mW$Un2x0C=2ZU}Rum0OGo|K2>@%V7K8u*000000H6T|0eAum z0xSZK184*s1fm4|1z-jG27m_E2Yd(^2w(`b2^I-T3FZof3hWCW3ziHR3}OvF4Vn%f ze-3O95)XC|fDvF477}n0$P+9R)D*xKdKI!3t``y)v=|^6uo@B?ZW@Xj!W#Y?9vfsE zs2nI9XdLJr5*<_>jvcxl1Rf|JvL7%X+#ot2h9Jx#CLw|%Fd~{GIwT+@U?id?6eXG^ z;wB6xIws5~JSVg#*eET>T~Z-2$T|G!o^hdu@v zB0z`;Bg7bEg7Y}S1svl6Jcx(zFdo69cnpu@2|S6X@HC#mvv>~A<04+bi+Bky;}yJ$ z*YG;tf54k~3sby}cW?;_-o**t!~6IEAL1i?j8E_>KEvnu0+;b6uHY+tjc;%j-{KVC z;Tpcj54esSxQQQe3qRpD?%)hR<1T)|J^YH_@H_s%pZE*+@i!D^m_x%LMTQ)N1(qmK z!op#Nb#HRzTAdr4&E*lTDzXjPEN+cmkdk{me|NSqwkb^7OcuV&oz1kTHN`0vW@4X{AFi6-q&z-YjL8hWn>72b^kTpT=eC=H<=eT6+ ze|$LG4U|M$xtx)ca4RuS-E!1%YA~<0J!U!hkZU~GyJ>Q1P&cX?q^?>98&aL3s4=Q+ zIS%XG)0XUTBeMr3cQm*6uj}D~bAP4N{;iv*{X2J0qf%8%?OHon)Xt8J9UsG>Hk|D! z_<);tJXGr$df_LXCuUfXFO(ghaHJKhe>Odd`IFB%4x)dvLB?9nDAbH+l^ZhL)`T;b zk&?}1W&|mdWtebHvT#3`tJ)lIXxEwvOqp{>qmCM`RdatNU)+X&6q2KTXc`*VtQG_O zm)*ez88x||h4b9G+9X1tVLHljWfB+C)7#ciU^XjPHAAhIib8HLI)(CBlLS*2h_Cm~Cmu9k+Bo6PLM;9l*LoYv#V;n*m+rp8=qq0Tg#nMn(Vu00000PM`n_00000eSDD=OMkZj00}OpmcsOBYaBp*T002vP0009e000EeD||n3 zlL!HXf8S46bsWd>CkXz;P$8fnic%3)L{OO}Dk78>DiR6>{e*s(V{_}m&CSi}g_pXy zag!~!*7yf-Z6+7V=1ps@tJY%PywCB=xya2m@9g#A#ry}nu?M!UhmgA zKqatDo{IzTekT9GFC5sUs3*xe?EUhmwvM?YNI|jMN>4#)@Y5k=!l-! z7XvXIqcI*6aV(C<`M3}lV=6AiY|O>=xD~gv>Z~#A%6hYrY$}`1X0rKwM?RQO2~2ZE@Jjj>tlwk)pO9-UgZF9u^I zf5w*9J$HBA%W?G{*FEiZ@58H1=lWZ|<9mM4_T%C<%}?6q_?6%IeQEpS?)E2t-Q)JR z);-MYyw4zS@-i>c%%dEnfm&*KfFpd&IPbEX&6G3B20mqoR<`m5Z}SMBP|tIG#zTC_ z2lUX#3L1HpHa4<~uX&Gs?4g6_d4ae1f06-usp2EH@eU)b%2Y9W4y=?UgIf-X;H2_*~u>Y zbyAn#muva|dR3)AmD`s-9ZgeZy7okwDFsBiDG$UlQ!Qji6+w|5Y48UAX-e*L2Nb63DIh#HQP+HL$sTw zi0ClQ6VYj!EMli=#)w^}X(M)a)NCybP%W44(2<3_q}=Ztjj&l@Qh7fgLbTr^VFri^ramyDG0f6J!cB7Qc~ zIlE${b2e*gHR7s~uF0IK>4@t_%J?lK9p7zJ50X`z8j-Bg)Qx0arj{h@HT5Ogh^0Gy zHf8EivT0MBlFe9pD#+$d4NJbm)V1V;rq(5&F!e9_SxZj~`HZQP$*-8&nf#iiCypB@ zOpQ&c#nKZ;soT`zl!i=we@ z6FZt?J2YtwAK%d{X<9_ne{kv_qS|K7dH@Pq)6^e|)5QESk$jUOt^u zU8pCLhidfX(t{c6*Rsq1x;f8;AD%XcGTK)|CTsmZiF#djai7cOJD^ExXxnJVyx%3F zd}KAWUs~Nc?n9ZubVPx|&96e?%#gWC($FsxMvdX2jSrC*$rPi(cr}>C%ogS>hT$qs zJ$rf8!xCU$gT-(_4A$_OFj`tqtMJ!; z?jU0)j?=$sJO*?=<-zl+LY^~ctK zj1VEu3K*Zh4hbCO935f#JP|Qjw;l_eDX@6^k6oH{;<#P-fE4>m(~n>Ku^Rr;UY>Qc zS6_==0>5Vuf6uwNtF9%Y0P}?5?0&cl|Be}APGfd4N0=L-6-F=#6&gkLMm=c2e}WHc zEKrCC5Y~Nxhj+e^FXU_0dZP@@Za`j|LDMTT;$i*M;y@zGkiCRtXc@&pbI_clm>2rs z#SGRPBk-w084`0oy50=vlpdU?B@21s@Js!@$ zPzBV_tWW#nVYGO2XQIdpUU^MVpH)l4;;ZPXk^KTkJPOtqcNFmI6a`0DZ{h@b?8$;7T5u+9jhv;0T zG+L9I$H(UUBh2i#lkhfe|E%dYgq+8zB%I1ck5k+bjA_y|MGFC%ix|)T5Sg9QJO$3I ze~m5pXTU2mOpTd@K4o&%I`mY~={~vy=+bQ%h1T?kWdRYD5oFJ3LFa`+gUyYwzV6OZ%p#QQ z6Zq~>#_Qk5#<^t26Pg4qW3@^p=aV$6e;KG$vYxc}cV2@Ay8vB05Qw?Fa%YYc3Osw1 zCuX{LyuXJ{CJ=69q6Lgk!)v63*DJW61~e3z)vdJ>i8Qrveg z3;)iQQKBT5alq_gl-q09n&CxO*0CUhIzOQR`zb@eBfAbe_Od}E}bb; z)@%<6UE?{BxhPu!j^s#Rz{fRPx~a^tsEP_hmUC!yZ=FM9*Ym_e#EJn?N(J@M^W zPjsk6s->YJ>+6+}yjKoYs`KB_A<*N{Zuak``F*=(+cPmOjk)E(0%IBO1dLw4! z^<>=W(v!zQlI!Xk8tTfIe};a5Kw67v)^Ctj7#u8|*fCf@7g{&dIQk5CMJ2`cNtXhF zTW&+M1BO3&((bckKqF12$}ELmo3eXs7H`g*xpaSmN;y7|>7eT%ZUh0_fe<(tov?HU zFgvWildEh{V6=Ajko#x&5{{H-b*El67X)> zA_fhG=UtabCg9_F#R!VlGevY?r^nN2?Jjye3?tfW_nSC0BkLqv{DRS1w3%x?$z0(j zubpBObV})5i=J=!Q|L$WH$L%+X2W@|vM%*Uqki;W7$Iz^)&puNq@o?FVZE5oUzyLN zuW6e0kl*h|$&hOOtDTxqL)N$CU{HRG2ELbGdWlw(w{?vaj9ZZDvnlQllgAD^e}0*h zLS71lwd#&h!KDZ;&a>=LJkd?^{QUoU`qWf2v)CZH8O8<^=enQ?SFoPQFFHh);r4u!va+Qow~U z;x#&yhH7^xrQe{SQ8JQtBz!YHqsX<_yfXnzMG`d%^PVxIzg&Qer)yg=F-n$1}a3vL1DLJTBB}Mh}M6 z$6<2)iy9iHc!phGuWLBd+nX7N$(B?@-`ec*zK~3Q>Qj?@%6<$|GeX4eYV6uwGB6JV ziH*{yXtJXt9w%p$1t8T&e_*9B+zf4io-v@+lwc6MBXrZIxcSEHg@aF6Lb8%bRFY_Q z!eC!XRBuUz4joFuJF*@#(rE+zw~-!AR1^54cI3Y_zXLC1=^-OM06?-(Oof`;X-2vx zFx2NM@&z&uycgDNF2f6HwUWRUM{lJHxRB1+8iieh1Zt&_*|Qq|e`s){*ZO~d5=OT- zhWE{%zi+s)eN?peQW*(!YqZ6)ajRgzttNWDI>eI#=*3E?V!$#eir%4iG0sJZRd($q|n=?ehT`kvRZ8 z5s{;`^5m=J9uk?Ml^SC(QJ|PiqgK%g{He|}j^@7Wd!L{6fA5LspGWsR|9taq=lT5H zSLiF?Pe);H9|NAg)uwR$2^{d@Oc_^4Kr^rfDi~J~n|KhXK$4^j7A9Ijpgd`mE;cHA z4MG0`zpD2qp&uJHXUzg>YybfK3m{N0akY#yJ{(A3jC$6MWV0jdwmT2>2P2a)&K5G^ zHA=ciS-fyVf2udVVd13OlUCMLb#+xbhtBA8r0Qxl-K$J4+>o}vMH4A9CzV#k zPKK{p4|lKJcX8_r`&M?(=-i-|!^)fo9Q^|5Im!$4e}JuDLZ1L52+lACphJ+-VhaUZ zmz~WpxPDvfu7R`%B+zu$knY%e4D%hME3^nc-czVF67jPZEk1484fT%LiZy3%+gxjW zb1a)Lcdb~pW$n_*GB+~3YwzL9_V1ZLJa1sfF6$0DgU4V3j`MV9HchTTAxpoXQ1yom|<$I$Q7szTyVG}z_gksWb2AR2~vXcoqF%%}l{I zV6FR7=1Yt%-`__VQewhDYv{<^l6wJBa$_KSQotHQgOVRuvmc$Us@5%jHq))5vm?oh ze|5V%xZCAYy8URGno-f9zuROL>ubTW%)*NGIZj|&JoIJ_#SE?%q{tHUoDC@e6cgQ*@8x^y8r&+0(=rWJemcO1P z&)U4Nlj#QuY_V-6ecRaE^PzES!q{udoaGhw{fb!TJ4|O_>XO1-(?5(&L0_>zxTlJ+JH;VVeT7s%psLv>tFRGzY=@h&`${m ze4#Ux3BeElX$~eESTYBb4OquV-^bzlH#mITNAiDm+2cPR) z)Y-XcEe$$h$d>ez9TpjXxE2-&4aWK>`{75cqr$j6Kwcqd!nnkk9O&S6&}t``CCq7{ z4Q^-lfOL00bA&m{To0pV4~#+wCPfEEv1whs!3!Wm3&0b2!5l#vNYj;|;X?+*g2a|L zAfn!=L9RljW>O)pmIva{;Gl#_p#mkQKt>BT3Z3Qv0gvX_YZMWGd;sF~K*L5<0hxoj z>d-l(6BDE7971dxvYtw(v!VPjUo`#XX>Q@bz(Ve6;x~&MQu$CeGo9%7_x2AqBz*KJ zmKuZoy?*H8;eiGG|B~sdRHlVi!%y=I$PW8sC+1e*Jk?!Y8Hz_rv3_ms)|EFme^k49 z<(AX6{%uAi9$Hy4^%%<3n2(GSb=ius70XnBd}C9}fw{Td!FI02tHxF>R>|)_PqP`b zkWXz~d2>s4o3@i?7b$a>2Sy0s27DC{(EtOaN|`x0SHInhlju!>ND1j9NBdI*Xi$imfw1 zfX4^*J-1j-FZ}YvdQENqcXB+I&ugAr2|9hT=xW+UO2><#_!5E*4MAk#9o?HdRx zro%$b_%NK*h~IEb_>Fp=GYUeZFp83h++>~4xxHcje9I%ak?RXxh~vZFpa0zLmK5Ce z1rcH8B$Ive$?V-f+_vq9IGKCZ&GMr6)f^Vw5%&{Kx7&X!3P+A`plV3XCq$2=f9LzV zc76YjV(dDDLYLR$- zg{W$F=^=mBM+*J9v1Mbq{sK|_5xtaFqIsW}6sx(>LLe3^#9~<0?5Fil@ZJ%Nk$7$- zUz(K7o`5d(`;0)q@byc2pqy1Ei|}dqbuIA)qNz$)j%EUZsNwfbcI8HL@avlN`HhIK zXQFbbnu_SYC0)7E>?Vq~{cAqtJllPF5@aJ66Ssf0tc5M@WkwC2s}$P?Gs@E)t+`-} zwZ_11`)}1zgvp} zczf8p9yE9cGcRh4S(-nFYI7G|qGfB&N|qEDN-?Omy!fGamNxhR(D zpS~ay6AEkg?(O`bl#>0?!LTna<=r74=g!9_;@+6#kB>*Bl#h4}x9B19(a2wz4|i|b zw`cvPU9?tPVk7HhzhMl_`^cJABV&KVZcn*)d1S{$>{-@$G3gD+^@WS)cSvfm)FBPl z%LmS!3>%qmxrpGBh);Ay1WpeLVLw&`EVz8U-%SL>i7?-h#P74SVOd13u)qZ%pN3Td z@h%^yxd@LrSJ2?F1OmBx##X=pFV28eK5p;rox@zrTmhUpJ==u=&9+t9ZWw>Id2^P^ z0fGexeg+IkMKH{QjLb$Q2?J8mLE{~TK{E>hSbMGgyd*G!VVc$hGsBK`Y!eN-qDx3e zE3GFs-TU}Gn>XL{_`RFRh0W>wcpiS3%SNB{=Es|xZU2SoXzmG?wcO=In&$(tuHJag z6^Y-MOnN-YRD>X3TrH8%Q;~nj;@E&6kx0}IKiyR*mGa%iXna8a{-%33!G~yIt*0M& z6@tiob|Dht^3MuCV5am=o4L^w2}Q zv%a{r8Xn%bZ}q23YrBJ~)X0@>8`iUAid+YpUJo+_6qA|(fS~&j@cVxRiX+G0#nyU; zkYh`r{t{e8Pg8EGIR?Qr<*E1s=fxu_Z`3DxQ!dYWwJp`|((;v?jZG_;cXijcSfBoY z_1nzQabxkNlQ=VZ2|l64`+a^v2uB4!r@6J-=9=|_ow>Vf*~-nR1Q82=cM;tcShe_) z#TQ;QdCB6p)w%N5)LDOnI+l=A-&(p>q0+(sQs?E9mo7Ho+t{@Ja07L|_)F?+DU+8@ zLS64%^gVMZW7DIj$W`Ph;|G~)!1g9e5L(MJrUsS-76J)OjhQ}7w`DM$&bX4++UhgR zWHbZ8oF+Z7w90*36*&;(k8-}~TD>b5Zax+7Noz)~CxXAAmkW_5%GYwaS{{u?^Awu3FLw+y zv4y~CrRP2Lt03$_f;$5ExAHf$S!(6RtHZbPbR)B@Bpm4S6i4dx(Is5oXSL!~2ROCM%Ir#2cGW|K2%M!F48Zg6{-bVn2y&+&p=el-$l z?oD<_(DQCtc3WZSdi?kQ7J*J;5yFBT?%FHrG7?Vwa4*Z8xTkus|Gd7zfy(^hXe<^P z`N33SemXtekxq9MQD+C*c5&s4*IkUCcY7u}gA&hSB71*c4L4D^J4NR9piJo}tY-Co}^>&7PV{gGYk9EkMqnWq9-`}J3^dG$(nVnOu z{`?3z4mz#~k_)AA7cvhqf8X*og9i3$klH?Q>kcow0Ru_HiTaBy6zEp;#K_oe%<$B>YZ=} z#9Iq|IzHaqp$}(bUNfl1T{16!HsJDv4){62CsKcCzn_ODuJVYy;w$<@iIXc49(5U# zr<4!FNO__uU380HpRDj{Kl@m7O!wi-0IwwaL{#~2^hz|^WB;twpWq>0%PW3~Bm9<2 z!ngFteXiL4?ICH91$D&bcCi{eDHcYLz^Z)fpwB$CYjyLdzkl98wDjvrn7@ht*b3Z zI#}xkXZe_1I%s!s(C+KDB@KqNz1VDZhXFu80eOEb7MMS8D4dH~&!Lo`XAR|WK@OMGRv}eJ z@1y<-*5UH$k$|B4Wksqe$pJOg;TPCsz#l{7QQf5nV(CQEr)K9xQ)a3BY{=wzB4mxB zAek;MEm^-Y)L$#c;nLC~yx~GT8<{t6ejv7rHGG-N6oV5Z7LzWQ(}xY^*Q$ZEblHEJ za{EOoECqu~Fe>V9pU*3BK9^AlxdZO(qAXhtOu5P%dhj77q=wFWtgXMZ4E_ouGg0Vw zkP>E$kakz*YDPnMlzBC0)_{l@Uufm6GURX`+=# zmTo_O`Q^vaX_sGaJ^sm0e)5sF-r;}PIm*C;mc!cJ2hz#y%>B&YFkd?5E$SFVOD%b1 z2sxu}>s9u$b-Wew#4t0pT+8vY?O510qtZ29Yxy@c-rg#kp4Nhmek!xrhU}{2q(&Eb zUdZzaWbYQxYz?Yp&~24Q+bYSKFmw8-m{X%uq>oBIQ?_?& zAm$Rr=<5=~y)rq$Hh+aa6v?}UTO)anG*=Uj!%sA?kL2+e06gQwtq>A&2*T!Q!BixV zoa)X-QhvXj={z~V-Fw}F z$2k1mtG%44ADOX_jN@lO?pSE=DDXgA^>oWG$l0JwJDZeruz_i{y{CVi2oRJUb)br9 z8Jb4sZQ=bavYw~&4F&U5(a&42c?PqI{&>7Uksb6P#h#1*ksHgw4^%4D;_iLPsE0)UO6ntQq=Hhax#;%-UGBVV;F5c^HuUC;%5w| zlc_Tcpp!i%8-M0n)7$C{^(}tvbM8#Qx+9Qrf6ncuFgnYICkXi*;jO!P@_CFuPk3~I zC&znEE0<3@g9hbzUo6%)uP+|&LmREn`U3$!TCV0*w48$0XVtuq#DLHjK!UT5HO5P^)Eh2rh$?+nElMH%*U9gm~SyZW`BOkyw03N9%P^t>SCC-Zq(YV zZEeunwhTS@?z@R5N;^4QPUld-NY^Pn6J`*$p`bnc;6sl8(#&2G)!qx#wQU4b|0DyH z?Ae(d|Bl@MP`{Q3x8uK^qtcWQFxBTo>$80yjX4FJ(X;Uv+HMKZ&|G^>&yKubXL+90 z1(DY|o`2_b9t75%yeQ0#KJmNe8`Otmo2Snl=`+!rW}oLm8u6CLBTABZu0TBAj1-yh zQ(qE635EP<7(^oyNGzS~Q}o*6rGpW-5pV~^pN&8szvWTG=w`F8nM_hznRH368Q@K? z>k5h+0{p>%&(~3}ci7?Az2d7h;Z@P=711jCVSnrILG zI_`_GMz|O#8`aq{&p|8aHgME=orwp)`lQ$I)eO8X)2Ew#2=$rGj|Br>)vFsCqnoGKTsx0~=+O}L38kS3mvg(6(e_Ln1 zpZuKcVv~v|B!ApIbzL@}&t5mR`8gY$7(3_C)ra@&92^=N+_~r1HZbqZJy-nH7Xanv z4XWXgowM@W;LfWLoijFZ;+#`OY~aj!L+Bgd11ZY=?`|0Z0;cWr^9&hnWz0bWpTHs{bcopf2%!bB$q#(&kZumgR22A-+kC^3ky4~ooqErUkPxfJn5JySk=yj1>m)~b0UwP2L#Pvy9gA2(yX%R!w_rs)botJ z2M(3L5PgcCU_i56^{8}2b~MLCSS|QCglMBj?4+}}Q}j6dQokVglBj(~WUhx(%OeuK z%~z6;<`i3eh}5g3I@F^miGww1hr96Py?Yq?t% zkYhHy{fi=M^4*(|Ha;iUJT1Iq7poKAFM~ zGamRdlhdi0rcwh9Tg_D9WV(;|9YN7TF+pYo2941pEZ3t9osugB7o7bS!Zhmnso>Z23eG>1JS?uL=N=HB@>y{waa$_D5 z_Mr7%>kPDYO6*(G*|WMw57G@494{f%)vsken8!Tp@(5{`?W%Sx8aB~+8`VXMBJo&J zSXL6dL-V_HiPK<4oOlSc{BCrqHD-T(e05XxI5G7Z@oYEcNFfM({5k4oR zp+)eY;6g?%?ZO1H%!!CcmObQE2(7bp>u)~WokUM$(NB_qd-I2&zjj-@(NDf_6{h8& zq6Fm|Quk(x_(9S7hY~6^58Z)r5cOOCZT$lhTK);o;A2bz<^k2UK<+kyIjSnxt1Xe&kef{#$q1SmH8O!#|YIbZ}5 zf_R(YPn6<*Ub#+5=)gSqpWbsCE}7$<*@0w#S9iWQg`%ZwF6Pb{*%bq$OB2W+Q{{Lt zxH=h2H+sF&qvI2WXx#5HG<1J{AgZbnxnMn!Hxn*de)t9J{n2Q=Ki<)ByF`yWmkkuX zx)Sb9CdO;$M(4TYQ0x<;Duzmla6s>Gujym>zo7p^4%KV-J(|5MN6DXk6p9{*vOd^4 zIQW=z6tHbQD#G z6aO|cf8PjtKT4)|q%zjGO#EB4=*+gC=QqhTDL|{TFs3a-t*N%QXDLLN6E|b{tmZMZ ze#zp_(xLj+v$xg{l{$YHFF~K3)#~-d;^flx=x%FYV@tihr9q+fODBuP<*fse)Q9Rn zNSc&j9@Cz*g;Qdl`alV3Hd7{y^@{B(`s!x;$d2t;w(Z~OK{ZmO{W<1f#K&!CGm7`; zK&#SBAH|z@j*25zizRf!i$eX>Z zS6u&|RU5aYwpyp-hw7K?IxsljyT!e24GMoc{1TcDr_*Y7cwr{Ke(LDxaBc9wp1P7a zqhokIH| z)~^WDWKij0Jl%hsMhxPtKUoh`Go{_OUy+BQ&$hI6L~6b=f*{cIh4v15-aZdxyFRpA z58fc5MOz-c zG>#?LYANW8N`8ZfC5Ke6Tx5w4bX!#~_O4jas|Is9gn>+IvTTYh$!CLV?}8P5ow~|< zG(C3MDLh?8G07k~Cn0TeNL`ren}?d^b;^G}{`E)=Y*Zzz$Ci{3C~~L@L~74yq|xB9&36;5P#6&C~)FK6B(^{ zW6;O-B_}RAHW}3omRA}{A!aPPVta2SV)X1_IsV*DJS&jI5J4_C=XI4&UoLRlw|c$E z!32GQaY}Y z3ZmXAjkb#IoPP=g34bL_m2C6TY^9P#H`wmvM>-dE8pVMGUYi&w8n0Z~ywjyc-1q<` zWfG;I=oKd)ErZu)E65+!5EN=YN(D z=lz7&uFK1lqcJCc2vgRRk34=Rdc*dSdE-qI49ln?jO6kC(PDsG0#I|>IaV!4$P(=J zG?-kz=hh-y`;! zZ()v4FEFwiY90Aj$t*W=$|Yu-et^t_I(ggc9@%2(@lX7JJ6{0py~mQ!X9B*LZ~2=* zEbtj$KvX>s0raphz!5*b=5-GW_)aXc^M707?m6)=IsDJQK=TH4_a|uNCjzpldLNPl z0r}GbpG$Ci+w}P<@+7&+wrpMu^x1a%!c^k3PgMb3DNs?-KD8;({S@AoD9f0Nlq1AG z3{IUt3S~lny+kxyA#OQ!_^7LgU{Ikm$hAFT(+&WQ#^l0uN4PXEQ=HUUo>N7H5$}nq z?tnkXiJS`rWsjn+six_<}>N;?(v=;Y}ijpkH4xfE@lQx;f^$a>*9jr=Auj_&>NBrqmTFUT09!d zSIqKYxN9(z9Sug!L{is9LDM>78KY;4J%L_2|IF=;c|)kNYiz-76XUz0u~>B1_{41svgxz`Uq=VhgI^`G zUnak!$Hsk?BV*_9+%_;c*w}vN1(WYb?js02FaR&-FS%-_sDni|{(aNtppMWF>EWs7 zcRae_ac6S02=hFD#cX1>)3X*@+hE;o(^Q873%OG;p=J}^ z*?V>7Ic46eJ@IGG5<1qN_J*HxD^%TLi-54_V+$N5JIF$g$8Kt z-*e(YeL}pWSFM~mZ0}#r86h`^F)&NNttUXT^_}K(9RmX$cz$7Uuz9~tap&7tnOM7R zed0cw(Y`ZGdgvfUwKFs+ZV%W%2RzSkA}!tTo0j~@uFlK065_|-_qg3*FE8wWvlI3O zes=0IfaY?j#rtSonuj|Eh#Q#2VY@o-leFh-l>VywCux_DF<=B=ka)*tPULoG&q=sq!^dFc0a*}B1_1w?B%L|R`(BT(uH z)JAXZ?Krk44eBt&tfKtdG5XM&wEa?u*|sCvagH7F9pcD4ltt@*o~$N+;rC7t9Qhv- z(d+Pd$ccFV`c~Oqzf@V#-ey5jJbl)AfCqkW(xPud76zX@ z*}6l>peJDMn+9yNY0cDU5fMbCg(Rkzz07!JfV}g98eUJ;=JjEJ6~9O~B2K(Sra8>v zX;&B{bkHS9F6&N%K>EYeO=kLGnukoOVe2b+np1c(?GnA4Bv;WTt(UyajGg-!KF$Q` z9ULtek3!9bYL2IS5>?2wH#kX7`p&eO*B?OKNZ;nMT7&&4J!10!_K1a& zIWRJVa}R#Vwj$Mk=$SF#($r_QMvsu^oo!kiKoXAzS=Ra*FQMJfo+e0GN%bz>hJ`ys zp0|EMJjD7r#|t+}17n;hE}Pghw9;O)PqUazLho&J)~s#qc5VrYBWDM$TA-^o0N*uE z`Ib|`A=g$M3uQ;bvh~H5rU+VMxs8eb2TSLsT;BRgB!UWmx*iMrJqpl8*6p)?;&!8g z&&>i^b9usUyv!x;9j_vlTBp@BQeyF>@dw$pAWxE!wD8!KzAgUDa*|6q<)A#jb zUKuN))$!GFv^wktLDC=U@>4?T*WIjQJ?2Sytj84At-nT%Xs@M%F*iBP4ksh3W{4;d zRgo*CE1{r&dF93}JsB5=uo}@3;oSN9-Ybv0{oa-x@9RWn^0w~)XdKYkYQ6vxwJktY z=uRlA(47H#bqE0kA%Qq&Sd4~!mPBwi(+e$)TgL;E7bDOwL7Ds*^2S0^BH%%1V7D7v z54v?qt3wtS6V*)jt^bHF*?ane?o99-lT%%BoGNdBTy}7Hc~U@Vkzhna0$P9sU&!~| zb6ziJJt>5FWPOD~#McFtmQ- zt_ya5ZU>2PVEfJsHmy1B;y5Pk0O1iI*?#3sS8k6)qc+eZOY>RGeTLh zE@)#gf}JCnp;mxgpM6M`s?!41nu6^uFqx|U z^iP;=-$grJJbEA!*%?_LwYC!z15f_0E9~0oa*f_xyvcg`W_{O1_@Atz*YEeD7a`mS z(#A)k%b`TX+RpuptYduC1^L5JpmdXe_0r9wyHw5}R@JcI-cx$r=Id9%96f`%9A;_z zZVe+SqnYzt_N_j)t;&w1J9UEDIwsU`&KQj%W9D3uQyyC7SgY)VQFdO<)G4Au&2$_F zhA7#E`L0*$RNOpXt#lN2+-k~#OC*H&3+{mLxQiffC>C@*#ED8_{z8{u<3fCYxue{@ z=Z;i1BqfX2t}S(&Nr8trs;EBGcF{_{ow9oOz(?eMLB!--ir>8 zG*%vp`vi6e;k~g7SEkHWcVCiNltqLvP<&Pl9#~rFtRC!JcfKN6=N+bd^@lxLP;=XU zh8Lrd8DiLzP1|4YDwq}H%r53Sx;NSK6e^^7r(@N+WARJZXUv84TB)=>28PPpHLr&dDN>OnAAVU?vx!bOi&pchJL+rZd0)UIv6y8I*)Z_aUaukn zuR%w6AJp$zx9W!9S(geN=hHOd61N&qUDnjx2sdeGcDdAsI})y#h6t(y@9NETbmDKu zqrDo35hg+~U5&Moz8mIe_{~d7i{j3d2FM-T+{+SjuS6G z$L)8+?`r}cfH=*^^TMe(p`G2nBj@BZ;DCEW_KGX*O zlNS+NlQljSe-(PIl*f6Xo1UR($7#?!Zw73XyH=j|`O{W*m1h8aFrOctxO-wWpPvD) zcX?PK0i4H;r3^cTkcU%cj&L5%=W|`7c#p$3Xwbau6pZe-FSTm@+It1I-#qmf>9eJy zKli7jl;jnq79-foe2CTlmH<}MaJwx`n zo83@P!#-I-?>(ibt*Hg=0-%-GFgG)IG9O_+#rz%fCFWV?+sq5he=xsChT~7sKDN-G zpiU${{B{L=_P%AVeWFrp1C_r3;QpG-GXQA=xxeNU?dwM79Dt@og7p76P?_0(StJ?!@N78BNb>Q{vxP8565)j#~m!4HqP zKvKam8t&d5FBap?U(j&3V}H|d?g|w_3N@Jyx?|m1(n8xglS6qE7P?NTCQ5HKsk)Gw zL#UiCmnX{Qv`3bMvWz!cYn7n&V?7CS>!V6ZL7lSoaceE=K%c=Mr5Pv62WZBi`~rGZ zMoHcJaZs_=$};LyO4e7=qma{D+m?$5@ozwvFEc~HYuDMkC>a^e*?&i&^nQ-Boj~th z304~YqnK_F3pEfgD@G8tg=N}%#*BFsC|y^l*Yu8BM?$Go2z|~-k9fViJfgLXI>n*g z7kCj0sok3Q(B$_qLS5)Zgo?6J#(M)T+P1zxX@ zcr)JSowj>jT=ZNZsehen7|Z7!{Q;s_UZj}*7RoAK??JEX@u2vUXgg~Wq)4v^4kPRSIT{XshFlU zmMx1;`5`}G;tfwQGJ`2Pxd6QcrG(Ie$>@|B4o`014)}u}gIBzeU-3^xmo2LY0@0~J zUr&YisuVwj9}*y47X8{(0SXKC^sJTc@9*=`?;8u3L}oBW4KLHSeLhDlN-6 zyuCJjNxsv{c&^!1jTqS#EkT~BT)n9_|XByiLN3RnYPa@)PYj(fXGwA(kTJTcsC&n zy=}uT5EL@46Ij$q$M)eJpqQ^%{ga2<`tZL1Ffc$hYLLioroz?DAY5&0gWIe> zrh9rOdV0_f=XrnS@ZKd5ofR1i;T%_^W>v?OX zAQ<_2t$==g z_>Fas+CVI2JYuBm0DS>sUh=Cxx924q^^(W!Q~fVNr1fG82?Sq@)F`4y{(>0tVJJ(# zw{BevuwH9@D`m9Tl`{@3a85rHqdtL}U{J?SLjZs7ZU_yd&?umHfd1q2pTgD8o%sB| zy?bwqPgH#KhQzLklT6p%rM?Xtf>vqDj1Z}dz z=b9H&j}?3)gw35a3g1Y>=DPVl&7*oy4cJh>3ro?!M`*r}1fnmnMT{3fHlX9`x9ty~A!9(rdqLN%GaH#L%mTp_zL2SIMJD^;+l3zDV|f8THACko{gi#O)^p6OWV+o@3-8 z`ZllMav^jF5)g_a>=k&90|^fkUJzaCCb9i0@FE*R=)Wii7W1yO?lIPdJi(;MS?Ah_ z(QTN7bNZUF6p*zL6e8q+*Z)I=Zbv)_dLM*8K@`=0&9hOu{F`Pzh@N+9EJgp1HRi-Q zHHKHHG5(CChBVU~GQ3$WA2#Y12C7pVVe5Wz7E%7F&Hz0C=2ZU}Rum0OI!^Zy&|;+k9o z{@1g~Gq(Y`91Kh#Q2>k{4j2Fc0C=2#V_;-pU~c%|z!1YG|Nqnfe{Av$KoJy>4*;c$ z2MBnaV_{%mU?B1C70t)5jK$vi1a+(a#R|NjKUf8qRO%H0G2 zWTqB?000000001H0N4R)0gM6e0>}e=1OfzH1i%Ga1>goY2HXdD2fzpv2zCg6stHC3 zOQ z5E*hA&Kc?&A{t&Aej3CZ2pfnS$Q(!28RD&J_7(6 z)B(=36H7$_e`lB5HW1WU5=l|=`Rw%Gdz6^D^yc(S;u`znIMsm&5L}4_B$9ZP`0KNv zlza-`gNR)&W(TvQ!MVZyi3k7xSe(NUBa9IsM1%=qOfkcG9N_|vaS@mB03O6cco>i1 zQ9Opn@dTd4Q+OKB;8{F}=kWqw#7lS?ui#a@hS%{1f8N9#Z{clRMuK;6f_L#A-p2>{ z5Fg=Ve1cE$89v7qe1R|V6~4wd_!i&c6yM_q{D`Z#hU>V2o4AFaa2t1UhM#d4zu+Ez z#c%i>f8bC2h5Ps$0t=*&P{^Q>gRsO31xgrLtOwD$BGZu3ajVRdgkRItnnszXP+2ou zx-Pdye@jOjiZd$ITy0ZTL|LU&Nk&Gkpp_FwPjb?E!K<0=gsF2{*o@Ob<~(eq6{m71 zf*lu^Vyc~yjN6c~M_W=2@0o$*6T`E6XVHO85=$%9T2xFY)Lg?LVPhS4*5iUyMU&E6 zbH5;?g4(*;+1Q`slAU$oqQ6iQNnvwFPQsm!e~o6+Mt7VVrL{E2b*}i3Z5-Fzd2)GF zH=-J4wps;S5}lx^QKD=)4(r^}j?8%L?;e!gQQh9Zu7wBA!?nzYw{Dyc@7z6&N>Qz( zZOv#|TQeI%>F9r0&S? zxD9{wBq#e&H8ibREe7~6+rtK$n%phIG`F@^i6_u79bvgLi3{J;nO0Gtwrg88V<}dG zLT>MM3jNQ9RM_Rp=z_+X^FkOuKF<1ve|kq_?zp4#+Plnl>;Tp!+A#MmF9x)gi*xH5 zM|1W@wCNQ#Nz^hkS&240WMUp%=1R*>iu~0*ddPP1ng)BH1m3SwOg#FUyj>)DSN1pR z>pkQ3p}(&P_E(L(Z+xFgR@ioaoo7Bxb72qT4*VE8ihL`d8dE8>&nnFxWg)$*DlcS? qPt2vzee8~#{hzVp!6>BJ}=cIitfn84UgbpN@b)0001OFrKLZ diff --git a/web/src/assets/icon-font/iconfont.woff2 b/web/src/assets/icon-font/iconfont.woff2 index 09818b06ed3cf0c79a2ccd10ca5dc4980d2bcccd..16588279e54159311264e1c2347af37433ac8adf 100644 GIT binary patch literal 17328 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 bCh{B6FrzA|h+6@vY$xCYP!$>50RR91&1r_l literal 17068 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 byHF9uPL=c*MFO6(y?}Q>^-6yn0RR91Jg;a6 diff --git a/web/src/config/en.js b/web/src/config/en.js index dae1310f..1f3a3755 100644 --- a/web/src/config/en.js +++ b/web/src/config/en.js @@ -444,6 +444,11 @@ export const sidebarTriggerList = [ value: 'setting', icon: 'iconshezhi' }, + { + name: 'AI', + value: 'ai', + icon: 'iconAIshengcheng' + }, { name: 'ShortcutKey', value: 'shortcutKey', diff --git a/web/src/config/zh.js b/web/src/config/zh.js index 75793ad9..3813a5e4 100644 --- a/web/src/config/zh.js +++ b/web/src/config/zh.js @@ -534,6 +534,11 @@ export const sidebarTriggerList = [ value: 'outline', icon: 'iconfuhao-dagangshu' }, + { + name: 'AI', + value: 'ai', + icon: 'iconAIshengcheng' + }, { name: '设置', value: 'setting', diff --git a/web/src/config/zhtw.js b/web/src/config/zhtw.js index 56dff3d1..106441f7 100644 --- a/web/src/config/zhtw.js +++ b/web/src/config/zhtw.js @@ -439,6 +439,11 @@ export const sidebarTriggerList = [ value: 'outline', icon: 'iconfuhao-dagangshu' }, + { + name: 'AI', + value: 'ai', + icon: 'iconAIshengcheng' + }, { name: '設置', value: 'setting', diff --git a/web/src/lang/en_us.js b/web/src/lang/en_us.js index fbabd0cf..6d856a22 100644 --- a/web/src/lang/en_us.js +++ b/web/src/lang/en_us.js @@ -134,7 +134,8 @@ export default { expandNodeChild: 'Expand all sub nodes', unExpandNodeChild: 'Un expand all sub nodes', addToDo: 'Add toDo', - removeToDo: 'Remove toDo' + removeToDo: 'Remove toDo', + aiCreate: 'AI Continuation' }, count: { words: 'Words', @@ -329,7 +330,8 @@ export default { newFileTip: 'Please export the currently edited file before creating a new one, Beware of content loss', openFileTip: - 'Please export the currently edited file before opening it, Beware of content loss' + 'Please export the currently edited file before opening it, Beware of content loss', + ai: 'AI' }, edit: { newFeatureNoticeTitle: 'New feature reminder', diff --git a/web/src/lang/zh_cn.js b/web/src/lang/zh_cn.js index d4b58234..9262cb13 100644 --- a/web/src/lang/zh_cn.js +++ b/web/src/lang/zh_cn.js @@ -133,7 +133,8 @@ export default { expandNodeChild: '展开所有下级节点', unExpandNodeChild: '收起所有下级节点', addToDo: '添加待办', - removeToDo: '删除待办' + removeToDo: '删除待办', + aiCreate: 'AI续写' }, count: { words: '字数', @@ -323,7 +324,8 @@ export default { creatingTip: '正在创建文件', directory: '目录', newFileTip: '新建文件前请先导出当前编辑的文件,谨防内容丢失', - openFileTip: '打开文件前请先导出当前编辑的文件,谨防内容丢失' + openFileTip: '打开文件前请先导出当前编辑的文件,谨防内容丢失', + ai: 'AI' }, edit: { newFeatureNoticeTitle: '新特性提醒', @@ -412,5 +414,8 @@ export default { nodeTagStyle: { placeholder: '请输入标签内容', delete: '删除此标签' + }, + ai: { + chatTitle: 'AI对话' } } diff --git a/web/src/lang/zh_tw.js b/web/src/lang/zh_tw.js index a22f76d8..2bb41eb2 100644 --- a/web/src/lang/zh_tw.js +++ b/web/src/lang/zh_tw.js @@ -134,7 +134,8 @@ export default { expandNodeChild: '展開所有下級節點', unExpandNodeChild: '收起所有下級節點', addToDo: '添加待辦', - removeToDo: '刪除待辦' + removeToDo: '刪除待辦', + aiCreate: 'AI續寫' }, count: { words: '字數', @@ -323,7 +324,8 @@ export default { creatingTip: '正在建立檔案', directory: '目錄', newFileTip: '新增檔案前,請先匯出目前編輯的檔案,以免內容遺失', - openFileTip: '開啟檔案前,請先匯出目前編輯的檔案,以免內容遺失' + openFileTip: '開啟檔案前,請先匯出目前編輯的檔案,以免內容遺失', + ai: 'AI' }, edit: { newFeatureNoticeTitle: '新功能提醒', diff --git a/web/src/main.js b/web/src/main.js index 22261c40..cbdb93bd 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -35,4 +35,3 @@ if (window.takeOverApp) { } else { initApp() } - diff --git a/web/src/pages/Edit/components/AiChat.vue b/web/src/pages/Edit/components/AiChat.vue new file mode 100644 index 00000000..f1ad934d --- /dev/null +++ b/web/src/pages/Edit/components/AiChat.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/web/src/pages/Edit/components/AiConfigDialog.vue b/web/src/pages/Edit/components/AiConfigDialog.vue new file mode 100644 index 00000000..d9a53de6 --- /dev/null +++ b/web/src/pages/Edit/components/AiConfigDialog.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/web/src/pages/Edit/components/AiCreate.vue b/web/src/pages/Edit/components/AiCreate.vue new file mode 100644 index 00000000..c84054f4 --- /dev/null +++ b/web/src/pages/Edit/components/AiCreate.vue @@ -0,0 +1,546 @@ + + + + + diff --git a/web/src/pages/Edit/components/BaseStyle.vue b/web/src/pages/Edit/components/BaseStyle.vue index 59a107fc..7d3c72fe 100644 --- a/web/src/pages/Edit/components/BaseStyle.vue +++ b/web/src/pages/Edit/components/BaseStyle.vue @@ -995,8 +995,6 @@ export default { this.$bus.$off('setData', this.onSetData) }, methods: { - ...mapMutations(['setLocalConfig']), - onSetData() { if (this.activeSidebar !== 'baseStyle') return setTimeout(() => { diff --git a/web/src/pages/Edit/components/Contextmenu.vue b/web/src/pages/Edit/components/Contextmenu.vue index 02efa1eb..c5046e41 100644 --- a/web/src/pages/Edit/components/Contextmenu.vue +++ b/web/src/pages/Edit/components/Contextmenu.vue @@ -140,6 +140,10 @@

{{ $t('contextmenu.exportNodeToPng') }}
+
+
+ {{ $t('contextmenu.aiCreate') }} +
@@ -299,6 +310,11 @@ export default { // 设置标记 onSetAnnotation(...args) { this.$bus.$emit('execCommand', 'SET_NOTATION', this.activeNodes, ...args) + }, + + // AI生成整体 + aiCrate() { + this.$bus.$emit('ai_create_all') } } } @@ -376,6 +392,7 @@ export default { .text { margin-top: 3px; + text-align: center; } } diff --git a/web/src/store.js b/web/src/store.js index 3c99fedb..ff2e0f79 100644 --- a/web/src/store.js +++ b/web/src/store.js @@ -38,7 +38,14 @@ const store = new Vuex.Store({ supportCheckbox: false, // 是否支持Checkbox插件 supportLineFlow: false, // 是否支持LineFlow插件 supportMomentum: false, // 是否支持Momentum插件 - isDragOutlineTreeNode: false // 当前是否正在拖拽大纲树的节点 + isDragOutlineTreeNode: false, // 当前是否正在拖拽大纲树的节点 + aiConfig: { + api: 'http://ark.cn-beijing.volces.com/api/v3/chat/completions', + key: '', + model: '', + port: 3456, + method: 'POST' + } }, mutations: { // 设置思维导图数据 @@ -53,11 +60,18 @@ const store = new Vuex.Store({ // 设置本地配置 setLocalConfig(state, data) { - state.localConfig = { + const aiConfigKeys = Object.keys(state.aiConfig) + Object.keys(data).forEach(key => { + if (aiConfigKeys.includes(key)) { + state.aiConfig[key] = data[key] + } else { + state.localConfig[key] = data[key] + } + }) + storeLocalConfig({ ...state.localConfig, - ...data - } - storeLocalConfig(state.localConfig) + ...state.aiConfig + }) }, // 设置当前显示的侧边栏 diff --git a/web/src/utils/ai.js b/web/src/utils/ai.js new file mode 100644 index 00000000..2f3156ea --- /dev/null +++ b/web/src/utils/ai.js @@ -0,0 +1,120 @@ +class Ai { + constructor(options = {}) { + this.options = options + + this.baseData = {} + this.controller = null + this.currentChunk = '' + this.content = '' + } + + init(type = 'huoshan', options = {}) { + // 火山引擎接口 + if (type === 'huoshan') { + this.baseData = { + api: options.api, + method: options.method, + headers: { + Authorization: 'Bearer ' + options.key + }, + data: { + model: options.model, + stream: true + } + } + } + } + + async request(data, progress = () => {}, end = () => {}, err = () => {}) { + try { + const res = await this.postMsg(data) + const decoder = new TextDecoder() + while (1) { + const { done, value } = await res.read() + if (done) { + return + } + // 拿到当前切片的数据 + const text = decoder.decode(value) + // 处理切片数据 + let chunk = this.handleChunkData(text) + // 判断是否有不完整切片,如果有,合并下一次处理,没有则获取数据 + if (this.currentChunk) continue + let isEnd = false + const list = chunk + .split('\n') + .filter(item => { + isEnd = item.includes('[DONE]') + return !!item && !isEnd + }) + .map(item => { + return JSON.parse(item.replace(/^data:/, '')) + }) + list.forEach(item => { + this.content += item.choices + .map(item2 => { + return item2.delta.content + }) + .join('') + }) + progress(this.content) + if (isEnd) { + end(this.content) + } + } + } catch (error) { + console.log(error) + // 手动停止请求不需要触发错误回调 + if (!(error && error.name === 'AbortError')) { + err(error) + } + } + } + + async postMsg(data) { + this.controller = new AbortController() + const res = await fetch(`http://localhost:${this.options.port}/ai/chat`, { + signal: this.controller.signal, + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + ...this.baseData, + data: { + ...this.baseData.data, + ...data + } + }) + }) + if (res.status && res.status !== 200) { + return false + } + return res.body.getReader() + } + + handleChunkData(chunk) { + chunk = chunk.trim() + // 如果存在上一个切片 + if (this.currentChunk) { + chunk = this.currentChunk + chunk + this.currentChunk = '' + } + // 如果存在done,认为是完整切片且是最后一个切片 + if (chunk.includes('[DONE]')) { + return chunk + } + // 最后一个字符串不为},则默认切片不完整,保存与下次拼接使用(这种方法不严谨,但已经能解决大部分场景的问题) + if (chunk[chunk.length - 1] !== '}') { + this.currentChunk = chunk + } + return chunk + } + + stop() { + this.controller.abort() + this.controller = new AbortController() + } +} + +export default Ai